2

对于 CakePHP 2

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

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

我根据 cake 的约定使用以下列创建了类别表:

id--parent_id--lft--rght--name

然后是我的产品表:

id--名称--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 但我不知道如何使用它 >>>来自 Github 的 TreeHelper

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

我忘记了一些关于我的数据库的事情,我是否必须在我的表中添加任何其他列才能使这个系统正常工作,或者它是否正确?

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

4

2 回答 2

0

好的。假设您使用我的更新版本

// 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']));
于 2013-02-15T11:49:24.523 回答
0

这是一个简单的解决方案,在控制器中用于索引视图。稍后,您为每个$postsas$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);
于 2014-02-02T01:43:55.047 回答