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.* AUS catalog_product_entity ALS e INNER JOIN catalog_product_website ALS product_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.

War es hilfreich?

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit magento.stackexchange
scroll top