2010-02-27 6 views
0

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

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

Возможно, у вас есть лучшее решение для такого списка?

К сожалению, за мой английский :)

ответ

2

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

+0

Я знаю это, и я, но дерево Поведение на неограниченное количество уровней, но , Я хочу создать самое простейшее дерево, только с двумя уровнями (родителями и дочерними). Поведение дерева в этот момент будет «слишком большим» :) Я знаю, что есть в CakePHP find ('threaded'), но я не могу этого понять ... – kicaj

+0

Похоже, что вы можете после этого: http://book.cakephp.org/view/812/find-threaded. Я не знаю деталей, но он, похоже, использует гибрид моделей вложенных наборов и смежности. –

1

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

0

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

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

0

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

0

1. Сначала ваша модель должна использовать поведение «Дерево» в файле модели (Modelname.php - в моем случае Post. PHP)

public $actsAs = array('Tree'); 

2.Next вам нужно получить резьбовые результаты и передать их в представление (ModelnamesController.php - в моем случае PostsController.php).

$posts = $this->Post->find('threaded'); 
    $this->set('posts', $posts); 

3.Finally, вот шаблон, который можно использовать, что делает бесконечно резьбовой список для приведенных выше результатов

<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> 
Смежные вопросы