Hinweis: Wenn Sie Produkte mit PHP-Code bearbeitet haben, indizieren Sie sie anschließend im Administrator neu. Sparen Sie sich Zeit, um herauszufinden, warum sie nicht wie ich unten angezeigt werden.
Ich gehe in Kreisen umher und versuche herauszufinden, wie is_salable
die Einstellungen für ein Produkt festgelegt sind. So kann ich herausfinden, warum meine Produkte jetzt angezeigt werden.
Es gibt nur eine Stelle im Code, an der ich ihn finden kann:
$salable = $this->isAvailable();
aber ich kann nicht herausfinden, wie oder woher das kommt, denn wenn ich folge isAvailable
, scheint es nur eine Schleife zu geben ...
/app/code/core/Mage/Catalog/Model/Product.php
public function isSalable()
{
Mage::dispatchEvent('catalog_product_is_salable_before', array(
'product' => $this
));
$salable = $this->isAvailable();
$object = new Varien_Object(array(
'product' => $this,
'is_salable' => $salable
));
Mage::dispatchEvent('catalog_product_is_salable_after', array(
'product' => $this,
'salable' => $object
));
return $object->getIsSalable();
}
Nach $ this-> isAvailable () geht es hier um ein paar Zeilen:
**public function isAvailable()
{
return $this->getTypeInstance(true)->isSalable($this);
}**
Dies ruft dann app / code / core / Mage / Catalog / Model / Product / Type / Configurable.php's isSalable auf
public function isSalable($product = null)
{
$salable = parent::isSalable($product);
if ($salable !== false) {
$salable = false;
if (!is_null($product)) {
$this->setStoreFilter($product->getStoreId(), $product);
}
foreach ($this->getUsedProducts(null, $product) as $child) {
if ($child->isSalable()) {
$salable = true;
break;
}
}
}
return $salable;
}
welches das Elternteil aufruft: /app/code/core/Mage/Catalog/Model/Product/Type/Abstract.php's isSalable:
public function isSalable($product = null)
{
$salable = $this->getProduct($product)->getStatus() == Mage_Catalog_Model_Product_Status::STATUS_ENABLED;
if ($salable && $this->getProduct($product)->hasData('is_salable')) {
$salable = $this->getProduct($product)->getData('is_salable');
}
elseif ($salable && $this->isComposite()) {
$salable = null;
}
return (boolean) (int) $salable;
}
was hat gerade ein Datenaufruf auf den Wert is_saleable?!? Habe ich das richtig verfolgt? Woher kommt dieser Wert?
Ich habe auf meiner Installation für is_salable ein rekursives Grep ausgegeben. Dies sollte sicherlich alle Zeilen anzeigen, in denen es gesetzt ist, aber ich sehe keine sofort:
grep -r is_salable *
app/code/core/Mage/CatalogInventory/Model/Stock/Status.php: $object = new Varien_Object(array('is_in_stock' => $product->getData('is_salable')));
app/code/core/Mage/XmlConnect/Block/Wishlist.php: $itemXmlObj->addChild('is_salable', (int)$item->getProduct()->isSalable());
app/code/core/Mage/XmlConnect/Block/Catalog/Product.php: $item->addChild('is_salable', (int)$product->isSalable());
app/code/core/Mage/XmlConnect/Block/Cart/Crosssell.php: $itemXmlObj->addChild('is_salable', 0);
app/code/core/Mage/XmlConnect/Block/Cart/Crosssell.php: $itemXmlObj->addChild('is_salable', (int)$product->isSalable());
app/code/core/Mage/Catalog/Model/Product.php: Mage::dispatchEvent('catalog_product_is_salable_before', array(
app/code/core/Mage/Catalog/Model/Product.php: 'is_salable' => $salable
app/code/core/Mage/Catalog/Model/Product.php: Mage::dispatchEvent('catalog_product_is_salable_after', array(
app/code/core/Mage/Catalog/Model/Product.php: if ($this->hasData('is_salable')) {
app/code/core/Mage/Catalog/Model/Product.php: return $this->getData('is_salable');
app/code/core/Mage/Catalog/Model/Product/Type/Abstract.php: if ($salable && $this->getProduct($product)->hasData('is_salable')) {
app/code/core/Mage/Catalog/Model/Product/Type/Abstract.php: $salable = $this->getProduct($product)->getData('is_salable');
GEFUNDEN:
grep -r setIsSalable *
app/code/core/Mage/CatalogInventory/Model/Stock/Status.php: $product->setIsSalable($stockStatus);
app/code/core/Mage/CatalogInventory/Model/Stock/Status.php: $product->setIsSalable($status);
Es war setIsSalable, nach dem ich nicht gesucht habe, sondern nur setIsSalable .
catalog_product_collection_load_after
. Dies ist jedoch nur ein Beispiel. Es gibt auchcataloginventory/observer::addInventoryData
AnrufeassignProduct
, die gesetzt werdenis_salable
. Es könnte andere geben, aber ich habe nicht nach allen gesucht.catalog_product_
und debuggen Sie die von den Beobachtern aufgerufenen Methoden. und sehen, ob man anruftsetIsSalable
odersetData('is_salable')
Wenn Salable false zurückgibt, kann die Neuindizierung auch zu Problemen bei der Neuindizierung der Daten führen
quelle
Wenn die Neuindizierung und das Debuggen von is_salable nicht abgeschlossen sind und Ihr konfigurierbares Produkt immer noch als nicht vorrätig angezeigt wird, stellen Sie sicher, dass in ALLEN Geschäftsansichten für alle Einfachen der Status Aktiviert festgelegt ist. Ich habe gerade zwei Stunden damit verbracht, mich zu fragen, warum ein konfigurierbares Element nicht vorrätig ist, egal was ich getan habe, bis ich alle Store-Ansichten überprüft habe und herausgefunden habe, dass eine Leiche den Status deaktiviert hat.
quelle