使用 Prestashop 1.6 在模块中获取产品类别名称

Posted

技术标签:

【中文标题】使用 Prestashop 1.6 在模块中获取产品类别名称【英文标题】:Get Product Category Name In Module using Prestashop 1.6 【发布时间】:2016-03-23 10:17:02 【问题描述】:

我为 prestashop 创建了自己的模块(目前非常基本)。

我想为产品添加一些自定义(类似于 Attribute Wizard Pro ) 最终目标:我希望我的模块根据产品所在的类别在产品页面上显示一个小表格(每个类别的表格略有不同) - 并且在购买产品时会保存该表格的结果。

我想将表单放入 RightColumnProduct - 我可以通过在此挂钩中访问它并调用我创建的 TPL 来做到这一点。

public function hookDisplayRightColumnProduct()

    /* Place your code here. */
    /*Get the Current Category name to see which TPL to show*/


    return $this->display(__FILE__,'views/hooks/mytpl.tpl');

我需要做的是访问当前产品的类别名称,但事实证明这很难做到。

我尝试了各种解决方案都没有成功。

【问题讨论】:

【参考方案1】:

此 sn-p 将显示默认产品类别的名称。

$product = $this->context->controller->getProduct(); $category = new Category((int)$product->id_category_default, (int)$this->context->language->id); echo $category->name;

【讨论】:

这行得通 - 但最终的回声应该是:echo $category->name;谢谢!【参考方案2】:

钩子DisplayRightColumnProduct() 没有任何参数作为参数传递给它,因此要获取类别名称或任何其他信息,我们必须再次重建用户正在访问的产品的所有数据。 我们还必须了解一些产品的属性:

    产品可以有多个类别,所以用户可以关注 进入产品页面的不同路径。

    产品也可以直接访问,在这种情况下我们没有 有关应显示哪个类别名称的信息。

所以在 DisplayRightColumnProduct 函数中,我将执行以下步骤:

//retrieve the product id from the $_GET, and instanciate the object to have it ready for any functionality we have to create.
    $product = new Product(Tools::getValue('id_product'), false, $this->context->cookie->id_lang);

//by simulating what the ProductController does we are going to get the category of the product
                    $id_category = false;

                    if (isset($_SERVER['HTTP_REFERER']) && $_SERVER['HTTP_REFERER'] == Tools::secureReferrer($_SERVER['HTTP_REFERER']) // Assure us the previous page was one of the shop
                        && preg_match('~^.*(?<!\/content)\/([0-9]+)\-(.*[^\.])|(.*)id_(category|product)=([0-9]+)(.*)$~', $_SERVER['HTTP_REFERER'], $regs))
                    
                        // If the previous page was a category and is a parent category of the product use this category as parent category
                        $id_object = false;
                        if (isset($regs[1]) && is_numeric($regs[1]))
                            $id_object = (int)$regs[2];
                        elseif (isset($regs[5]) && is_numeric($regs[5]))
                            $id_object = (int)$regs[6];
                        if ($id_object)
                        
                            $referers = array($_SERVER['HTTP_REFERER'],urldecode($_SERVER['HTTP_REFERER']));
                            if (in_array($this->context->link->getCategoryLink($id_object), $referers)) 
                                $id_category = (int)$id_object;
                            elseif (isset($this->context->cookie->last_visited_category) && (int)$this->context->cookie->last_visited_category && in_array($this->context->link->getProductLink($id_object), $referers))
                                $id_category = (int)$this->context->cookie->last_visited_category;
                        

                    
//else if we have accessed the product page directly, we have just one way to get the category and it's to retrieve the default from the product object.
                    if (!$id_category || !Category::inShopStatic($id_category, $this->context->shop) || !Product::idIsOnCategoryId((int)$product->id, array('0' => array('id_category' => $id_category))))
                        $id_category = (int)$product->id_category_default;
                    $category = new Category((int)$id_category, (int)$this->context->cookie->id_lang);

//now we have the category object at our disposal so to get the name, we can simply refer to the property:
return $category->name;

【讨论】:

以上是关于使用 Prestashop 1.6 在模块中获取产品类别名称的主要内容,如果未能解决你的问题,请参考以下文章

根据 prestashop 中的模块状态禁用覆盖的 tpl 文件

将产品添加到 Prestashop 1.6 中特定商店的购物车(以编程方式)

Prestashop 1.6 如何在 Multistor 中允许缺货订单

如何在 prestashop 1.7 中向 cms 页面添加挂钩

在产品页面中使用 Prestashop 模块 tpl 变量

Prestashop 1.7 模块目录数据未找到