Ich habe diesen Codeausschnitt, der die zuletzt hinzugefügten Produkte enthält:
$_productCollection = Mage::getResourceModel('catalog/product_collection')
->addAttributeToSelect('*')
->addAttributeToFilter($preorderAttribute, array(
'eq' => Mage::getResourceModel('catalog/product')
->getAttribute($preorderAttribute)
->getSource()
->getOptionId($preorderValue)
))
->setVisibility(array(2,3,4))
->setOrder('created_at', 'desc')
->setPage(1, 12);
Ich möchte dies weiter nach Kategorien filtern, z. B. Kategorien mit den IDs 3 und 4. In der Sammlung werden nur Produkte aus den Kategorien 3 und 4 ausgewählt. Wie kann ich das erreichen?
Ich habe versucht, addAttributeToFilter
nach Kategorie-IDs zu filtern, aber es scheint verschiedene Möglichkeiten zu geben, und es funktioniert weder nicht noch gibt es einen schwerwiegenden Fehler:
Aufruf einer Nichtmitgliedsfunktion getBackend ()
.... jetzt bin ich ratlos.
Jede Hilfe wäre dankbar.
category
magento-1
collection
filter
datasn.io
quelle
quelle
Item (Mage_Catalog_Model_Product) with the same id "xx" already exist
.$productCollection->getSelect()->group('e.entity_id');
Denken Sie jedoch daran, dass einige Funktionen wie die Anzahl der Sammlungen durch Hinzufügen einer Gruppierung deaktiviert werden.'product_id=entity_id'
- beachten Sie den Mangel an Leerzeichen.Eine andere Alternative:
Im Beispiel
$categoryIds
handelt es sich um ein Array von Kategorie-IDs. (Ich benutze normalerweise,$collection->getFlag('category_ids')
aber für dieses Beispiel geändert, siehe Erklärung weiter unten)$currentStoreId
wird mit allen Mitteln gefüllt, die die aktuelle Geschäfts-ID erhalten können. (in meinem Beobachterereignis benutze ich$collection->getFlag('store_id')
)Ich verwende den obigen Code in einem Beobachter, um mit mehreren Kategorien zu filtern, NACHDEM der eingebaute Aufruf
Mage_Catalog_Model_Resource_Product_Collection::_applyProductLimitations()
seine Sache tut, da er ein Ereignis namens sendet'catalog_product_collection_apply_limitations_after'
Die
_applyProductLimitations
Methode wendet im Wesentlichen die Filter an, die durch den Aufruf von festgelegt wurdenaddCategoryFilter
.Durch die Verwendung eines Flags in der
$collection
ist es einfach, die mehreren Kategorie-IDs für den Beobachter zu speichern.Wenn ich also nach mehreren Kategorien filtern muss, setze ich irgendwann ein Flag für die Sammlung
Ein Beispiel wäre das Umschreiben
Mage_Catalog_Model_Category::getProductCollection()
Wenn Magento das Ereignis auslöst, ersetzt mein Code den Kategoriefilter durch meinen Mehrfachfilter :)
Dies ist im Wesentlichen die Vorgehensweise meines Moduls " Dynamische Kategorieprodukte" für seine Filter mit mehreren Kategorien.
Ref Der Kerncode von
addCategoryFilter
:quelle
Ich habe mit den Techniken gearbeitet, die sowohl in den Antworten von @monojit banik als auch in den Antworten von @ ProxiBlue angeboten wurden, und habe den Fehler "Item (Mage_Catalog_Model_Product) mit der gleichen ID" xx "bereits vorhanden" erhalten, der in @ MTMs Kommentar mit beiden identifiziert wurde.
Um den Fehler zu vermeiden, der außerhalb der Sammlungslast in der geschichteten Navigation auftritt, habe ich verschiedene Methoden ausprobiert, um einen bestimmten Satz von Produkten in einem einzigen Durchgang zu erhalten, aber nichts, was ich mir ausgedacht habe, hat funktioniert.
Letztendlich (BEARBEITEN: basierend auf diesem Blog-Beitrag, https://www.muddyweb.com/general-ramblings/filtering-a-magento-product-collection-by-multiple-categories/ ) habe ich zwei separate Sammlungsladungen verwendet um den eindeutigen Produktsatz zu erhalten und den Fehler wie folgt zu vermeiden. Die Verwendung von zwei Durchgängen kann zu Leistungseinbußen führen, aber es war nichts zu bemerken.
quelle
Ich habe es geschafft, dies (nach langem Ausprobieren) mit dem folgenden Code zu beheben:
Hoffe das hilft jemandem;)
quelle
Fehler: 'ungültiges Attribut entity_id' Leerzeichen zwischen product_id = entity_id !! Die gute Syntax lautet:
quelle