звідки походить is_salable?


27

Примітка. Якщо ви редагували продукти за PHP-кодом, після цього повторно індексуйте їх у адміністратора, збережіть свої самостійні години, намагаючись розібратися, чому вони не відображаються як я нижче ...

Я об’їжджаю кола, намагаючись розібратися, як is_salableналаштовано продукт, і таким чином роз’яснюю, чому зараз показують мою продукцію.

У коді є лише одне місце, яке я можу знайти, що задає його:

$salable = $this->isAvailable();

але я не можу розібратися, як або звідки це отримує, тому що коли я слідую за isAvailableцим, то, здається, крутиться ...

/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();
}

після $ this-> isAvailable (), звідси йде кілька рядків:

**public function isAvailable()
{ 
    return $this->getTypeInstance(true)->isSalable($this);
}**

потім викликає додаток / код / ​​core / Mage / Каталог / Модель / Продукт / Тип / Configurable.php isSalable

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;
}

який викликає батьків: /app/code/core/Mage/Catalog/Model/Product/Type/Ab абстракт.php'sSalable:

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;
}

що просто робить / отримує виклик даних на значення is_saleable?!? Я правильно це відстежував? Звідки ця величина?

Я видав рекурсивний греп на своїй установці для is_salable, безумовно, це повинно показувати будь-які рядки, де воно встановлено, але я не бачу жодного разу:

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');

ЗНАЙДЕНО:

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);

Це було setIsSalable, що я не думав / знаю шукати, а не просто setIsSalable .

Відповіді:


18

isAvailable() виглядає так:

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

Це означає, що результат методу залежить від типу товару.
Кожен тип товару має isSalable()метод:

  • Mage_Catalog_Model_Product_Type_Grouped::isSalable() - для згрупованої продукції
  • Mage_Catalog_Model_Product_Type_Configurable::isSalable() - для настроюваних продуктів
  • Mage_Catalog_Model_Product_Type_Abstract::isSalable()- для решти видів продукції, оскільки всі види продукції поширюються Mage_Catalog_Model_Product_Type_Abstract.
    Я думаю, що дзвінок $this->getTypeInstance(true)вас бентежить. Метод getTypeInstance()не повертає екземпляр моделі продукту, а екземпляр типу продукту.

[EDIT]
Для простого продукту це називається Mage_Catalog_Model_Product_Type_Grouped::isSalable(). Цей метод перевіряє, чи продукт увімкнено. Якщо ні, то falseповертається. Якщо він включений, він перевіряє, чи є у нього властивість, is_salableяку може встановити один з ваших спостерігачів.
Якщо у нього немає такого властивості, він перевіряє, чи екземпляр типу продукту $this->isComposite(). Якщо так, то це не продається.
Для продуктів, що налаштовуються, вона перевіряє, чи виконуються вищезазначені умови, і чи є простий продукт, пов'язаний з налаштованим, який можна продати (Знову з умовами вище)
Те ж саме робиться для згрупованого продукту, але по-іншому.

На закінчення is_salableне обов’язково існувати. Але про всяк випадок у вас спостерігач, який встановлює цю властивість, вона враховується під час перевірки, чи можна товар продати.
Ось приклад з ядра: Метод Mage_CatalogInventory_Model_Stock_Status::assignProduct()cals $product->setIsSalable()
Те саме стосується Mage_CatalogInventory_Model_Stock_Status::addStockStatusToProducts.
Остання називається подією catalog_product_collection_load_after.


дуже дякую за вашу допомогу ще раз, я простежив isAvailable до isSalable та Configurable.php isSalable, який просто викликає Abstract.php isSalable, але все, що він робить, це перевірити "is_salable", але я не знаходжу його налаштування ?? я додам свій кодовий слід вище.
Hayden Thring

додано до мого запитання
Hayden Thring

2
Так, є. Я це згадав у своїй відповіді catalog_product_collection_load_after. Але це лише приклад. Існує також cataloginventory/observer::addInventoryDataте, assignProductщо встановлює дзвінки is_salable. Можуть бути й інші, але я не шукав усіх.
Маріус

1
У мене немає надійного методу для цього. Можливо, отримайте всі події, які починаються з того, catalog_product_і налагоджуйте методи, викликані спостерігачами на тих подіях. і подивіться, чи хтось дзвонить setIsSalableабоsetData('is_salable')
Маріус

1
XmlConnect дозволяє підключити мобільний додаток до вашого веб-сайту. Ігноруйте це.
Маріус


0

Якщо після повторного встановлення та налагодження не_закінчено і ваш конфігуруваний продукт все ще не відображається на складі, переконайтеся, що для всіх простих встановлено статус Увімкнено у ВСІХ представленнях магазину. Я просто витратив дві години, цікавившись, чому налаштованого не вистачає на складі, незалежно від того, що я робив, доки я не перевірив усі види магазину і не з'ясував, що тіло відключило статус.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.