isSaleable()和isAvailable()有什么区别?(涉及IT技术)

62

我正在处理Magento主题中商品页面上库存可用性的显示,但其中有些内容我不是很理解。

我发现模板中使用了两种方法来检查商品是否可售:

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

我的发现:
我发现 isSalable()(它又被isSaleable()调用)会调用 isAvailable(),但同时也会分发两个事件 (catalog_product_is_salable_before and catalog_product_is_salable_after)。

在前端中,我注意到在Magento的基本模板中,isAvailable() 被用于决定是否将产品显示为“有货”或“无货”;isSaleable()则用于决定是否显示“加入购物车”按钮之类的内容。

在后端中,我注意到当库存数量变为零且不允许备货时,产品的库存可用性会变为“无货”。 当库存数量变为零且允许备货时,产品的库存可用性不会改变。

问题:
“库存可用性”和“库存数量”属性显然与这些PHP方法相关。我想知道:

  • isAvailable()isSaleable() 这两个 PHP 方法之间的语义差异是什么,以及为什么我会选择其中一个方法而不是另一个方法;

  • 我似乎还不了解它们与这些属性以及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行)。


好漂亮的表格,帮了我大忙 :) - Akif
1
不客气!我已经好几年没来这里了,所以可能有点过时。 - pancake
5个回答

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

因此,语义上的区别是:

  • 可销售意味着:有库存且尚未被其他客户订购
  • 可用意味着:有库存但已被其他客户订购,因此可用但不可销售。

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

编辑: 更多信息请参见以下链接:

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


0

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

isAvailable() 看起来是在计数


你能再详细解释一下吗?最好能举些例子。 - Ganesh

-1

我看到它们之间存在语义差异。如果某个商品设置为允许预订,即使该商品没有库存,仍然可以销售。

据我所知,isAvailable 检查产品类型实例,以确定该产品类型是否可供销售,如果确实可用。

因此,猜测何时选择其中一个:

如果您要检查单个产品是否已准备好销售,应使用 isSalable(),因为它将调用 isAvailable()

如果要检查可能出售的产品(其类型不是您手头知道的),并且跳过检查产品类型的步骤,则可以在产品上调用 isAvailable()

isAvailable() 检查产品类型是否可销售。

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

isSaleable()isSalable() 的别名。


1
我理解有库存和能够销售之间的语义差异,但我仍然不知道isSaleable()/isSalable()和isAvailable()之间的语义差异。在我能想到的每种情况下,它们都是做同样的事情(见编辑后的问题),为什么要使用其中一个而不是另一个?我说“我能想到的”,因为我想知道是否有我没有想到的情况可能区分这些方法,因为现在我有一种感觉其中一个是无用的,我认为这有点草率。 - pancake
在您编辑的问题中,您写道当预订关闭且库存数量低于1时,库存可用性将自动重置为“缺货”。此外,还有一个“stock_is_changed_automatically”标志,我使用它来显示那些(技术上)没有盘点的项目,并明确处于有货状态,取消预订,数量为0。 - elcash
那是有用的信息,谢谢你。我不想显得不感激,但我仍然不知道何时使用isSaleable和何时使用isAvailable,因为它们似乎做同样的事情。我目前正在构建一个主题,所以我想弄清楚。 - pancake
是的,这条评论没有回答你的问题,但我认为它可能有些相关,并且我的回答编辑与你所说的Mage的基本模板设置有些不协调。也许其他人会加入讨论。 - elcash

-4
就我所知,isSaleable() 表示您正在检查最顶层的准备销售的产品。而 isAvailable() 表示您正在检查可用列表中的产品。

-6

isAvailable() 用于决定是否将产品显示为有库存无库存,而isSaleable()则用于决定是否显示添加到购物车按钮。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接