Меню категорий динамического дерева CakePHP 2

Для CakePHP 2

Я хотел бы создать меню категорий, в котором будут перечислены категории моих продуктов. Это 3-х уровневое меню. Каждая категория в меню — это ссылка, которая открывает страницу со списком всех продуктов, которые к ней относятся. Итак, если категория является родительской, в ней должны быть перечислены все продукты, содержащиеся в дочерних 2 подуровнях. Кроме того, если категория является дочерней, она должна ссылаться на страницу со списком продуктов, которые ей принадлежат.

С учетом сказанного, вот что я сделал до сих пор.

Я создал таблицу категорий в соответствии с правилами торта со следующими столбцами:

id--parent_id--lft--rght--имя

Затем таблица моих продуктов:

id--name--slug--category_id

Теперь модель Category.php:

    <?php
class Category extends AppModel {

    public $name = 'Category';

    public $actsAs = array('Tree');

    public $belongsTo = array(
        'ParentCategory' => array(
            'className' => 'Category',
            'foreignKey' => 'parent_id',
            'conditions' => '',
            'fields' => '',
            'order' => ''
            )
        );

    public $hasMany = array(
        'ChildCategory' => array(
            'className' => 'Category',
            'foreignKey' => 'parent_id',
            'dependent' => false,
            'conditions' => '',
            'fields' => '',
            'order' => '',
            'limit' => '',
            'offset' => '',
            'exclusive' => '',
            'finderQuery' => '',
            'counterQuery' => ''
            )
        );
}

Я использую ProductsController для отображения меню категорий, потому что это страница, которая будет содержать это меню категорий:

    <?php
class ProductsController extends AppController{

    public $uses = array('Product');

    public function index(){ 
       $this->layout = 'products';
       $this->loadModel('Category'); 
       $this->set('data',$this->Category->generateTreeList()); 
    }
}

и мое представление index.ctp:

<?php debug($categories); ?>

Теперь я хотел бы создать вложенное меню ul-li из моих категорий, которые ссылаются на страницу продуктов, которым они принадлежат в соответствии с деревом.

<ul class="ulclass">
    <li class="liclass"><a href="category">category</a></li>
</ul>

Я проверил только этот вид учебника, к сожалению, я не нашел ничего вразумительного, я нашел TreeHelper, но понятия не имею, как его использовать >>> TreeHelper из Github

Тем не менее, я хотел бы иметь контроль над древовидным меню моей категории, имея возможность добавлять классы CSS. Если вы думаете, что этот помощник может предоставить мне эту конструкцию, тогда все в порядке. Но я понятия не имею, как его использовать. И не говоря уже о том, что я новичок в CakePHP :( но я хочу изучить его, потому что это отличный инструмент.

Я что-то забыл о своей БД, мне нужно добавить какой-либо другой столбец в мои таблицы, чтобы эта система работала, или это правильно?

И последнее, поскольку я ничего не нашел для CakePHP 2 об этом динамическом древовидном меню категорий/продуктов, я поделюсь всем кодом на Github, чтобы он мог помочь многим другим.


person Julian Livin' in China    schedule 15.02.2013    source источник
comment
Если бы вы подождали еще несколько дней, я как раз собирался написать учебник/статью о том, как работать с деревьями в торте, а также о моей улучшенной версии помощника по дереву :) Здесь вам нужно использовать элементы или обратные вызовы (я предпочитаю первое).   -  person mark    schedule 15.02.2013
comment
Привет Марк, выглядит действительно здорово! Прямо сейчас я действительно застрял в этой проблеме, поэтому, думаю, у меня нет другого выбора, кроме как ждать :) Тем не менее, не могли бы вы дать какой-нибудь совет относительно моей системы, чтобы я мог продолжать пытаться что-то из нее?   -  person Julian Livin' in China    schedule 15.02.2013
comment
Как и было обещано, с дополнительной документацией: dereuromark.de/2013 /02/17/cakephp-and-tree-structures   -  person mark    schedule 18.02.2013
comment
Большое спасибо, Марк, я собираюсь прочитать это прямо сейчас! В очередной раз благодарим за помощь.   -  person Julian Livin' in China    schedule 19.02.2013


Ответы (2)


Хорошо. Предположим, вы используете мою обновленную версию:

// in your controller
$categories = $this->Model->children($id);
// or
$categories = $this->Model->find('threaded', array(...));

Затем передайте его в представление.

// in your view ctp
$categories = Hash::nest($categories); // optional, if you used find(all) instead of find(threaded) or children()

$treeOptions = array('id' => 'main-navigation', 'model' => 'Category', 'treePath' => $treePath, 'hideUnrelated' => true, 'element' => 'node', 'autoPath' => array($currentCategory['Category']['lft'], $currentCategory['Category']['rght']));

echo $this->Tree->generate($categories, $treeOptions);

А вот пример элемента в /Elements/node.ctp:

$category = $data['Category'];
if (!$category['active'] || !empty($category['hide'])) { // You can do anything here depending on the record content
    return;
}
echo $this->Html->link($category['name'], array('action' => 'find', 'category_id' => $category['id']));
person mark    schedule 15.02.2013
comment
Спасибо, Марк, я попробую. У меня только один глупый вопрос, потому что я еще не очень хорошо знаю cakephp, первый код нужно поместить в контроллер? И я надеюсь, что это не слишком много, но что мне нужно, чтобы отобразить результат в виде списка ul-li? Большое спасибо за ваше время и вашу помощь! Да, и кстати, когда вы планируете разместить свой учебник в Интернете? - person Julian Livin' in China; 15.02.2013
comment
Я обновил свой ответ соответственно. Наверное, в это воскресенье. Но поскольку файлы уже подключены к сети: взгляните на тестовые примеры для помощника, чтобы получить дополнительную информацию о вышеуказанных параметрах и их использовании, а также ожидаемый результат для них. - person mark; 15.02.2013
comment
Хорошо, это здорово, с нетерпением жду встречи. Я был бы признателен, если бы вы могли держать меня на связи, когда это будет сделано;), просто оставьте еще один комментарий, я проверю тритон в ближайшие дни для него :) Еще раз спасибо за вашу помощь - person Julian Livin' in China; 15.02.2013

Вот простое решение, используемое в контроллере для представления индекса. Позже вы используете его по два для каждого цикла для каждого $posts как $post и foreach $post['Post']['children'].

$posts = $this->Post->find('all', array('conditions' => array('parent_id'=>null)));
    foreach ($posts as $postKey => $post) {
        $posts[$postKey]['Post']['children'] = $this->Post->find('all', array('conditions' => array('parent_id'=>$post['Post']['id'])));
    }         
    $this->set('posts', $posts);
person mate.gvo    schedule 02.02.2014