В чем разница между isSaleable () и isAvailable ()? - PullRequest
49 голосов
/ 27 января 2012

Я работаю над отображением наличия товара на (отдельной) странице продукта моей темы Magento, и есть кое-что, что я не совсем понимаю в этом.

Я вижу два метода, которые используютсяв шаблонах, чтобы проверить, доступен ли продукт для продажи:

Mage_Catalog_Model_Product::isAvailable()
Mage_Catalog_Model_Product::isSaleable()

Мои собственные выводы:
Я вижу, что isSalable() (который, в свою очередь, называется isSaleable()) вызывает isAvailable(), но также отправляет два события (catalog_product_is_salable_before и catalog_product_is_salable_after).

На фронте я заметил, что в базовом шаблоне Magento isAvailable() используется, чтобы решить, отображать литовар как "в наличии" или "нет в наличии";isSaleable() используется, чтобы решить что-то вроде того, показывать ли кнопку «Добавить в корзину».

На бэкэнде я заметил, что когда количество запаса становится равным нулю, а задержка заказа не Допускается, наличие товара на складе переходит на «нет в наличии».Когда количество на складе становится равным нулю, а разрешенные заказы разрешены , доступность запаса продукта остается неизменной.

Вопрос:
Свойства "наличие на складе" и«количество на складе» явно связано друг с другом и упомянутыми методами PHP.Я хотел бы знать:

  • что такое семантическая разница между методами PHP isAvailable() и isSaleable() и почему я буду использовать один над другим;

  • что я, кажется, еще не знаю об их связи с этими свойствами и поведением Magento.

Спасибо.

РЕДАКТИРОВАТЬ:
Я пробовал все соответствующие комбинации количества запаса (-1,0,1), наличия на складе (в / из) и отказов (вкл / выкл) для продуктаи вот результат:

St.Qu  BckOrd  St.Av  isSalable()  isSaleable()  isAvailable()
   -1       0      0            0             0              0
   -1       0      1          N/A           N/A            N/A
   -1       1      0            0             0              0
   -1       1      1            1             1              1
    0       0      0            0             0              0
    0       0      1          N/A           N/A            N/A
    0       1      0            0             0              0
    0       1      1            1             1              1
    1       0      0            0             0              0
    1       0      1            1             1              1
    1       1      0            0             0              0
    1       1      1            1             1              1

Просто для полноты:

St.Av 0  = out of stock
St.Av 1  = in stock
BckOrd 0 = no backorders allowed
BckOrd 1 = backorders are allowed

Это переключатель доступности запасов в Magento, который контролирует возвращаемое значение всего PHPметоды, но когда задержка заказа отключена и количество запаса падает ниже 1, доступность запаса автоматически сбрасывается на «нет в наличии» (отсюда N/A строк).

Ответы [ 4 ]

3 голосов
/ 15 ноября 2016

isSaleable() При работе с шаблонами Magento вы определенно наткнулись на метод isSalable (), примененный к объекту продукта.Метод физически существует, но он только проверяет, имеет ли продукт включенный статус, и проверять товар не следует пропускать.Затем возвращается свойство is_salable объекта product.

Очевидный вопрос - когда установлено это свойство.После загрузки продукта он уже задан в модели, но не является атрибутом и не является столбцом в плоской таблице продукта.

Как обычно, все странные вещи в Magento выполняются наблюдателями.Mage_Cataloginventory наблюдает за событием catalog_product_load_after и там оно сводится к Mage_CatalogInventory_Model_Resource_Stock_Status::getProductStatus и следующему запросу:

SELECT `cataloginventory_stock_status`.`product_id`, 
    `cataloginventory_stock_status`.`stock_status` 
FROM `cataloginventory_stock_status` 
WHERE product_id IN('241319') 
    AND stock_id=1 
    AND website_id=3;

. Очевидно, что решение о том, продается товар или нет, принимается во время переиндексации.И не обращайте внимания на stock_id, который является своего рода незаконченной функциональностью, которая также появится позже.

Таким образом, мы оказались в месте, куда ни один здравомыслящий разработчик Magento не пойдет охотно ... индексатор.Каталог инвентаря в нашем случае.После быстрого перемещения по лабиринту Mage_CatalogInventory_Model_Indexer_Stock::_processEvent, Mage_Index_Model_Indexer_Abstract::reindexAll и Mage_CatalogInventory_Model_Resource_Indexer_Stock::reindexAll мы обнаруживаем, что у каждого типа продукта есть свой собственный индексатор запасов, который находится в app/code/core/Mage/CatalogInventory/Model/Resource/Indexer/Stock.

Каждый тип имеет метод _getStockStatusSelectгде SQL-запрос, наконец, решает, продается товар или нет.Несмотря на то, что запрос может показаться массивным, логика не сложна.

Большая часть кода здесь опять-таки элементарная штука.Похоже, что основные разработчики предприняли прекрасную попытку разрешить иметь разные уровни запасов для разных веб-сайтов, но по какой-то причине эта функциональность так и не была завершена.

Так, например, проверка наличия на складе простых продуктов включает только проверку того, что продуктвключено и количество положительно, с флагами управления запасами.Запросы для конфигурируемых и сгруппированных продуктов немного различаются в зависимости от типа продукта.

0 голосов
/ 08 мая 2015

isAvailable () используется, чтобы решить, отображать ли продукт как на складе или на складе , тогда как isSaleable () используется, чтобы решить, показывать ли кнопку Добавить в корзину или нет.

0 голосов
/ 19 сентября 2016

Что касается меня, isSaleable() означает, что вы проверяете самый лучший продукт, который готов к продаже. В то время как isAvailable() означает, что вы проверяете продукт из доступных списков.

0 голосов
/ 28 января 2012

Я вижу тех, у кого есть семантические различия.Элемент, которого нет в наличии, все еще может быть реализован, если для указанного элемента разрешено задерживать заказы.

Насколько я могу судить, похоже, что isAvailable проверяет экземпляр типа продукта, чтобы выяснить,тип продукта может быть выставлен на продажу, если он действительно доступен.

Итак, рискну предположить, когда вы можете выбрать один из них:

Если выпроверяя отдельный продукт, чтобы увидеть, действительно ли указанный продукт готов к продаже, вы должны использовать isSalable(), так как он будет вызывать isAvailable().

, чтобы проверить, есть ли продукт (тип которого вы не знаетеhand) можно продать, и я полагаю, что, пропустив этап проверки типа продукта, вы можете позвонить isAvailable() для продукта.

isAvailable() проверяет, является ли тип продукта пригодным для продажи.

isSalable() проверяет, продается ли товар.

isSaleable() - псевдоним isSalable().

...