如何在CakePHP中创建线程列表?

时间:2010-02-27 17:33:15

标签: list cakephp multithreading

我创建表:id,name,thread_id 主要线程有thread_id = 0,但是他们的子节点有父的theard_id = id,以及如何用子节点创建列表的最佳和最简单的解决方案,如下所示:

  1. 第1类 产品1
    产品2
  2. 第2类 产品3
    等...
  3. 也许你有更好的解决方案来获得这样的清单?

    对不起,我的英文:)

5 个答案:

答案 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>