OpenWrt - LuCI - LUA - Загрузка заказа контроллера - PullRequest
0 голосов
/ 20 марта 2019

У меня вопрос по LUA / LuCI.Я хочу добавить mymodule в конце индексную таблицу в функцию createindex .

В этом коде:

local controllers = { }
    local base = "%s/controller/" % util.libpath()
    local _, path

    for path in (fs.glob("%s*.lua" % base) or function() end) do
        controllers[#controllers+1] = path
    end

    for path in (fs.glob("%s*/*.lua" % base) or function() end) do
        controllers[#controllers+1] = path
    end

Он просматривает в этих каталогах файлы lua и заполняет контроллер таблицу, затем в этом коде:

index = {}

    for _, path in ipairs(controllers) do
        local modname = "luci.controller." .. path:sub(#base+1, #path-4):gsub("/", ".")
        local mod = require(modname)
        assert(mod ~= true,
               "Invalid controller file found\n" ..
               "The file '" .. path .. "' contains an invalid module line.\n" ..
               "Please verify whether the module name is set to '" .. modname ..
               "' - It must correspond to the file path!")

        local idx = mod.index
        assert(type(idx) == "function",
               "Invalid controller file found\n" ..
               "The file '" .. path .. "' contains no index() function.\n" ..
               "Please make sure that the controller contains a valid " ..
               "index function and verify the spelling!")

        index[modname] = idx
    end

Требуются модули в правильном порядке (если я печатаю modname внутри цикла):

luci.controller.firewall
luci.controller.opkg
luci.controller.admin.filebrowser
luci.controller.admin.index
luci.controller.admin.network
luci.controller.admin.status
luci.controller.admin.system
luci.controller.admin.uci
luci.controller.myapp.mymodule

но он устанавливает таблицу index , используя строки для ключей (например, "luci.controller.admin.index").

ПРОБЛЕМА Если я напечатаю индексную таблицу в цикле, это будет результат:

1: {"luci.controller.firewall":null}
2: {"luci.controller.firewall":null,"luci.controller.opkg":null}
3: {"luci.controller.firewall":null,"luci.controller.admin.filebrowser":null,"luci.controller.opkg":null}
4: {"luci.controller.firewall":null,"luci.controller.admin.index":null,"luci.controller.admin.filebrowser":null,"luci.controller.opkg":null}
5: {"luci.controller.firewall":null,"luci.controller.admin.index":null,"luci.controller.opkg":null,"luci.controller.admin.filebrowser":null,"luci.controller.admin.network":null}
6: {"luci.controller.firewall":null,"luci.controller.admin.index":null,"luci.controller.opkg":null,"luci.controller.admin.status":null,"luci.controller.admin.filebrowser":null,"luci.controller.admin.network":null}
7: {"luci.controller.firewall":null,"luci.controller.admin.index":null,"luci.controller.opkg":null,"luci.controller.admin.status":null,"luci.controller.admin.system":null,"luci.controller.admin.filebrowser":null,"luci.controller.admin.network":null}
8: {"luci.controller.firewall":null,"luci.controller.admin.index":null,"luci.controller.admin.uci":null,"luci.controller.opkg":null,"luci.controller.admin.status":null,"luci.controller.admin.system":null,"luci.controller.admin.filebrowser":null,"luci.controller.admin.network":null}
9: {"luci.controller.admin.uci":null,"luci.controller.admin.system":null,"luci.controller.myapp.mymodule":null,"luci.controller.firewall":null,"luci.controller.admin.index":null,"luci.controller.admin.network":null,"luci.controller.opkg":null,"luci.controller.admin.filebrowser":null,"luci.controller.admin.status":null}

Почему ??Почему он это делает?

Я хочу вставить mymodule на последнюю позицию, но я бы не стал менять dispatcher.lua (я ожидаю, что он поддерживаетпорядок вставки)

** * ОБНОВЛЕНИЕ * **

Я обнаружил, что если я изменю имя на mymodule и переместу его в нужную папку(например, luci.controller.admin.test или luci.controller.aa), мой модуль будет загружен последним.

Это escamotage, но я хотел бы знать, какие критерии использует Lua

...