Cách thêm sản phẩm mặc định vào danh sách sản phẩm liên quan


7

Tôi muốn thêm các sản phẩm mặc định của một số id nhất định (ví dụ: 1,5,7,3) để được thêm vào danh sách các sản phẩm liên quan luôn có tất cả các sản phẩm ở cuối trang sản phẩm và không cần lưu trữ trong cơ sở dữ liệu, làm thế nào để thêm những thứ này với bộ sưu tập sản phẩm liên quan trong magento

Câu trả lời:


5

Bạn có thể viết một người quan sát catalog_product_collection_load_after, sau đó thêm sản phẩm vào bộ sưu tập đã tải nếu bộ sưu tập là bộ sưu tập sản phẩm liên quan :

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);
        }
    }
}

Một số phần tôi muốn nêu bật:

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

Điều này tải các sản phẩm [1,5,7,3]nhưng loại trừ chính sản phẩm và các sản phẩm đã được xác định thủ công là các sản phẩm liên quan. Nếu không, chúng tôi sẽ nhận được một lỗi do trùng lặp trong bộ sưu tập. Bạn có thể muốn di chuyển các id mã hóa cứng này sang cấu hình.

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

Việc này chuẩn bị bộ sưu tập sản phẩm để tải dữ liệu cần thiết để hiển thị giá, liên kết sản phẩm và bất kỳ thuộc tính nào được định cấu hình là "được sử dụng trong danh sách sản phẩm", nhưng không nhiều hơn.

Đây là một giải pháp rất giống như trong mô-đun AutoUpsell của tôi được mô tả trong Nhận danh sách sản phẩm theo id danh mục trong view.phtml , tôi đã sao chép hầu hết mã từ đó với một chút sửa đổi.


5

Bạn có thể làm điều này với sự trợ giúp của một phương pháp quan sát tùy chỉnh. Để làm như vậy, hãy gọi chức năng quan sát viên của bạn tại sự kiện catalog_product_save_after.

Bằng cách sử dụng điều này, bất cứ khi nào một sản phẩm sẽ được lưu từ bảng quản trị, bạn có thể kiểm tra xem sản phẩm đó có được chỉ định sản phẩm liên quan hay không.

Nếu nó không có sản phẩm liên quan, thì bạn có thể gán các sản phẩm liên quan (theo id sản phẩm) theo chương trình.

Giả sử sản phẩm mà bạn muốn gán các sản phẩm liên quan có id 2 và id liên quan là 1,5,7 và 3.

Sau đó:

$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();
}

Hãy cho tôi biết nếu bạn có bất cứ thắc mắc nào.


Tôi cần thêm một số sản phẩm luôn có liên quan, vào tất cả các sản phẩm trong cửa hàng của tôi nhưng không cần lưu trữ trong cơ sở dữ liệu,
mano

Tôi chỉ muốn thêm các sản phẩm liên quan mặc định trong trang sản phẩm không lập trình với cơ sở dữ liệu, vì vậy tôi đang tìm tệp tại \ app \ code \ core \ Mage \ Catalog \ Block \ Product \ List \ Rel.php để thêm mặc định Với bộ sưu tập, làm thế nào để thêm sản phẩm với bộ sưu tập đó?
mano

Xin lỗi, nhưng tôi không thể hiểu bạn muốn nói gì trong bình luận cuối cùng của bạn?
Mohit Kumar Arora

Tôi chỉ muốn thêm các sản phẩm của id 1,5,7,3 liên quan đến tất cả các sản phẩm trong cửa hàng, tôi không muốn lưu trữ trong cơ sở dữ liệu.
mano

-2

Tạo tập tin mới \app\code\local\Mage\Catalog\Block\Product\List\Related.phpvà tìm phương thức và thay thế bằng mã dưới đây:

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;
}

bạn có thể thêm ý kiến ​​trong từng giai đoạn để chúng tôi có thể hiểu rằng nó hoạt động như thế nào.
mano

1
Đồng thời sao chép tệp vào đường dẫn "\ app \ code \ local \ Mage \ Catalog \ Block \ Product \ List \ Rel.php" để các thay đổi sẽ không xóa tại thời điểm nâng cấp magento.
Chirag Rajput

1
Vui lòng không thực hiện thay đổi trực tiếp trong các tệp cốt lõi của magento. Luôn luôn tốt hơn để ghi đè các tệp magento lõi để ngăn chặn sự cố trong khi nâng cấp magento.
Mohit Kumar Arora

1
Viết lại lớp là một cách tiếp cận hợp lệ (mặc dù không cần thiết), nhưng bạn tải một bộ sưu tập đầy đủ ba lần, đó không phải là một ý tưởng tốt về hiệu suất. Có thể được cải thiện với $ids = array_merge([1,3,5,7], $product->getRelatedProductCollection()->getAllIds());một tải duy nhất vớiaddIdFilter($ids)
Fabian Schmengler

1
thực tế không phải là ba tải mà là hai, cộng với hai truy vấn bổ sung cho ID: tải thứ nhất (ẩn) : foreach ($this->_itemCollection, hai truy vấn cho ID : array_merge($productscoll1->getAllIds(), $productscoll2->getAllIds()); , tải thứ hai : $this->_itemCollection->load();. Với đề xuất của tôi ở trên, bạn sẽ giảm một nửa cho một truy vấn ID và một lần tải bộ sưu tập
Fabian Schmengler
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.