我创建表:id,name,thread_id 主要线程有thread_id = 0,但是他们的子节点有父的theard_id = id,以及如何用子节点创建列表的最佳和最简单的解决方案,如下所示:
也许你有更好的解决方案来获得这样的清单?
对不起,我的英文:)
答案 0 :(得分:2)
我怀疑最简单的方法是使用Cake自己的TreeBehavior
。更多关于http://book.cakephp.org/view/91/Tree的信息。我从来没有亲自使用它,但听过好东西。它应该提供您需要的所有工具(和指令)。
答案 1 :(得分:1)
最简单有效的方法之一就是使用kicaj-pl提出的Tree行为。 但我建议你考虑MultiTree Behavior。它还使用嵌套树数据库模型,但允许您创建具有不同root_id和独立左右值的多个树(因此更新一棵树不会更新任何其他树)。
答案 2 :(得分:0)
啊!我发现了这句话:当你使用find('threaded')时,你必须将'parent_id'字段用于创建像树一样的结构...... 一切正常!
感谢您的回复,再见!
答案 3 :(得分:0)
尝试使用MPPT逻辑。为此,您需要在数据库表中使用3个字段,即parent_id,lft,rght。为了使用CakePHP实现它,CakePHP已经提供了它的功能,请参考http://book.cakephp.org/view/228/Basic-Usage:)
答案 4 :(得分:0)
1.首先,您的模型必须使用" Tree"模型文件中的行为(Modelname.php - 在我的例子中是Post.php)
public $actsAs = array('Tree');
2.接下来你需要检索线程结果并将它们传递给视图(ModelnamesController.php - 在我的例子中是PostsController.php)。
$posts = $this->Post->find('threaded');
$this->set('posts', $posts);
3.最后,这里是您可以使用的模板,为上述结果呈现无限螺纹列表
<div id="posts_navi">
<? function renderPosts($postsArray, $tmpModel){
//set return for the first time
if(!isset($return)){ $return = ""; }
$return .= '<ul>';
//create list
foreach ($postsArray as $post){
$return .= '<li>';
if($post['Post']['content'] != null){
$return .= $tmpModel->link($post['Post']['title'], array('action' => 'view', $post['Post']['id']),array('escape'=>false));
}else{
$return .= $post['Post']['title'];
}
//if post has children, go deeper
if(!empty($post['children'])){
$return .= renderPosts($post['children'], $tmpModel);
}
$return .= '</li>';
}
$return .= '</ul>';
return $return;
} ?>
<? $tmpModel = $this->Html; // we have to pass html helper inside, I am not sure it this is best way but it works
echo renderPosts($posts, $tmpModel); //finally, we render the $result returned. ?>
</div>