X-Git-Url: https://git.archive.openwrt.org/?p=project%2Fluci.git;a=blobdiff_plain;f=libs%2Fcbi%2Fluasrc%2Fcbi.lua;h=879717acfdb3aad15b2f5239cb8057378fd5fb3e;hp=6e08455655f12e09f6c79dc100985775c083f6bd;hb=ced11a4a1372516894b8a2f29c159b1f03b0bfd9;hpb=d12dfa5186f83fdb25ddbadfe2077f40115ce820 diff --git a/libs/cbi/luasrc/cbi.lua b/libs/cbi/luasrc/cbi.lua index 6e0845565..879717acf 100644 --- a/libs/cbi/luasrc/cbi.lua +++ b/libs/cbi/luasrc/cbi.lua @@ -57,14 +57,16 @@ function load(cbimap) luci.util.extfenv(func, "translate", luci.i18n.translate) luci.util.extfenv(func, "translatef", luci.i18n.translatef) - local map = func() + local maps = {func()} - if not instanceof(map, Map) then - error("CBI map returns no valid map object!") - return nil + for i, map in ipairs(maps) do + if not instanceof(map, Map) then + error("CBI map returns no valid map object!") + return nil + end end - return map + return maps end -- Node pseudo abstract class @@ -212,6 +214,7 @@ function AbstractSection.__init__(self, map, sectiontype, ...) self.map = map self.config = map.config self.optionals = {} + self.defaults = {} self.optional = true self.addremove = false @@ -301,7 +304,21 @@ end -- Creates the section function AbstractSection.create(self, section) - return self.map:set(section, nil, self.sectiontype) + local stat = self.map:set(section, nil, self.sectiontype) + + if stat then + for k,v in pairs(self.children) do + if v.default then + self.map:set(section, v.option, v.default) + end + end + + for k,v in pairs(self.defaults) do + self.map:set(section, k, v) + end + end + + return stat end @@ -314,7 +331,7 @@ NamedSection = class(AbstractSection) function NamedSection.__init__(self, map, section, type, ...) AbstractSection.__init__(self, map, type, ...) Node._i18n(self, map.config, section, nil, ...) - + self.template = "cbi/nsection" self.section = section self.addremove = false @@ -376,7 +393,7 @@ function TypedSection.cfgsections(self) function (section) if self:checkscope(section[".name"]) then table.insert(sections, section[".name"]) - end + end end) return sections @@ -384,17 +401,8 @@ end -- Creates a new section of this type with the given name (or anonymous) function TypedSection.create(self, name) - if name then - self.map:set(name, nil, self.sectiontype) - else - name = self.map:add(self.sectiontype) - end - - for k,v in pairs(self.children) do - if v.default then - self.map:set(name, v.option, v.default) - end - end + name = name or self.map:add(self.sectiontype) + AbstractSection.create(self, name) end -- Limits scope to sections that have certain option => value pairs @@ -552,7 +560,25 @@ function AbstractValue.render(self, s, scope) if not self.optional or self:cfgvalue(s) or self:formcreated(s) then scope = scope or {} scope.section = s - + scope.cbid = "cbid." .. self.config .. + "." .. s .. + "." .. self.option + + scope.ifattr = function(cond,key,val) + if cond then + return string.format( + ' %s="%s"', tostring(key), + tostring( val or scope[key] or self[key] or "" ) + ) + else + return '' + end + end + + scope.attr = function(...) + return scope.ifattr( true, ... ) + end + Node.render(self, scope) end end @@ -729,7 +755,7 @@ function MultiValue.valuelist(self, section) end function MultiValue.validate(self, val) - val = (type(val) == "table") and val or {val} + val = (type(val) == "table") and val or {val} local result