webmcp
view framework/env/ui/form.lua @ 6:5cba83b3f411
Version 1.0.6
Bugfix: class_prototype:add_reference{...} uses now qualified names in SQL queries to allow JOINs
Fixes in the documentation of slot.put_into and trace.debug
Bugfix: class_prototype:add_reference{...} uses now qualified names in SQL queries to allow JOINs
Fixes in the documentation of slot.put_into and trace.debug
| author | jbe/bsw | 
|---|---|
| date | Fri Jan 22 12:00:00 2010 +0100 (2010-01-22) | 
| parents | 9fdfb27f8e67 | 
| children | d76a8857ba62 | 
 line source
     1 --[[--
     2 ui.form{
     3   record    = record,     -- optional record to be used 
     4   read_only = read_only,  -- set to true, if form should be read-only (no submit button)
     5   external  = external,   -- external URL to be used as HTML form action
     6   module    = module,     -- module name to be used for HTML form action
     7   view      = view,       -- view name   to be used for HTML form action
     8   action    = action,     -- action name to be used for HTML form action
     9   routing = {
    10     default = {           -- default routing for called action
    11       mode   = mode,      -- "forward" or "redirect"
    12       module = module,    -- optional module name, defaults to current module
    13       view   = view,      -- view name
    14       id     = id,        -- optional id to be passed to the view
    15       params = params     -- optional params to be passed to the view
    16     },
    17     ok    = { ... },      -- routing when "ok"    is returned by the called action
    18     error = { ... },      -- routing when "error" is returned by the called action
    19     ...   = { ... }       -- routing when "..."   is returned by the called action
    20   }
    21   content = function()
    22     ...                   -- code creating the contents of the form
    23   end
    24 }
    26 This functions creates a web form, which encloses the content created by the given 'content' function. When a 'record' is given, ui.field.* helper functions will be able to automatically determine field values by using the given record. If 'read_only' is set to true, then a call of ui.submit{...} will be ignored, and ui.field.* helper functions will behave differently.
    28 --]]--
    30 function ui.form(args)
    31   local args = args or {}
    32   local slot_state = slot.get_state_table()
    33   local old_record   = slot_state.form_record
    34   local old_readonly = slot_state.form_readonly
    35   slot_state.form_record = args.record
    36   if args.readonly then
    37     slot_state.form_readonly = true
    38     ui.container{ attr = args.attr, content = args.content }
    39   else
    40     slot_state.form_readonly = false
    41     local params = table.new(args.params)
    42     local routing_default_given = false
    43     if args.routing then
    44       for status, settings in pairs(args.routing) do
    45         if status == "default" then
    46           routing_default_given = true
    47         end
    48         local module = settings.module or args.module or request.get_module()
    49         assert(settings.mode, "No mode specified in routing entry.")
    50         assert(settings.view, "No view specified in routing entry.")
    51         params["_webmcp_routing." .. status .. ".mode"]   = settings.mode
    52         params["_webmcp_routing." .. status .. ".module"] = module
    53         params["_webmcp_routing." .. status .. ".view"]   = settings.view
    54         params["_webmcp_routing." .. status .. ".id"]     = settings.id
    55         if settings.params then
    56           for key, value in pairs(settings.params) do
    57             params["_webmcp_routing." .. status .. ".params." .. key] = value
    58           end
    59         end
    60       end
    61     end
    62     if not routing_default_given then
    63       params["_webmcp_routing.default.mode"]   = "forward"
    64       params["_webmcp_routing.default.module"] = request.get_module()
    65       params["_webmcp_routing.default.view"]   = request.get_view()
    66     end
    67     params._webmcp_csrf_secret = request.get_csrf_secret()
    68     local attr = table.new(args.attr)
    69     attr.action = encode.url{
    70       external  = args.external,
    71       module    = args.module or request.get_module(),
    72       view      = args.view,
    73       action    = args.action,
    74     }
    75     attr.method = args.method and string.upper(args.method) or "POST"
    76     if slot_state.form_opened then
    77       error("Cannot open a non-readonly form inside a non-readonly form.")
    78     end
    79     slot_state.form_opened = true
    80     ui.tag {
    81       tag     = "form",
    82       attr    = attr,
    83       content = function()
    84         if args.id then
    85           ui.hidden_field{ name = "_webmcp_id", value = args.id }
    86         end
    87         for key, value in pairs(params) do
    88           ui.hidden_field{ name = key, value = value }
    89         end
    90         if args.content then
    91           args.content()
    92         end
    93       end
    94     }
    95     slot_state.form_opened = false
    96   end
    97   slot_state.form_readonly = old_readonly
    98   slot_state.form_record   = old_record
    99 end
