Woher kommt is_salable?

27

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_salabledie 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 .

Hayden Thring
quelle

Antworten:

18

isAvailable() sieht aus wie das:

public function isAvailable()
{
    return $this->getTypeInstance(true)->isSalable($this)
        || Mage::helper('catalog/product')->getSkipSaleableCheck();
}

Dies bedeutet, dass das Ergebnis der Methode vom Produkttyp abhängt.
Jeder Produkttyp hat eine isSalable()Methode:

  • Mage_Catalog_Model_Product_Type_Grouped::isSalable() - für gruppierte Produkte
  • Mage_Catalog_Model_Product_Type_Configurable::isSalable() - für konfigurierbare Produkte
  • Mage_Catalog_Model_Product_Type_Abstract::isSalable()- für den Rest der Produkttypen, da sich alle Produkttypen erstrecken Mage_Catalog_Model_Product_Type_Abstract.
    Ich denke, dass der Anruf $this->getTypeInstance(true)Sie verwirrt. Die Methode getTypeInstance()gibt keine Instanz des Produktmodells zurück, sondern eine Instanz eines Produkttyps.

[EDIT]
Für ein einfaches Produkt heißt dies Mage_Catalog_Model_Product_Type_Grouped::isSalable(). Diese Methode prüft, ob das Produkt aktiviert ist. Wenn nicht, falsewird zurückgegeben. Wenn es aktiviert ist, prüft es, ob es eine Eigenschaft hat is_salable, die von einem Ihrer Beobachter festgelegt werden kann.
Wenn es keine solche Eigenschaft hat, prüft es, ob die Produkttypinstanz vorhanden ist $this->isComposite(). Wenn ja, dann ist es nicht verkäuflich.
Bei konfigurierbaren Produkten wird geprüft, ob die oben genannten Bedingungen erfüllt sind und ob dem konfigurierbaren Produkt ein einfaches Produkt zugeordnet ist, das verkauft werden kann (erneut mit den oben genannten Bedingungen).
Dasselbe gilt für das gruppierte Produkt, jedoch auf andere Weise.

Abschließend is_salablemuss nicht existieren. Aber nur für den Fall, dass Sie einen Beobachter haben, der diese Eigenschaft einstellt, wird dies berücksichtigt, wenn geprüft wird, ob das Produkt verkauft werden kann.
Hier ist ein Beispiel aus dem Kern: Die Methode Mage_CatalogInventory_Model_Stock_Status::assignProduct()cals $product->setIsSalable()
Gleiches gilt für Mage_CatalogInventory_Model_Stock_Status::addStockStatusToProducts.
Der letzte wird vom Ereignis aufgerufen catalog_product_collection_load_after.

Marius
quelle
Nochmals vielen Dank für Ihre Hilfe, ich hatte IsAvailable für IsSalable und Configurable.php's IsSalable verfolgt, das nur Abstract.php's IsSalable aufruft, aber alles, was es tut, ist Check 'Is_salable', aber ich finde keine Einstellung davon? Ich werde meine Code-Spur oben hinzufügen.
Hayden Thring
hat zu meiner Frage hinzugefügt
Hayden Thring
2
Ja da ist. Ich habe es in meiner Antwort erwähnt catalog_product_collection_load_after. Dies ist jedoch nur ein Beispiel. Es gibt auch cataloginventory/observer::addInventoryDataAnrufe assignProduct, die gesetzt werden is_salable. Es könnte andere geben, aber ich habe nicht nach allen gesucht.
Marius
1
Ich habe keine verlässliche Methode dafür. Rufen Sie möglicherweise alle Ereignisse ab, die mit diesen Ereignissen beginnen, catalog_product_und debuggen Sie die von den Beobachtern aufgerufenen Methoden. und sehen, ob man anruft setIsSalableodersetData('is_salable')
Marius
1
Mit XmlConnect können Sie Ihre mobile Anwendung mit Ihrer Website verbinden. Ignoriere es.
Marius
2

Wenn Salable false zurückgibt, kann die Neuindizierung auch zu Problemen bei der Neuindizierung der Daten führen

Hassan Ali Shahzad
quelle
0

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.

David Tay
quelle