デフォルトの製品を関連製品リストに追加する方法


7

特定のIDのデフォルト製品(例-1、5、7、3)を関連製品のリストに追加したいのですが、常に製品ページの最後にすべての製品があり、データベースに保存する必要はありません。方法これらを関連する製品コレクションと一緒にmagentoに追加します

回答:


5

のオブザーバーを記述して、コレクションが関連製品コレクションである場合はcatalog_product_collection_load_after、ロードされたコレクションに製品を追加できます。

use Mage_Catalog_Model_Product as Product;
use Mage_Catalog_Model_Product_Link as RelatedProduct;
use Mage_Catalog_Model_Resource_Product_Link_Product_Collection as RelatedProductCollection;

class IntegerNet_AutoRelated_Model_Observer
{
    /**
     * @see event catalog_product_collection_load_after
     * @param Varien_Event_Observer $observer
     * @throws Mage_Core_Exception
     */
    public function addToRelatedCollection(Varien_Event_Observer $observer)
    {
        $collection = $observer->getCollection();
        if ($collection instanceof RelatedProductCollection
            && $collection->getLinkModel()->getLinkTypeId() === RelatedProduct::LINK_TYPE_RELATED
        ) {
            $this->addItems($collection);
        }
    }

    protected function addItems(RelatedProductCollection $collection)
    {
        /** @var Mage_Catalog_Model_Resource_Product_Collection $productsToAdd */
        $productsToAdd = Mage::getResourceModel('catalog/product_collection');
        $productsToAdd
            ->addStoreFilter()
            ->addIdFilter(array_diff([1,5,7,3], [$collection->getProduct()->getId()], $collection->getAllIds()))
            ->setVisibility(Mage::getSingleton('catalog/product_visibility')->getVisibleInCatalogIds());
            ->addMinimalPrice()
            ->addFinalPrice()
            ->addTaxPercents()
            ->setPageSize($numberOfItems)
            ->addAttributeToSelect(Mage::getSingleton('catalog/config')->getProductAttributes())
            ->addUrlRewrite();
        foreach ($productsToAdd as $product) {
            $collection->addItem($product);
        }
    }
}

私が強調したいいくつかの部分:

->addIdFilter(array_diff([1,5,7,3], [$collection->getProduct()->getId()], $collection->getAllIds()))

これにより、商品[1,5,7,3]が読み込まれますが、商品自体と、手動で関連商品として既に定義されている商品は除外されます。そうしないと、コレクションの重複が原因でエラーが発生します。これらのハードコードされたIDを構成に移動したい場合があります。

->addMinimalPrice()
->addFinalPrice()
->addTaxPercents()
->addAttributeToSelect(Mage::getSingleton('catalog/config')->getProductAttributes())
->addUrlRewrite();

これは、価格、製品リンク、および「製品リストで使用」として構成された属性を表示するために必要なデータをロードするための製品コレクションを準備しますが、それ以上は準備しません。

これは、view.phtmlのカテゴリIDによる製品リストの取得で説明されている私のAutoUpsellモジュールと非常によく似たソリューションです。コードのほとんどをそこから少し変更してコピーしました。


5

これは、カスタムオブザーバーメソッドを使用して行うことができます。そのためには、イベントでオブザーバーの関数を呼び出しますcatalog_product_save_after

これにより、管理パネルから商品を保存する際に、関連商品が割り当てられているかどうかを確認できます。

関連製品がない場合は、プログラムで関連製品を(製品IDで)割り当てることができます。

関連製品を割り当てる製品のIDが2で、関連IDが1、5、7、3であるとします。

次に:

$product = Mage::getModel('catalog/product')->load(2);
if($product)
{
    $sRelatedIds = '1,5,7,3';
    $aRelatedIds = explode(',', $sRelatedIds);
    $aParams = array();
    $nRelatedCounter = 1;

    foreach($aRelatedIds as $id)
    {
        $aRelatedProduct = Mage::getModel('catalog/product')->load($id);
        $aParams[$aRelatedProduct['entity_id']] = array('position' => $nRelatedCounter);
        $nRelatedCounter++;
    }

    $product->setRelatedLinkData($aParams);
    $product->save();
}

ご不明な点がございましたらお知らせください。


私は、データベースに格納する必要はありません私の店ですべての製品に、常に関連製品の一部を追加する必要がありますが
真野

デフォルトの関連製品をデータベースではなくプログラムで製品ページに追加したいだけなので、\ app \ code \ core \ Mage \ Catalog \ Block \ Product \ List \ Related.phpにあるファイルを見てデフォルトを追加しますコレクションで、そのコレクションで製品を追加するにはどうすればよいですか?
mano

申し訳ありませんが、最後のコメントで何を言いたいのか理解できませんでした。
Mohit Kumar Arora 2016

ストア内のすべての商品に関連して、id 1,5,7,3の商品を追加したいだけです。データベースに保存したくありません。
mano

-2

で新しいファイルを作成\app\code\local\Mage\Catalog\Block\Product\List\Related.phpしてメソッドを探し、以下のコードに置き換えます。

protected function _prepareData()
{
    $product = Mage::registry('product');
    /* @var $product Mage_Catalog_Model_Product */

    $this->_itemCollection = $product->getRelatedProductCollection()
        ->addAttributeToSelect('required_options')
        ->setPositionOrder()
        ->addStoreFilter();

    foreach ($this->_itemCollection as $product) {
        $productIds1[] = $product->getId();   // here we are getting the product ids of related products of current product.
    }

    $productIds = [1, 5, 7, 3];    // here you can set product id you want to show by default in all products.
    $productscoll1 = Mage::getModel('catalog/product')->getCollection()
        ->addAttributeToFilter('entity_id', ['in' => $productIds]);

    $productscoll1->getSelect()->order("find_in_set(entity_id,'" . implode(',', $productIds) . "')");

    $productscoll2 = Mage::getModel('catalog/product')->getCollection()
        ->addAttributeToFilter('entity_id', ['in' => $productIds1]);
    $productscoll2->getSelect()->order("find_in_set(entity_id,'" . implode(',', $productIds) . "')");

    // print_r($productscoll1->getAllIds());
    // print_r($productscoll2->getAllIds());

    $merged_ids = array_merge($productscoll1->getAllIds(), $productscoll2->getAllIds());   // here we merge both collection ids.
    // can sometimes use "getLoadedIds()" as well

    //print_r($merged_ids);
    //exit;

    $this->_itemCollection = Mage::getModel('catalog/product')->getCollection()
        ->addAttributeToFilter('entity_id', ['in' => $merged_ids]);

    // In this we set collection with default products merge with related products

    if (Mage::helper('catalog')->isModuleEnabled('Mage_Checkout')) {
        Mage::getResourceSingleton('checkout/cart')->addExcludeProductFilter($this->_itemCollection,
            Mage::getSingleton('checkout/session')->getQuoteId()
        );
        $this->_addProductAttributesAndPrices($this->_itemCollection);
    }
    //        Mage::getSingleton('catalog/product_status')->addSaleableFilterToCollection($this->_itemCollection);
    Mage::getSingleton('catalog/product_visibility')->addVisibleInCatalogFilterToCollection($this->_itemCollection);

    $this->_itemCollection->load();

    foreach ($this->_itemCollection as $product) {
        $product->setDoNotUseCategoryId(true);
    }

    return $this;
}

各ステージにコメントを追加して、それがどのように機能するかを理解できるようにしてください。
mano

1
また、ファイルをパス「\ app \ code \ local \ Mage \ Catalog \ Block \ Product \ List \ Related.php」にコピーして、magentoのアップグレード時に変更が削除されないようにします。
Chirag Rajput

1
magentoのコアファイルを直接変更しないでください。magentoのアップグレード中の問題を防ぐために、コアmagentoファイルをオーバーライドすることを常にお勧めします。
Mohit Kumar Arora 2016

1
クラスの書き換えは有効な方法です(ただし、必須ではありません)が、コレクション全体を3回ロードするので、パフォーマンスの面からはお勧めできません。次の方法で$ids = array_merge([1,3,5,7], $product->getRelatedProductCollection()->getAllIds());単一のロードを実行すると改善される可能性がありますaddIdFilter($ids)
Fabian Schmengler '27

1
実際には、3つのロードではなく2つ、さらに2つのIDのクエリが追加されています。最初の(暗黙の)ロード:foreach ($this->_itemCollection、IDの2つのクエリ:array_merge($productscoll1->getAllIds(), $productscoll2->getAllIds()); 、2番目のロード:$this->_itemCollection->load();です。上記の私の提案では、1つのIDクエリと1つのコレクションロードにそれを半分にします
Fabian Schmengler
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.