CakePHP 2动态树类别菜单

时间:2013-02-15 09:23:59

标签: cakephp cakephp-2.x

对于CakePHP 2

我想创建一个类别菜单,列出我的产品类别。这是一个3级菜单。菜单中的每个类别都是一个链接,用于打开列出属于它的所有产品的页面。因此,如果该类别是父类别,则应列出子项中包含的所有产品,即2个子级别。此外,如果该类别是儿童,则应链接到属于该类别的产品的列表页面。

话虽如此,这就是我到目前为止所做的。

我根据cake的约定创建了我的类别表,其中包含以下列:

ID - PARENT_ID - LFT - rght - 名称

然后是我的产品表:

ID - 名字 - 蛞蝓 - 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但我不知道如何使用它&gt;&gt;&gt; TreeHelper from Github

但是,我想通过添加css类来控制我的类别树菜单。如果你认为这个帮手可以为我提供这种结构,那就没关系了。但我不知道如何使用它。更不用说我是CakePHP的新手:(但我想学习它,因为它是一个很棒的工具。

我忘记了我的数据库,我是否必须在表格中添加任何其他列以使该系统正常工作或者它是否正确?

最后,因为我没有找到关于这个类别/产品动态树菜单的CakePHP 2的任何内容,我将在Github上共享整个代码,以便它可以帮助许多其他人。

2 个答案:

答案 0 :(得分:0)

好的。 假设您使用我的updated version

// 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']));

答案 1 :(得分:0)

这是一个简单的解决方案,用于索引视图的控制器。稍后您将每个$posts的每个循环用作$postforeach $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);