Как создать многопоточный список в CakePHP? - PullRequest
0 голосов
/ 27 февраля 2010

Я создаю таблицу: id, name, thread_id Основной поток имеет thread_id = 0, но у его потомков есть theard_id = id родителя, и как это лучшее и простое решение для создания списка с потомками, и выглядит так:

  1. Категория 1
    Продукт 1
    Продукт 2
  2. Категория 2
    Продукт 3
    и т.д ...

Может быть, у вас есть лучшее решение для такого списка?

Извините, за мой английский:)

Ответы [ 5 ]

2 голосов
/ 27 февраля 2010

Я подозреваю, что самым простым способом может быть использование собственной TreeBehavior Cake. Подробнее об этом на http://book.cakephp.org/view/91/Tree. Я никогда не использовал это лично, но слышал хорошие вещи. Он должен предоставить все необходимые инструменты (и инструкции).

1 голос
/ 27 февраля 2010

Один из самых простых и эффективных способов - использовать поведение дерева, предложенное kicaj-pl. Но я предлагаю вам рассмотреть MultiTree Behavior . Он также использует модель базы данных с вложенным деревом, но позволяет вам создавать множество деревьев с разными root_id и независимыми левыми и правыми значениями (поэтому обновление одного дерева не обновляет другое).

0 голосов
/ 12 октября 2014

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>
0 голосов
/ 11 марта 2010

Попробуйте логику MPPT для этого. Для этого вам нужно 3 поля в таблице базы данных, а именно parent_id, lft, rght. И чтобы реализовать это с помощью CakePHP, CakePHP уже предоставил для этого функцию для этого, пожалуйста, обратитесь http://book.cakephp.org/view/228/Basic-Usage:)

0 голосов
/ 27 февраля 2010

Ах! Я нашел это предложение: когда вы используете find ('threadaded'), вы должны указать поле 'parent_id' для создания структуры, такой как дерево ... Все отлично работает!

Спасибо за ответы, пока!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...