* CBI updates
This commit is contained in:
parent
93c55f3c5d
commit
ef01ff75db
8 changed files with 71 additions and 19 deletions
|
@ -104,6 +104,26 @@ function Map.__init__(self, config, ...)
|
|||
self.template = "cbi/map"
|
||||
end
|
||||
|
||||
function Map.parse(self)
|
||||
self.ucidata = ffluci.model.uci.show(self.config)
|
||||
if not self.ucidata then
|
||||
error("Unable to read UCI data: " .. self.config)
|
||||
else
|
||||
self.ucidata = self.ucidata[self.config]
|
||||
end
|
||||
Node.parse(self)
|
||||
end
|
||||
|
||||
function Map.render(self)
|
||||
self.ucidata = ffluci.model.uci.show(self.config)
|
||||
if not self.ucidata then
|
||||
error("Unable to read UCI data: " .. self.config)
|
||||
else
|
||||
self.ucidata = self.ucidata[self.config]
|
||||
end
|
||||
Node.render(self)
|
||||
end
|
||||
|
||||
function Map.section(self, class, ...)
|
||||
if instanceof(class, AbstractSection) then
|
||||
local obj = class(...)
|
||||
|
@ -116,11 +136,6 @@ function Map.section(self, class, ...)
|
|||
end
|
||||
end
|
||||
|
||||
function Map.read(self)
|
||||
self.ucidata = self.ucidata or ffluci.model.uci.show(self.config)[self.config]
|
||||
return self.ucidata
|
||||
end
|
||||
|
||||
--[[
|
||||
AbstractSection
|
||||
]]--
|
||||
|
@ -181,6 +196,15 @@ function TypedSection.__init__(self, ...)
|
|||
self.valid = nil
|
||||
end
|
||||
|
||||
function TypedSection.parse(self)
|
||||
for k, v in pairs(self:ucisections()) do
|
||||
for i, node in ipairs(self.children) do
|
||||
node.section = k
|
||||
node:parse()
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
function TypedSection.render_children(self, section)
|
||||
for k, node in ipairs(self.children) do
|
||||
node.section = section
|
||||
|
@ -190,7 +214,7 @@ end
|
|||
|
||||
function TypedSection.ucisections(self)
|
||||
local sections = {}
|
||||
for k, v in pairs(self.map:read()) do
|
||||
for k, v in pairs(self.map.ucidata) do
|
||||
if v[".type"] == self.sectiontype then
|
||||
sections[k] = v
|
||||
end
|
||||
|
@ -217,14 +241,20 @@ function AbstractValue.__init__(self, option, ...)
|
|||
self.default = nil
|
||||
end
|
||||
|
||||
|
||||
function AbstractValue.formvalue(self)
|
||||
local key = "uci."..self.map.config.."."..self.section.."."..self.option
|
||||
local key = "cbid."..self.map.config.."."..self.section.."."..self.option
|
||||
return ffluci.http.formvalue(key)
|
||||
end
|
||||
|
||||
function AbstractValue.parse(self)
|
||||
local fvalue = self:validate(self:formvalue())
|
||||
if fvalue and not (fvalue == self:ucivalue()) then
|
||||
self:write(fvalue)
|
||||
end
|
||||
end
|
||||
|
||||
function AbstractValue.ucivalue(self)
|
||||
return self.map:read()[self.section][self.option]
|
||||
return self.map.ucidata[self.section][self.option]
|
||||
end
|
||||
|
||||
function AbstractValue.validate(self, value)
|
||||
|
@ -232,7 +262,7 @@ function AbstractValue.validate(self, value)
|
|||
end
|
||||
|
||||
function AbstractValue.write(self, value)
|
||||
ffluci.model.uci.set(self.config, self.section, self.option, value)
|
||||
return ffluci.model.uci.set(self.config, self.section, self.option, value)
|
||||
end
|
||||
|
||||
|
||||
|
|
|
@ -116,7 +116,7 @@ end
|
|||
function error500(message)
|
||||
ffluci.http.status(500, "Internal Server Error")
|
||||
|
||||
if not pcall(ffluci.template.render, "error500") then
|
||||
if not pcall(ffluci.template.render, "error500", {message=message}) then
|
||||
ffluci.http.textheader()
|
||||
print(message)
|
||||
end
|
||||
|
@ -171,8 +171,13 @@ function cbi(request)
|
|||
|
||||
i18n.loadc(request.module)
|
||||
|
||||
stat, map = pcall(cbi.load, path)
|
||||
local stat, map = pcall(cbi.load, path)
|
||||
if stat then
|
||||
local stat, err = pcall(map.parse, map)
|
||||
if not stat then
|
||||
disp.error500(err)
|
||||
return
|
||||
end
|
||||
tmpl.render("cbi/header")
|
||||
map:render()
|
||||
tmpl.render("cbi/footer")
|
||||
|
@ -202,8 +207,13 @@ function dynamic(request)
|
|||
return
|
||||
end
|
||||
|
||||
stat, map = pcall(cbi.load, path)
|
||||
local stat, map = pcall(cbi.load, path)
|
||||
if stat then
|
||||
local stat, err = pcall(map.parse, map)
|
||||
if not stat then
|
||||
disp.error500(err)
|
||||
return
|
||||
end
|
||||
tmpl.render("cbi/header")
|
||||
map:render()
|
||||
tmpl.render("cbi/footer")
|
||||
|
|
|
@ -28,6 +28,13 @@ module("ffluci.fs", package.seeall)
|
|||
|
||||
require("lfs")
|
||||
|
||||
-- Checks whether a file exists
|
||||
function isfile(filename)
|
||||
local fp = io.open(path, "r")
|
||||
if file then file:close() end
|
||||
return file ~= nil
|
||||
end
|
||||
|
||||
-- Returns the content of file
|
||||
function readfile(filename)
|
||||
local fp = io.open(filename)
|
||||
|
|
|
@ -161,7 +161,7 @@ function validate(value, cast_number, cast_int, valid)
|
|||
if type(valid) == "function" then
|
||||
value = valid(value)
|
||||
elseif type(valid) == "table" then
|
||||
if not ffluci.util.contains(valid, value) then
|
||||
if not contains(valid, value) then
|
||||
value = nil
|
||||
end
|
||||
end
|
||||
|
|
|
@ -1,2 +1,3 @@
|
|||
<input type="submit" /> <input type="reset" />
|
||||
</form>
|
||||
<%+footer%>
|
|
@ -4,5 +4,4 @@
|
|||
<br />
|
||||
<% self:render_children() %>
|
||||
<br />
|
||||
<input type="submit" /> <input type="reset" />
|
||||
</div>
|
||||
|
|
5
src/ffluci/view/error500.htm
Normal file
5
src/ffluci/view/error500.htm
Normal file
|
@ -0,0 +1,5 @@
|
|||
<%+header%>
|
||||
<h1>500 Internal Server Error</h1>
|
||||
<p>Sorry, the server encountered an unexpected error.</p>
|
||||
<tt><%=message%></tt>
|
||||
<%+footer%>
|
|
@ -9,10 +9,10 @@ require("ffluci.http").htmlheader()
|
|||
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
|
||||
<html xmlns="http://www.w3.org/1999/xhtml">
|
||||
<head>
|
||||
<link rel="stylesheet" type="text/css" href="<%=media%>/cascade.css" />
|
||||
<link rel="stylesheet" type="text/css" href="<%=media%>/css/<%=req.category%>_<%=req.module%>.css" />
|
||||
<title>FFLuCI</title>
|
||||
<% if addheaders then write(addheaders) end %>
|
||||
<link rel="stylesheet" type="text/css" href="<%=media%>/cascade.css" />
|
||||
<link rel="stylesheet" type="text/css" href="<%=media%>/css/<%=req.category%>_<%=req.module%>.css" />
|
||||
<link rel="stylesheet" type="text/css" href="<%=media%>/css/<%=req.category%>_<%=req.module%>/<%=req.action%>.css" />
|
||||
<title>FFLuCI</title>
|
||||
</head>
|
||||
<body>
|
||||
<div id="header">
|
||||
|
|
Loading…
Reference in a new issue