我需要Prestashop :检查产品组合的库存。如果组合已缺货,请将默认组合设置为库存中的其他组合。
这样,商店就不会显示:“缺货”在产品上,在类别上列出。没有意义,因为产品没有缺货,只有一个组合缺货。
另一个解决方案是:缺货标签检查是否有任何组合的股票。请不要通知任何模块。
举例:
小、中、大的T恤衫。小:0股,中型: 10股,大: 10股。Prestashop现在将显示T-恤在前面的缺货,除非我手动检查中或大的默认大小。
发布于 2019-07-12 16:41:03
您需要修改ProductController(/controllers/front/ProductController.php)
基本上,我所做的就是检查默认属性是否有股票。如果有股票,那就没有必要去其他地方寻找。如果没有库存,则获取所有产品属性并遍历这些属性。一旦找到了带有库存的属性,就删除旧的默认属性,并将found设置为默认属性。
在productController类中添加此方法
/*
start set default based on stock
*/
public function getProductAttributes()
{
$sql = "SELECT * FROM " . _DB_PREFIX_ . "product_attribute WHERE
id_product = ". (int) $this->product->id;
return Db::getInstance()->executeS($sql);
}
public function getProductStock($id_product_attribute)
{
return StockAvailable::getQuantityAvailableByProduct($this->product->id,
$id_product_attribute, $this->context->shop->id);
}
public function checkDefault()
{
$id_product_attribute = Product::getDefaultAttribute($this->product->id);
$stk = (int) $this->getProductStock($id_product_attribute);
if( $stk > 0){
return true;
}
return false;
}
public function checkAttributeStock( $id_product_attribute)
{
$stk = $this->getProductStock($id_product_attribute);
if( $stk > 0){
return true;
}
return false;
}
public function setDefaultBasedOnStock()
{
if($this->checkDefault()){
return true;
}
$product_atts = $this->getProductAttributes();
if(count($product_atts) >0){
foreach($product_atts as $attri){
if($this->checkAttributeStock($attri['id_product_attribute'])){
$this->product->deleteDefaultAttributes();
$this->product->setDefaultAttribute($attri['id_product_attribute']);
break;
}
}
}
}
/*
end set default based on stock
*/
然后,需要在父级::init ()之后调用init方法中的setDefaultBasedOnStock方法;
public function init()
{
parent::init();
$this->setDefaultBasedOnStock();
// here is the rest of init code ......
//Do not delete the rest of init code
}
请不要删除init()方法代码的其余部分,只需添加以下一行$this->setDefaultBasedOnStock();::init();
最好的方法是重写productController
与修改productController类不同,您可以在/重写/控制器/前端/文件夹中创建productController覆盖类
class ProductController extends ProductControllerCore {
// add all the methods above
// including the init method
}
//添加覆盖之后,如果启用了预存储缓存,则可能需要清除缓存。
https://stackoverflow.com/questions/49101608
复制相似问题