2

CakePHP 2 の場合

製品のカテゴリを一覧表示するカテゴリ メニューを作成したいと考えています。3段階のメニューです。メニューの各カテゴリは、それに属するすべての製品を一覧表示するページを開くリンクです。そのため、カテゴリが親カテゴリである場合は、子カテゴリ (2 つのサブレベル) に含まれるすべての製品を一覧表示する必要があります。また、カテゴリが子供の場合は、それに属する製品のリスト ページにリンクする必要があります。

そうは言っても、これが私がこれまでに行ったことです。

次の列を使用して、cake の規則に従ってカテゴリ テーブルを作成しました。

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 は見つかりましたが、使い方がわかりません >>> Github の TreeHelper

ただし、css クラスを追加できるようにして、カテゴリのツリー メニューを制御したいと考えています。このヘルパーが私にこの構造を提供できると思うなら、それで問題ありません。しかし、私はそれを使用する方法がわかりません。言うまでもなく、私は CakePHP を初めて使用します :( でも、素晴らしいツールなので学びたいと思っています。

DB について何か忘れてしまいました。このシステムを機能させるには、テーブルに他の列を追加する必要がありますか?それともそのままで問題ありませんか?

最後に、このカテゴリ/製品の動的ツリー メニューに関する 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

これが簡単な解決策です。インデックスビューのコントローラーで使用されます。$posts後で、各as$postおよびの for each ループで 2 つずつ使用します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);
于 2014-02-02T01:43:55.047 に答える