Подтвердить что ты не робот

В чем разница между isSaleable() и isAvailable()?

Я работаю над отображением доступности акций на отдельной странице продукта моей темы 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.

Спасибо.

EDIT:
Я пробовал каждую соответствующую комбинацию количества запасов (-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, доступность запаса будет автоматически reset до "нет в наличии" (следовательно, строки N/A).

4b9b3361

Ответ 1

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

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

Как обычно, все причудливые вещи в Мадженто выполняются наблюдателями. 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);

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

Итак, мы попадаем в место, куда ни один здравомыслящий разработчик Magento охотно пойдет... указатель. Индексатор инвентаризации каталога в нашем случае. После быстрого проезда через лабиринт Mage_CatalogInventory_Model_Indexer_Stock:: _ processEvent, Mage_Index_Model_Indexer_Abstract:: reindexAll и Mage_CatalogInventory_Model_Resource_Indexer_Stock:: reindexВсе мы обнаруживаем, что каждый тип продукта имеет свой собственный индексный указатель, который находится в приложении/code/core/Mage/CatalogInventory/Model/Resource/Indexer/Фото.

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

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

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

Ответ 2

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

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

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

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

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

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

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

isSaleable() является псевдонимом isSalable().

Ответ 3

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

Ответ 4

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