0

自動車部品を販売するサイトを運営しています。カテゴリを Make -> Model -> Year に設定しました。ここから、フィルタリングは属性によって行われます。ブレーキ、ホイール、エンジンなど…</p>

これにより、期待どおりにコレクションがフィルター処理されますが、年に到達したら、ユニバーサル カテゴリのアイテムも含めたいと思います。IE コレクションには、特定の車のアイテムに加えて、すべての車の「ユニバーサル」アイテムを含める必要があります。

この Magento を見つけました: 2 つの製品コレクションを 1 つにマージする方法は? これは私が望んでいるようですが、これをどこに実装する必要があるか正確にはわかりません。

List.php、Layer.php、および Category.php には getCollection() メソッドがあり、上記のリンクのコードを実装しようとしましたが、成功しませんでした。List.php に含めると、コレクションはマージされているように見えますが、Universal 製品では属性フィルタリングが適用されません。

次のように、Category.php の getProductCollection 関数を編集してみました。

public function getProductCollection()
{
    $collection = Mage::getResourceModel('catalog/product_collection')
        ->setStoreId($this->getStoreId())
        ->addCategoryFilter($this);
    //return $collection;

    $universalCollection = Mage::getModel('catalog/category')->load(18)->getProductCollection();

    $merged_ids = array_merge($collection->getAllIds(), $universalCollection->getAllIds());
    // can sometimes use "getLoadedIds()" as well

    $merged_collection = Mage::getResourceModel('catalog/product_collection')
        ->addFieldToFilter('entity_id', $merged_ids)
        ->addAttributeToSelect('*');

    return $merged_collection;
} 

しかし、これは私に:「致命的なエラー:「200」の最大関数ネストレベルに達しました、中止します!」

誰かがアドバイスを与えることができれば、それは大歓迎です。

4

1 に答える 1

1

You are getting a fatal error because you are causing an infinite loop to occur.

This is simply due to the fact that your code sits inside the Category model getProductCollection() method and you are calling getProductCollection() on a new category model again. This is resulting in an infinite loop

So, you need to move that code out of there. You really should not be editing these core files the way you are currently anyway.

Its entirely up to you how you extend the model: rewrite, observer etc. But just dont change the Magento core code.

I have provided an working example below which merges two category product collections, externally to the category model:

    $storeId = Mage::app()->getStore()->getId();
    $categoryOneId = 10;
    $categoryTwoId = 13;

    $categoryOne = Mage::getModel('catalog/category')->load($categoryOneId);
    $categoryTwo = Mage::getModel('catalog/category')->load($categoryTwoId);

    $collectionOne = Mage::getModel('catalog/product')->getCollection()
        ->setStoreId($storeId)
        ->addCategoryFilter($categoryOne);

    $collectionTwo = Mage::getModel('catalog/product')->getCollection()
        ->setStoreId($storeId)
        ->addCategoryFilter($categoryTwo);

    $merged_ids = array_merge($collectionOne->getAllIds(), $collectionTwo->getAllIds());

    $mergedCollection = Mage::getModel('catalog/product')->getCollection()
        ->addFieldToFilter('entity_id', $merged_ids);
于 2012-06-05T20:29:37.830 に答える