Php 基于敏捷工具箱的递归树绘制
我有以下情况。我有一个具有以下属性的模型a: id int 名称varchar(255) 父对象id int(参考同一型号A) 现在,我需要使用ModelA渲染树视图。当然,我可以加载所有数据,按父id正确排序,然后使用传统的字符串粘贴“渲染”。e、 gPhp 基于敏捷工具箱的递归树绘制,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])){
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。请在下面添加您的解决方案作为答案并接受它。这将标记您的问题已解决。非常感谢。我不会接受我上面所说的,因为这不是一个解决方案。当有一个适当的集成解决方案时,我将用适当的更新更新这个问题。到目前为止,我们可以假设这个问题没有内置的解决方案