Es wird ein Fehler angezeigt, ich bin mir aber nicht sicher, was es ist
-
13-12-2019 - |
Frage
Ich schreibe eine benutzerdefinierte Funktion, die mir Cross-Selling-Artikel aus Produkten aus dem Warenkorb ermöglicht.
Ich habe diese Funktion wie folgt geschrieben:
$quote = $this->getQuote();
$quoteItems = $quote->getAllItems();
$productIds = array();
foreach($quoteItems as $item){
if (!$item->getParentItem()) {
$product = Mage::getModel('catalog/product')->load($item->getProductId());
$productIds[] = $product->getCrossSellProductIds();
}
}
if ($productIds) {
$productCollection = Mage::getModel('catalog/product')
->getCollection()
->setStoreId($this->getQuote()->getStoreId())
->addStoreFilter($this->getQuote()->getStoreId())
->addAttributeToSelect('name')
->addAttributeToSelect('price')
->addAttributeToSelect('small_image')
->addIdFilter($productIds)
->load();
}
}
return $productCollection;
Aber das gibt mir nur bei einigen wenigen Produkten eine Fehlermeldung.Ich bin mir nicht sicher, was los ist.
Soweit ich weiß, wird versucht, Produkte herauszufiltern store
.
Fehler
a:5:{i:0;s:238:"AUSWÄHLEN
e
.* AUScatalog_product_entity
ALSe
INNER JOINcatalog_product_website
ALSproduct_website
On product_website.product_id = e.entity_id und product_website.website_id = '1' wobei ((e
.entity_id
In ('46 ',' 56 ',' 60 ',))
Kann mir jemand sagen, was passiert, da mir Magento keinen konkreten Grund für den Fehler nennt.
Lösung
Anscheinend könnte Ihre Fehlermeldung auf addIdFilter zurückzuführen sein
Du kannst es versuchen
Übergabe einer Zeichenfolge mit durch Kommas getrennten IDs:
->addIdFilter("46, 56, 60") // instead of IN('46', '56', '60', )) extra comma :(
Wenn das nicht funktioniert, können Sie immer Folgendes versuchen:
->addAttributeToFilter('entity_id', array('in' => array(46, 56, 60)))
Ich hoffe, das wird für Sie funktionieren.
Andere Tipps
WHERE (e.entity_id IN('46', '56', '60', ))
Da steht ein Komma am Ende.
Wo Sie anrufen $productIds[] = $product->getCrossSellProductIds()
In einer Schleife erhalten Sie am Ende ein Array, das wahrscheinlich so aussieht
$productIds = array(array('46', '56', '60'), array())
Ich möchte nicht auf das eingehen, was passiert, nachdem Sie angerufen haben addIdFilter
, aber ich könnte mir vorstellen, dass kein Array von Arrays mit leeren Arrays erwartet wird, daher die schlechte SQL-Generierung.
Wenn ich Sie wäre, würde ich überprüfen, wie $productIds aussieht, bevor Sie es zur Sammlung hinzufügen. Wenn es sich nicht um eine flache Sammlung von Produkt-IDs handelt, würde ich es so reduzieren, dass es so ist, und prüfen, ob das Problem dadurch behoben wird.
Sie müssen sicherstellen, dass $productsCollection außerhalb der if-Anweisung definiert wird. Wenn Ihr Produkt also keine Cross-Selling-Produkte enthält, geben Sie eine undefinierte Variable zurück.
Es sieht seltsam aus, dass der doppelte Filter „store“ und „storeId“ mit addStoreFilter() erreicht werden würde.
Ich schlage vor, die Cross-Selling-IDs direkt aus der Datenbank abzurufen, um eine bessere Leistung zu erzielen. Sie können alle diese IDs mit einer einfachen Abfrage abrufen und so vermeiden, jedes Produkt im Angebot neu zu laden.Schließlich ist das zu filternde Attribut „id“ kein Attribut, Sie sollten stattdessen „entity_id“ verwenden.
Okay, ich habe die Antwort von liyakat akzeptiert, sie ist jedoch nicht vollständig.Deshalb habe ich hier auch eine Antwort hinzugefügt.
Nachdem ich alle gegebenen Antworten durchgesehen habe, @liyakat hat mich in die richtige Richtung geführt, mir aber keine Lösung geliefert, da ich dort keine benutzerdefinierte Abfrage ausführe.
Hier ist meine Antwort:
$quote = $this->getQuote();
$quoteItems = $quote->getAllItems();
$productIds = array();
foreach($quoteItems as $item){
if (!$item->getParentItem()) {
$product = Mage::getModel('catalog/product')->load($item->getProductId());
//putting to if condition so if there is no cross sell for the item then it will not load up.
// and this will remove that empty node at the end.
if(count($product->getCrossSellProductIds()) > 0){
$productIds[] = $product->getCrossSellProductIds();
}
}
}
if ($productIds) {
$productCollection = Mage::getModel('catalog/product')
->getCollection()
->setStoreId($this->getQuote()->getStoreId())
->addStoreFilter($this->getQuote()->getStoreId())
->addAttributeToSelect('name')
->addAttributeToSelect('price')
->addAttributeToSelect('small_image')
->addIdFilter($productIds)
->load();
}
}
return $productCollection;
Ich hoffe, dass dies anderen in Zukunft helfen wird.