Tony's Blog

Magento 2 一些库存状态的一些疑问与异同

问题起源

  • 创建了一个可以添加产品到quote的页面,发现有些产品不能加入quote,所以使用api查看了返回的信息如下:
    Tony's blog image
  1. {
  2. "message": "Product that you are trying to add is not available."
  3. }
  • 故又写了个方法,查看产品的stock信息,返回结果如下:
    Tony's blog image

  • 然后拿一个正常的产品测试,返回信息如下:
    Tony's blog image

  • 可以看出不正常的产品“isSaleable”,”isSalable”,”isAvaliable”均为false,那么是什么导致的产品这些信息为false呢?找到这些方法一探究竟。

a. isSaleable() 只是调用了isSalable()

  1. /**
  2. * Alias for isSalable()
  3. *
  4. * @return bool
  5. */
  6. public function isSaleable()
  7. {
  8. return $this->isSalable();
  9. }

b. isSalable()看着很复杂的样子,但是其实它是简单的检查产品是否可售,调用了isAvailable() 方法

  1. /**
  2. * Check is product available for sale
  3. *
  4. * @return bool
  5. */
  6. public function isSalable()
  7. {
  8. if ($this->hasData('salable') && !$this->_catalogProduct->getSkipSaleableCheck()) {
  9. return $this->getData('salable');
  10. }
  11. $this->_eventManager->dispatch('catalog_product_is_salable_before', ['product' => $this]);
  12. $salable = $this->isAvailable();
  13. $object = new \Magento\Framework\DataObject(['product' => $this, 'is_salable' => $salable]);
  14. $this->_eventManager->dispatch(
  15. 'catalog_product_is_salable_after',
  16. ['product' => $this, 'salable' => $object]
  17. );
  18. $this->setData('salable', $object->getIsSalable());
  19. return $object->getIsSalable();
  20. }

c. isAvailable()方法则是判断product type或者库存是否允许售卖

  1. public function isAvailable()
  2. {
  3. return $this->getTypeInstance()->isSalable($this) || $this->_catalogProduct->getSkipSaleableCheck();
  4. }
  5. public function isSalable($product)
  6. {
  7. $salable = $product->getStatus() == \Magento\Catalog\Model\Product\Attribute\Source\Status::STATUS_ENABLED;
  8. if ($salable && $product->hasData('is_salable')) {
  9. $salable = $product->getData('is_salable');
  10. }
  11. return (bool)(int)$salable;
  12. }

d. isInStock()方法仅仅检查产品的有无库存

  1. public function isInStock()
  2. {
  3. return $this->getStatus() == \Magento\Catalog\Model\Product\Attribute\Source\Status::STATUS_ENABLED;
  4. }

综上

isInStock() —— 检查产品有无库存(检查产品Stock Status)
isAvailable() —— 根据产品的状态,库存状态,可视和网站等信息返回true或false
isSaleable()和isSalable() —— 与isAvailable()类似,但此方法在返回值之前添加了eventcatalog_product_is_salable_after,用户可以根据此事件加入自己的逻辑,从而使产品可售与否。


既然找到了问题,那我们就在后台正确配置产品信息,解决当前问题。