OpenWrt Forum Archive

Topic: parsing template(.htm) in luci

The content of this topic has been archived on 25 Apr 2018. There are no obvious gaps in this topic, but there may still be some posts missing at the end.

Hi

totally newbie for openwrt, need help smile

with reference to below link able to add the menu with sub tabs.

http://wiki.openwrt.org/doc/devel/luci

     entry({"admin", "new_tab"}, firstchild(), "New tab", 30).dependent=false 
     entry({"admin", "new_tab", "tab_from_cbi"}, cbi("myapp-mymodule/cbi_tab"), "CBI Tab", 1) 
     entry({"admin", "new_tab", "tab_from_view"}, template("myapp-mymodule/view_tab"), "View Tab", 2)

Once added this code with no efforts getting displayed the tab(new_tab) in web GUI.

added view_tab.htm in the desired folder structure (<luci-path>/luci-myapplication/view/myapp-mymodule/view_tab.htm)

view_tab.htm contains default of my application header and footer.  ( <%+header%><%+footer%> )

Once I click on the view_tab under menu.. throwing the error in dispatcher.lua like below :

/usr/lib/lua/luci/dispatcher.lua:449: Failed to execute template dispatcher target for entry '/admin/new_tab/tab_from_view'.
The called action terminated with an exception:
/usr/lib/lua/luci/template.lua:81: Failed to load template 'myapp/view_tab'.
Error while parsing template '/usr/lib/lua/luci/view/myapp/view_tab.htm'.
A syntax error occured near 'write("
\n")'.
stack traceback:
    [C]: in function 'assert'
    /usr/lib/lua/luci/dispatcher.lua:449: in function 'dispatch'
    /usr/lib/lua/luci/dispatcher.lua:195: in function </usr/lib/lua/luci/dispatcher.lua:194>




I guess simply adding the template and giving entry wont enough to get display the template in web GUI.
pelase help me out here how to parse the template in lua application.... able to add .lua template in the desired reference link failed in .htm ):

What you did is right so far, the stacktrace above indicates a problem with the template source, like an unclosed <% tag or a syntax error in one of the enclosed Lua code blocks. Can you attach the template source here?

jow wrote:

What you did is right so far, the stacktrace above indicates a problem with the template source, like an unclosed <% tag or a syntax error in one of the enclosed Lua code blocks. Can you attach the template source here?

attached source files.
view_tab.htm

 
<%+header%>
<%+footer%>



header.htm

 

<%
    local sys  = require "luci.sys"
    local http = require "luci.http"
    local disp = require "luci.dispatcher"

    local hostname = sys.hostname()
    local load1, load5, load15 = sys.loadavg()

    local request  = disp.context.path
    local request2 = disp.context.request

    local category = request[1]
    local cattree  = category and disp.node(category)

    local leaf = request2[#request2]

    local tree = disp.node()
    local node = disp.context.dispatched

    local categories = disp.node_childs(tree)

    local c = tree
    local i, r

    -- tag all nodes leading to this page
    for i, r in ipairs(request) do
        if c.nodes and c.nodes[r] then
            c = c.nodes[r]
            c._menu_selected = true
        end
    end

    http.prepare_content("application/xhtml+xml")

    local function nodeurl(prefix, name, query)
        local url = controller .. prefix .. name .. "/"
        if query then
            url = url .. http.build_querystring(query)
        end
        return pcdata(url)
    end

    local function subtree(prefix, node, level)
        if not level then
            level = 1
        end

        local childs = disp.node_childs(node)
        if #childs > 0 then
%>
    <div class="tabmenu<%=level%>">
    
    <ul class="tabmenu l<%=level%>">
    
        <%
            local selected_node
            local selected_name
            local i, v

            for i, v in ipairs(childs) do
                local nnode = node.nodes[v]
                if nnode._menu_selected then
                    selected_node = nnode
                    selected_name = v
                end
        %>
            <li class="tabmenu-item-<%=v%><% if nnode._menu_selected or (node.leaf and v == leaf) then %> active<% end %>">
                <a href="<%=nodeurl(prefix, v, nnode.query)%>"><%=striptags(translate(nnode.title))%></a>
            </li>
        <%
            end
        %>
    </ul>

    <br style="clear:both" />
    <div class="basictitle">Advanced settings</div>
<%
            if selected_node then
                subtree(prefix .. selected_name .. "/", selected_node, level + 1)
            end
%>
    </div>
<%
        end
    end
-%>

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="<%=luci.i18n.context.lang%>" lang="<%=luci.i18n.context.lang%>">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<meta http-equiv="Content-Script-Type" content="text/javascript" />
<link rel="stylesheet" type="text/css" media="screen" href="<%=media%>/cascade.css" />
<!--[if IE 6]><link rel="stylesheet" type="text/css" media="screen" href="<%=media%>/ie6.css" /><![endif]-->
<!--[if IE 7]><link rel="stylesheet" type="text/css" media="screen" href="<%=media%>/ie7.css" /><![endif]-->
<!--[if IE 8]><link rel="stylesheet" type="text/css" media="screen" href="<%=media%>/ie8.css" /><![endif]-->
<% if node and node.css then %><link rel="stylesheet" type="text/css" media="screen" href="<%=resource%>/<%=node.css%>" />
<% end -%>
<script type="text/javascript" src="<%=resource%>/xhr.js"></script>
<title><%=striptags( hostname .. ( (node and node.title) and ' - ' .. translate(node.title) or '')) %> - LuCI</title>
</head>
<body class="lang_<%=luci.i18n.context.lang%>">

<p class="skiplink">
<span id="skiplink1"><a href="#navigation"><%:Skip to navigation%></a></span>
<span id="skiplink2"><a href="#content"><%:Skip to content%></a></span>
</p>

<div id="menubar">
<h2 class="navigation"><a id="navigation" name="navigation"><%:Navigation%></a></h2>

<div class="hostinfo">
    <%=hostname%> | <%=luci.version.distversion%> |
    <%:Load%>: <%="%.2f" % load1%> <%="%.2f" % load5%> <%="%.2f" % load15%>
    <span id="xhr_poll_status" style="display:none" onclick="XHR.running() ? XHR.halt() : XHR.run()">
        | <%:Auto Refresh%>:
        <span id="xhr_poll_status_on"><%:on%></span>
        <span id="xhr_poll_status_off" style="display:none"><%:off%></span>
    </span>
</div>

<% if #categories > 1 then %>
    <ul id="modemenu">
        <% for i, r in ipairs(categories) do %>
            <li><a<% if request[1] == r then %> class="active"<%end%> href="<%=controller%>/<%=r%>/"><%=striptags(translate(tree.nodes[r].title))%></a></li>
        <% end %>
    </ul>
<% end %>

<%
if tree.nodes[category] and tree.nodes[category].ucidata then
    local ucic = 0
    for i, j in pairs(require("luci.model.uci").cursor():changes()) do
        for k, l in pairs(j) do
            for m, n in pairs(l) do
                ucic = ucic + 1;
            end
        end
    end
-%>
<div id="savemenu">
    <% if ucic > 0 then %>
        <a class="warning" href="<%=controller%>/<%=category%>/uci/changes/?redir=<%=luci.http.urlencode(luci.http.formvalue("redir") or REQUEST_URI)%>"><%:Unsaved Changes%>: <%=ucic%></a>
    <%- else -%>
        <a href="#"><%:Changes%>: 0</a>
    <% end -%>
</div><% end %>

<div class="clear"></div>
</div>

<div id="maincontainer">
    <div id="tabmenu">
        <% if category then subtree("/" .. category .. "/", cattree) end %>
    </div>

    <div id="maincontent">
        <noscript>
            <div class="errorbox">
                <strong><%:Java Script required!%></strong><br />
                <%:You must enable Java Script in your browser or LuCI will not work properly.%>
            </div>
        </noscript>

        <%- if luci.sys.user.getuser("root") and not luci.sys.user.getpasswd("root") then -%>
        
        
        <div class="errorbox">
            <strong><%:No password set!%></strong><br />
            <%:There is no password set on this router. Please configure a root password to protect the web interface and enable SSH.%><br />
            <a href="<%=pcdata(luci.dispatcher.build_url("admin/system/admin"))%>"><%:Go to password configuration...%></a>
        </div>
        <%- end -%>


footer.htm

 

<%#
LuCI - Lua Configuration Interface
Copyright 2008 Steven Barth <steven@midlink.org>
Copyright 2008 Jo-Philipp Wich <xm@leipzig.freifunk.net>

Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at

    http://www.apache.org/licenses/LICENSE-2.0

$Id: footer.htm 7364 2011-08-13 09:52:12Z jow $

-%>
<div class="clear"></div>
</div>
</div>

<p class="luci">Powered by <%= luci.__appname__ .. " (" .. luci.__version__ .. ")" %></p>
</body>
</html>

error code

/usr/lib/lua/luci/dispatcher.lua:449: Failed to execute template dispatcher target for entry '/admin/new_tab/tab_from_view'.
The called action terminated with an exception:
/usr/lib/lua/luci/template.lua:81: Failed to load template 'myapp/view_tab'.
Error while parsing template '/usr/lib/lua/luci/view/myapp/view_tab.htm'.
A syntax error occured near 'write("
\n")'.
stack traceback:
    [C]: in function 'assert'
    /usr/lib/lua/luci/dispatcher.lua:449: in function 'dispatch'
    /usr/lib/lua/luci/dispatcher.lua:195: in function </usr/lib/lua/luci/dispatcher.lua:194>

Make sure your template uses Unix, not DOS/Windows newlines

jow wrote:

Make sure your template uses Unix, not DOS/Windows newlines


Tats works with charming smile
thanks for help

need another help how to find way to add href links to custom navigation.

Able to redirect my custom home page with custom navigation on pageload (.../cgi-bin/luci), here need to give direct links to template ( ex: index.htm , minildna.htm..etc ) to my custom menu, if I try to give direct links like below unable to load the template...between it was asking for authentication and then redirecting to the path given

 <a title="" id="myid" href="/admin_status/index.htm"></a>

The discussion might have continued from here.