isSaleable()和isAvailable()有什么区别?

我正在Magento主题的(个人)产品页面上显示库存情况,有些事情我并不完全了解。

我看到模板中使用了两种方法来检查产品是否可用于销售:

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

我自己的发现:
我看到isSalable() (它又被isSaleable() )调用)调用isAvailable()但也调度两个事件( catalog_product_is_salable_beforecatalog_product_is_salable_after )。

在前面我已经注意到,在Magento的基本模板isAvailable()是用来决定是否显示产品为“有货”或“缺货”; isSaleable()用于决定是否显示“添加到购物车”button。

在后端我注意到,当库存量变为零并且不允许延期交货时,产品的库存可用性就会“缺货”。 当库存量变为零并且允许延期交货时,产品的库存量a保持不变。

题:
“库存可用性”和“库存数量”这些属性显然是相互关联的,并且还提到了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不适用不适用不适用
    -1 1 0 0 0 0
    -1 1 1 1 1 1
     0 0 0 0 0 0
     0 0 1不适用不适用不适用
     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 =缺货
 St.Av 1 =有货
 BckOrd 0 =不允许延期交货
缺货1 =允许缺货

Magento中的库存可用性开关控制所有PHP方法的返回值,但是当延期交货closures且库存数量降至1以下时,库存可用性将自动重置为“缺货”(因此N/A排)。

isSaleable()在使用Magento模板时,您肯定偶然发现了应用于产品对象的isSalable()方法。 该方法在物理上存在,但仅检查产品是否已启用状态,并且不应跳过可销售的检查。 然后返回产品对象的is_salable属性。

显而易见的问题是这个属性何时设置。 产品加载后,它已经在模型上设置,但它不是一个属性,并不是产品平台中的列。

像往常一样,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,这是一种未完成的function,也将在稍后popup。

所以我们最终在一个地方没有理智的Magento开发人员愿意去索引。 目录库存索引器在我们的情况。 通过Mage_CatalogInventory_Model_Indexer_Stock :: processEvent迷宫快速旅行后,Mage_Index_Model_Indexer_Abstract :: reindexAll和Mage_CatalogInventory_Model_Resource_Indexer_Stock :: reindexAll我们发现,每个产品types都有它自己的股票索引器驻留在应用程序/代码/核心/法师/ CatalogInventory /模型/资源/索引/股票。

每种types都有一个_getStockStatusSelect方法,其中一个SQL查询最终决定产品是否可销售。 即使查询看起来很庞大,背后的逻辑也不复杂。

这里的代码的大部分是这个基本的东西。 看起来像核心开发商做了一个很好的尝试,让不同的网站有不同的库存水平,但由于某种原因,这个function从来没有完成。

因此,例如,简单产品库存可用性的检查仅包括validation产品是否启用,并且数量是否正面join库存pipe理标志。 由于产品types的细节,对可configuration和分组产品的查询有所不同。

我看到那些有语义上的差异。 如果所述项目被设置为允许延期交货,那么没有库存的项目仍然可以销售。

据我所知,看起来像isAvailable检查产品types实例,看看产品types是否可以出售,如果它确实可用。

所以,要猜测你什么时候可以select一个:

如果您正在检查单个产品以查看该产品是否实际上已准备好出售,则应该使用isSalable() ,因为它将调用isAvailable()

要检查是否可以销售产品(您不知道哪种types的产品),并且我想跳过检查产品types的步骤,则可以在产品上调用isAvailable()

isAvailable()检查产品的types是否可销售。

isSalable()检查产品是否可销售。

isSaleable()isSaleable()的别名。

就我所关心的而言, isSaleable()意味着你正在检查可供销售的最顶级产品。 而isAvailable()表示您正在从可用列表中检查产品。

isAvailable()用于决定是否显示产品的库存缺货 ,而isSaleable()用于决定是否显示添加到购物车button。