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.