Magento 2 一些库存状态的一些疑问与异同
问题起源
{
"message": "Product that you are trying to add is not available."
}
可以看出不正常的产品“isSaleable”,”isSalable”,”isAvaliable”均为false,那么是什么导致的产品这些信息为false呢?找到这些方法一探究竟。
a. isSaleable() 只是调用了isSalable()
/**
* Alias for isSalable()
*
* @return bool
*/
public function isSaleable()
{
return $this->isSalable();
}
b. isSalable()看着很复杂的样子,但是其实它是简单的检查产品是否可售,调用了isAvailable() 方法
/**
* Check is product available for sale
*
* @return bool
*/
public function isSalable()
{
if ($this->hasData('salable') && !$this->_catalogProduct->getSkipSaleableCheck()) {
return $this->getData('salable');
}
$this->_eventManager->dispatch('catalog_product_is_salable_before', ['product' => $this]);
$salable = $this->isAvailable();
$object = new \Magento\Framework\DataObject(['product' => $this, 'is_salable' => $salable]);
$this->_eventManager->dispatch(
'catalog_product_is_salable_after',
['product' => $this, 'salable' => $object]
);
$this->setData('salable', $object->getIsSalable());
return $object->getIsSalable();
}
c. isAvailable()方法则是判断product type或者库存是否允许售卖
public function isAvailable()
{
return $this->getTypeInstance()->isSalable($this) || $this->_catalogProduct->getSkipSaleableCheck();
}
public function isSalable($product)
{
$salable = $product->getStatus() == \Magento\Catalog\Model\Product\Attribute\Source\Status::STATUS_ENABLED;
if ($salable && $product->hasData('is_salable')) {
$salable = $product->getData('is_salable');
}
return (bool)(int)$salable;
}
d. isInStock()方法仅仅检查产品的有无库存
public function isInStock()
{
return $this->getStatus() == \Magento\Catalog\Model\Product\Attribute\Source\Status::STATUS_ENABLED;
}
综上
isInStock() —— 检查产品有无库存(检查产品Stock Status)
isAvailable() —— 根据产品的状态,库存状态,可视和网站等信息返回true或false
isSaleable()和isSalable() —— 与isAvailable()类似,但此方法在返回值之前添加了eventcatalog_product_is_salable_after,用户可以根据此事件加入自己的逻辑,从而使产品可售与否。
既然找到了问题,那我们就在后台正确配置产品信息,解决当前问题。