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





product in (5)


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 :: reindexAll мы обнаруживаем, что каждый тип продукта имеет собственный индекс индекса, который находится в приложении / code / core / Mage / CatalogInventory / Model / Resource / Indexer /Акции.

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

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

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

Я работаю над отображением доступности акций на отдельной странице продукта моей темы 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() есть и почему я буду использовать один над другим;

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

Спасибо.

РЕДАКТИРОВАТЬ:
Я пробовал каждую соответствующую комбинацию количества запасов (-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 Строки).




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




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

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

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

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

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

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

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

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




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




Как ни странно, я недавно получил это при установке Magento 1.9.2.3.

Причина заключается в следующем отсутствующем в приложении \ code \ core \ Mage \ GoogleCheckout \ etc \ config.xml

<global>
...
    <helpers>
        <googlecheckout>
            <class>Mage_GoogleCheckout_Helper</class>
        </googlecheckout>
    </helpers>
...
</global>

В результате автозагрузчик не может найти вспомогательный файл, поэтому возвращается к проверке Mage_Googlecheckout.





magento product stock