X-Git-Url: https://git.archive.openwrt.org/?p=project%2Fluci.git;a=blobdiff_plain;f=libs%2Fcbi%2Fluasrc%2Fcbi.lua;h=6aec2fbbbc9caae17cfd2750fb433d55ec797f2d;hp=d6a5cca0562138039c3ca839aac9c32443594bd6;hb=8d1aff78b17d6f7437d776bdf53a6aa2112f31db;hpb=dd9606825da5d73883b8313f5af905ea1b2a4d7d diff --git a/libs/cbi/luasrc/cbi.lua b/libs/cbi/luasrc/cbi.lua index d6a5cca05..6aec2fbbb 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 @@ -173,7 +175,11 @@ end -- UCI set function Map.set(self, section, option, value) - return uci.set(self.config, section, option or value, option and value) + if option then + return uci.set(self.config, section, option, value) + else + return uci.set(self.config, section, value) + end end -- UCI del @@ -208,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 @@ -297,7 +304,28 @@ end -- Creates the section function AbstractSection.create(self, section) - return self.map:set(section, nil, self.sectiontype) + local stat + + if section then + stat = self.map:set(section, nil, self.sectiontype) + else + section = self.map:add(self.sectiontype) + stat = section + end + + 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 @@ -310,7 +338,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 @@ -328,10 +356,9 @@ function NamedSection.parse(self) return end else -- Create and apply default values - if luci.http.formvalue("cbi.cns."..path) and self:create(s) then - for k,v in pairs(self.children) do - v:write(s, v.default) - end + if luci.http.formvalue("cbi.cns."..path) then + self:create(s) + return end end end @@ -372,27 +399,12 @@ function TypedSection.cfgsections(self) function (section) if self:checkscope(section[".name"]) then table.insert(sections, section[".name"]) - end + end end) return sections 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 -end - -- Limits scope to sections that have certain option => value pairs function TypedSection.depends(self, option, value) table.insert(self.deps, {option=option, value=value}) @@ -548,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 @@ -579,9 +609,6 @@ end --[[ Value - A one-line value maxlength: The maximum length - isnumber: The value must be a valid (floating point) number - isinteger: The value must be a valid integer - ispositive: The value must be positive (and a number) ]]-- Value = class(AbstractValue) @@ -590,8 +617,6 @@ function Value.__init__(self, ...) self.template = "cbi/value" self.maxlength = nil - self.isnumber = false - self.isinteger = false end -- This validation is a bit more complex @@ -600,7 +625,7 @@ function Value.validate(self, val) val = nil end - return luci.util.validate(val, self.isnumber, self.isinteger) + return val end @@ -617,10 +642,6 @@ function DummyValue.parse(self) end -function DummyValue.render(self, s) - luci.template.render(self.template, {self=self, section=s}) -end - --[[ Flag - A flag being enabled or disabled @@ -730,21 +751,15 @@ function MultiValue.valuelist(self, section) end function MultiValue.validate(self, val) - if not(type(val) == "string") then - return nil - end + val = (type(val) == "table") and val or {val} - local result = "" + local result - for value in val:gmatch("[^\n]+") do + for i, value in ipairs(val) do if luci.util.contains(self.keylist, value) then - result = result .. self.delimiter .. value + result = result and (result .. self.delimiter .. value) or value end end - if result:len() > 0 then - return result:sub(self.delimiter:len() + 1) - else - return nil - end + return result end