Sie können einen Beobachter für schreiben catalog_product_collection_load_after
und dann Produkte zur geladenen Sammlung hinzufügen, wenn es sich bei der Sammlung um die verwandte Produktsammlung handelt :
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);
}
}
}
Einige Teile, die ich hervorheben möchte:
->addIdFilter(array_diff([1,5,7,3], [$collection->getProduct()->getId()], $collection->getAllIds()))
Dadurch werden die Produkte [1,5,7,3]
geladen, jedoch das Produkt selbst und die Produkte, die bereits manuell als verwandte Produkte definiert wurden, ausgeschlossen. Andernfalls würden wir aufgrund von Duplikaten in der Sammlung einen Fehler erhalten. Sie möchten diese fest codierten IDs wahrscheinlich in eine Konfiguration verschieben.
->addMinimalPrice()
->addFinalPrice()
->addTaxPercents()
->addAttributeToSelect(Mage::getSingleton('catalog/config')->getProductAttributes())
->addUrlRewrite();
Dadurch wird die Produktkollektion darauf vorbereitet, die erforderlichen Daten zum Anzeigen der Preise, des Produktlinks und aller Attribute zu laden, die als "in der Produktliste verwendet" konfiguriert sind, jedoch nicht mehr.
Dies ist eine sehr ähnliche Lösung wie in meinem AutoUpsell-Modul, das unter Produktliste nach Kategorie-ID in view.phtml abrufen beschrieben ist. Ich habe den größten Teil des Codes von dort mit geringfügigen Änderungen kopiert.
Erstellen Sie eine neue Datei in
\app\code\local\Mage\Catalog\Block\Product\List\Related.php
und suchen Sie nach der Methode und ersetzen Sie sie durch den folgenden Code:quelle
$ids = array_merge([1,3,5,7], $product->getRelatedProductCollection()->getAllIds());
gefolgt von einer einzigen Ladung mitaddIdFilter($ids)
foreach ($this->_itemCollection
, zwei Abfragen für IDs :array_merge($productscoll1->getAllIds(), $productscoll2->getAllIds());
, zweites Laden :$this->_itemCollection->load();
. Mit meinem Vorschlag oben würden Sie das auf eine ID-Abfrage und eine Sammlungslast halbieren