1

豊富なカタログ(10,000製品)とかなり深いカテゴリツリーを備えたMagentoサイトがあります。

製品のすべてのカテゴリは、トップレベルの「すべての製品」カテゴリに由来します。
すべての製品には、「ブランド」のドロップダウン属性があります。

私がやろうとしているのは、訪問者がカテゴリツリーの一番上から始めて、ブランドが選択されているかどうかに関係なく、[すべての製品]ツリーを下に移動できるようにすることです。問題は、各レベルで次のレベルのサブカテゴリを表示する必要があることです。ブランドが適用されない場合は、空のカテゴリを表示したくありません。

たとえば、ツリーがこのようになり、1つが「ドライバーページ」にある場合、タイプと長さの両方のカテゴリを表示する必要があります。

  1. すべての製品
    • スクリュードライバー
      • フィリップス
        • 2 "
        • 3 "
        • 5インチ
      • マゴチ
        • 1 "
        • 3 "
        • 5インチ

カテゴリコレクションを作成することで、ブランドフィルタを気にせずにこれを行うことができました。

    $_category  = $this->getCurrentCategory();
    $current_level = $_category->getLevel(); 
    $collection = $_category->getCollection(); 

    $collection->addAttributeToSelect('url_key')
                ->addAttributeToSelect('name')
                ->addAttributeToSelect('parent_id')
                ->addAttributeToFilter('is_active', 1)
                ->addAttributeToFilter('level',array('in'=>array($current_level+1,$current_level+2)))
                ->setOrder('position','ASC')
                ->load();

私の調査によると、カテゴリコレクションを商品属性で直接フィルタリングする ことはできないようです。

これが真実であると仮定すると、これ を達成するための最良の方法は何ですか?私はいくつかのアイデアを考え、事前に試しました。

  • ブランドでフィルタリングされた製品コレクションを作成し、それをループして、関連するすべてのカテゴリを取得し、ツリーを構築します(これはひどく非効率的であるように思われます)
  • 階層化されたナビゲーションを利用してカテゴリを出力してみてください(これは、1つのレベルのみを表示している場合に機能します。フィルタリングされた「2番目の」レベルを取得するのに問題があります)。
  • フィルタリングのアイデアを放棄し、新しい「ブランド別の参照」カテゴリの下にカテゴリツリーを複製します(製品を更新するために2つの複製ツリーを更新する必要がないように、これを避けたいと思います)。

助けてくれてありがとう。問題の説明が必要な場合はお知らせください。

4

1 に答える 1

5

誰かが将来同様の問題を抱えている場合に備えて、上記の2番目の箇条書きを使用してこれを達成しました。

/* Get Current Filters by loading catalog/layer_view Block */
        $layout = Mage::getSingleton('core/layout');
        $block  = $layout->createBlock('catalog/layer_view');           
/*  Get Current Category  */
        $_category  = $this->getCurrentCategory();
        $current_level = $_category->getLevel();
/*  Get Layer Filter Category Model  */
        $category_filter = Mage::getModel('catalog/layer_filter_category');
/*  Generate the collection based on the current category  */
        $categories = $_category->getCollection();
        $categories->addAttributeToSelect('url_key')
                    ->addAttributeToSelect('name')
                    ->addAttributeToSelect('parent_id')
                    ->addAttributeToSelect('thumbnail')
                    ->addAttributeToFilter('is_active', 1)
                    ->addAttributeToFilter('path', array('like'=>'%/'.$_category->getId().'/%'))
                    ->addAttributeToFilter('level',array('in'=>array($current_level+1,$current_level+2)))
                    ->setOrder('position','ASC')
                    ->load();

/*  Using current filters, add product counts to collection so we can hide categories with 0 products  */
        $category_filter->getLayer()->getProductCollection()
            ->addCountToCategories($categories);

この後、コレクションをループして、カテゴリの名前やURLなどを表示します。

これは絶対的な最善の方法ではないかもしれません-私は確かに他の解決策を歓迎します。

于 2013-01-04T16:52:18.377 に答える