Es mag eine einfache Antwort darauf geben, aber ich kann sie nicht finden. Ich versuche, eine Produktkollektion abzurufen, ausgenommen Produkte, die aktiviert, aber nicht vorrätig sind.
Ich habe den folgenden Ansatz ausprobiert, aber dies führt zu einem Fehler:
$productIds = array('3','4','9');
$productCollection = Mage::getResourceModel('catalog/product_collection')
->addAttributeToSelect(
array('name', 'image', 'price')
)
->addIdFilter($productIds)
;
$this->_productCollection = Mage::getSingleton('cataloginventory/stock')
->addInStockFilterToCollection( $productCollection )
;
Der folgende Fehler tritt auf:
PHP Fatal error: Call to a member function getTypeInstance() on a non-object in app/code/core/Mage/Catalog/Block/Product/Abstract.php on line 117
app / code / core / Mage / Katalog / Block / Produkt / Abstract.php: 117 hat die folgende Methode:
/**
* Retrieve url for add product to cart
* Will return product view page URL if product has required options
*
* @param Mage_Catalog_Model_Product $product
* @param array $additional
* @return string
*/
public function getAddToCartUrl($product, $additional = array())
{
// line 117:
if (!$product->getTypeInstance(true)->hasRequiredOptions($product)) {
return $this->helper('checkout/cart')->getAddUrl($product, $additional);
}
$additional = array_merge(
$additional,
array(Mage_Core_Model_Url::FORM_KEY => $this->_getSingletonModel('core/session')->getFormKey())
);
if (!isset($additional['_escape'])) {
$additional['_escape'] = true;
}
if (!isset($additional['_query'])) {
$additional['_query'] = array();
}
$additional['_query']['options'] = 'cart';
return $this->getProductUrl($product, $additional);
}
Gibt es eine einfache Möglichkeit, eine Sammlung zu filtern, um nur Produkte zu erhalten, die auf Lager sind? Offensichtlich weiß ich über isSaleable()
innerhalb der Schleife Bescheid . Vielen Dank.
$this->getAddToCartUrl($product)
außerhalb davon.Antworten:
Um die Frage zu beantworten. Sie würden dies verwenden (nicht sehr verschieden von Ihrer Version):
Aber ich weiß nicht genau, was Ihren Fehler verursacht, da er mit der Tatsache zusammenhängt, dass der Parameter
getSubmitUrl
/getAddToCartUrl
product boolean false ist und nicht mit der Sammlung an sich.quelle
Vielleicht einen Tag zu spät und einen Dollar zu kurz, aber anstatt all diese Arbeit im zweiten Schritt zu erledigen, können Sie einfach die
cataloginventorystock_stock_status
Tabelle mit Ihrer Sammlung verbinden. Select ():Sie können dies in Verbindung mit zusätzlichen join () - oder where () -Klauseln tun. Hoffe es hilft dir in die richtige Richtung.
quelle
Newermind beantwortete die ursprüngliche Frage richtig; Mein Dank geht an ihn. Für zukünftige Abenteurer ist hier, was mit meinem Code falsch war. Besonderer Dank geht an Melvyn für seine Hilfe.
Problem
$this->_productCollection
Enthält aus meinem Code in der Frage ein Objekt . Wenn wir dieses Objekt in der Ansicht durchlaufen, ist die$_product
Variable ein Array .Die Methode bei
app/code/core/Mage/Catalog/Block/Product/Abstract.php:117
(letztendlich) ruft aufgetTypeInstance()
. Diese Methode erwartet ein Objekt , insbesondere eine Instanz vonMage_Catalog_Model_Product
.In der Ansicht habe ich
$this->getSubmitUrl($_product)
innerhalb der foreach-Schleife aufgerufen:getSubmitUrl()
ist eine Methode vonMage_Catalog_Block_Product_Abstract
Zeile 115. In Zeile 123 wird aufgerufengetAddToCartUrl()
, welche AufrufegetTypeInstance()
und das erwartet ein Objekt . Das Problem war, ich gab ihm ein Array .Einfaches OOP-Prinzip, aber ich glaube, ich war zu müde, um es zu sehen. Vielen Dank für die Hilfe.
Die Lösung
Leider gibt die
addInStockFilterToCollection
Methode ein Inventarobjekt zurück - nicht das, wonach ich gesucht habe. Ich brauche eine Produktsammlung von in-Lager Produkten.Außerdem
addInStockFilterToCollection
funktioniert die Methode nur mit einerMage_Catalog_Model_Resource_Eav_Mysql4_Product_Link_Product_Collection
Sammlung.Also, wie bekommt man die Sammlung? Mein Ansatz war wie folgt:
Hier ist der Code:
Das gibt eine Produktkollektion zurück, die nur vorrätige Produkte enthält. Es ist ein bisschen schwer, aber es funktioniert. Ich würde mich über Verbesserungen freuen. Vielen Dank.
quelle
$collection = Mage::getModel("catalog/product")->getCollection() ... ; Mage::getSingleton('cataloginventory/stock')->addInStockFilterToCollection($col);
Beachten Sie, dass ich nichts mit dem Rückgabewert mache, aber die Sammlung wird aktualisiert, um Instock-Filter darauf zu haben.