首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >基于股票Prestashop 1.7自动设置默认组合

基于股票Prestashop 1.7自动设置默认组合
EN

Stack Overflow用户
提问于 2018-03-04 23:28:56
回答 1查看 1.4K关注 0票数 1

我需要Prestashop :检查产品组合的库存。如果组合已缺货,请将默认组合设置为库存中的其他组合。

这样,商店就不会显示:“缺货”在产品上,在类别上列出。没有意义,因为产品没有缺货,只有一个组合缺货。

另一个解决方案是:缺货标签检查是否有任何组合的股票。请不要通知任何模块。

举例:

小、中、大的T恤衫。小:0股,中型: 10股,大: 10股。Prestashop现在将显示T-恤在前面的缺货,除非我手动检查中或大的默认大小。

EN

回答 1

Stack Overflow用户

发布于 2019-07-12 16:41:03

您需要修改ProductController(/controllers/front/ProductController.php)

基本上,我所做的就是检查默认属性是否有股票。如果有股票,那就没有必要去其他地方寻找。如果没有库存,则获取所有产品属性并遍历这些属性。一旦找到了带有库存的属性,就删除旧的默认属性,并将found设置为默认属性。

在productController类中添加此方法

代码语言:javascript
运行
复制
   /* 
          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方法;

代码语言:javascript
运行
复制
    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覆盖类

代码语言:javascript
运行
复制
class ProductController extends ProductControllerCore {  
    // add all the methods above
    // including the init method

}

//添加覆盖之后,如果启用了预存储缓存,则可能需要清除缓存。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49101608

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档