Add posibility to pass args to called-functions in dispatcher
[project/luci.git] / libs / web / luasrc / dispatcher.lua
index 5a9a0c6..d58987a 100644 (file)
@@ -163,7 +163,7 @@ function dispatch(request)
        -- Init template engine
        if (c and c.index) or not track.notemplate then
                local tpl = require("luci.template")
-               local media = luci.config.main.mediaurlbase
+               local media = track.mediaurlbase or luci.config.main.mediaurlbase
                if not pcall(tpl.Template, "themes/%s/header" % fs.basename(media)) then
                        media = nil
                        for name, theme in pairs(luci.config.themes) do
@@ -469,7 +469,13 @@ end
 -- @param      ...             Additional parameters passed to the function
 function call(name, ...)
        local argv = {...}
-       return function() return getfenv()[name](unpack(argv)) end
+       return function(...)
+               if #argv > 0 then 
+                       return getfenv()[name](unpack(argv), ...)
+               else
+                       return getfenv()[name](...)
+               end
+       end
 end
 
 --- Create a template render dispatching target.
@@ -487,13 +493,20 @@ function cbi(model)
        return function(...)
                require("luci.cbi")
                require("luci.template")
+               local http = require "luci.http"
 
                maps = luci.cbi.load(model, ...)
 
+               local state = nil
+
                for i, res in ipairs(maps) do
-                       res:parse()
+                       local cstate = res:parse()
+                       if not state or cstate < state then
+                               state = cstate
+                       end
                end
 
+               http.header("X-CBI-State", state or 0)
                luci.template.render("cbi/header")
                for i, res in ipairs(maps) do
                        res:render()
@@ -508,13 +521,20 @@ function form(model)
        return function(...)
                require("luci.cbi")
                require("luci.template")
+               local http = require "luci.http"
 
                maps = luci.cbi.load(model, ...)
 
+               local state = nil
+
                for i, res in ipairs(maps) do
-                       res:parse()
+                       local cstate = res:parse()
+                       if not state or cstate < state then
+                               state = cstate
+                       end
                end
 
+               http.header("X-CBI-State", state or 0)
                luci.template.render("header")
                for i, res in ipairs(maps) do
                        res:render()