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

2022-08-30 09:25:59

我正在我的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()

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

问:
属性“库存可用性”和“库存数量”显然是相互关联的,并且与上述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


答案 1

如果我没有记错的话,这些检查的差异与下订单的产品预订有关。当客户将产品添加到订单时,这些产品仍将在您的库存中,因此它们仍然可用。但是,它们不可销售,因为它们已经由另一个客户订购。

所以语义上的区别是:

  • 可销售方式:有现货且尚未由其他客户订购
  • 可用意味着:有库存但由另一个客户订购,所以可用,但不出售。

您可以尝试通过下订单来验证这一点。并进行与您已经执行的相同的检查。这应该导致可用产品的数量和可销售产品的数量之间的差异。

编辑:更多信息在这里:

https://blog.magestore.com/magento-multi-source-inventory-msi/#a3


答案 2

isSeable()看起来它正在检查它是否达到0

isAvailable()看起来它正在计数


推荐