Php 基于敏捷工具箱的递归树绘制

Php 基于敏捷工具箱的递归树绘制,php,recursion,atk4,Php,Recursion,Atk4,我有以下情况。我有一个具有以下属性的模型a: id int 名称varchar(255) 父对象id int(参考同一型号A) 现在,我需要使用ModelA渲染树视图。当然,我可以加载所有数据,按父id正确排序,然后使用传统的字符串粘贴“渲染”。e、 g class Model_A extends Model_Table { ... function render_branch($nodes, $parent){ if (!isset($nodes[$parent])){

我有以下情况。我有一个具有以下属性的模型a: id int 名称varchar(255) 父对象id int(参考同一型号A)

现在,我需要使用ModelA渲染树视图。当然,我可以加载所有数据,按父id正确排序,然后使用传统的字符串粘贴“渲染”。e、 g

class Model_A extends Model_Table {
...

function render_branch($nodes, $parent){
    if (!isset($nodes[$parent])){
        return null;
    }
    $out = "<ul>";
    foreach ($nodes[$parent] as $node){
        $out .= "<li>" . $node["name"];
        $out .= $this->render_branch($nodes, $node["id"]);
        $out .= "</li>";
    }
    return $out;
}

function init(){
    parent::init();
    $nodes = array(); // preload from db and arrange so that key = parent and content is array of childs
    $this->template->set("tree", $this->render_branch($nodes, 0));
}

}
类模型扩展了模型表{
...
函数render_分支($nodes,$parent){
如果(!isset($nodes[$parent])){
返回null;
}
$out=“
    ”; foreach($nodes[$parent]作为$node){ $out.=“
  • ”$node[“name”]; $out.=$this->render_分支($nodes,$node[“id”]); $out.=“
  • ”; } 退回$out; } 函数init(){ 父::init(); $nodes=array();//从数据库预加载并排列,以便key=parent和content是child的数组 $this->template->set(“树”,$this->render_分支($nodes,0)); } }
现在,我想使用atk4本机lister/smlite模板解析器来实现这一目的。但是,如果您尝试这样做,那么您最终会遇到讨厌的lister,在format行中,您无论如何都会尝试用其他lister的输出替换特定的标记,事实上,您必须进行销毁以避免运行时内存溢出

有什么建议吗

p、 美国。 上面的代码没有经过测试,只是显示了概念


谢谢

根据Jancha的评论


好吧,在花了一些时间考虑可能的选择之后,我发现 在这种情况下,最简单的方法就是使用上面提到的例子。 使其更原生的唯一方法是使用外部模板 节点并使用smite和clone region+render将html移动到 模板。除此之外,使用传统的lister似乎并不合适 要有足够的效率。那么,在K4的家伙们,接下来是查询树视图 插件和创建适当的后端!那会很酷。谢谢,j


.

好的,时机已经成熟,并且已经创建了合适的附加组件。要使用它,请更新您的附加组件和atk4,并按照本文了解如何使用它


好的,在花了一些时间讨论可能的选项之后,我发现在这个特殊情况下使用上述示例更容易。使其更原生的唯一方法是对节点使用外部模板,并使用smite和clone region+render将html移到模板之外。除此之外,使用传统的lister似乎效率不够。所以,atk4的家伙们,继续使用查询树视图插件并创建合适的后端!那会很酷。谢谢,j。请在下面添加您的解决方案作为答案并接受它。这将标记您的问题已解决。非常感谢。我不会接受我上面所说的,因为这不是一个解决方案。当有一个适当的集成解决方案时,我将用适当的更新更新这个问题。到目前为止,我们可以假设这个问题没有内置的解决方案