扩展Prestashop 1.7的正确方法

时间:2018-08-06 12:15:33

标签: prestashop

在PS 1.7文档中,我们可以多次阅读不建议使用PS覆盖系统的信息,并且不允许在PS市场中发布模块。

我们只需要使用钩子,并扩展现有的类,我知道为什么。

但是如何在我们的自定义主题中使用扩展类而不是核心类?

让我们举个例子:

我想为类别添加一个自定义字段。

在模块中,我扩展了CategoryCore类:

class Category extend CategoryCore{

     private $bottom_description
     ...
}

然后将其添加到类别的管理页面中,我可以使用一些钩子,例如displayBackOfficeCategory和actionBeforeAddCategory。

但是我不确定前面是什么:必须在某些主题模板文件中访问新变量。

在我的自定义主题中,在category.tpl模板中,$ category-> bottom_description未定义。

通过覆盖CategoryController修复此问题很容易,但是如何仅使用钩子来解决此问题?

我发现的唯一方法是使用actionFrontControllerSetMedia挂钩,如下所示:

function HookActionFrontControllerSetMedia(){
      // get my custom Category object base on url
      this->context->smarty->assign(["category_bottom_description"=>$category->buttom_description]);
   }

这看起来很棘手,在其他情况下我的新字段仍然无法访问。

那么在我的自定义变量中获取此属性的正确方法是什么?

理想情况下,每次我们找到类别对象时,新属性都应该可用,例如:$ category-> bottom_description。

1 个答案:

答案 0 :(得分:1)

不要忘记在类别类中定义一个新字段,因为在前面,您没有类实例,而是一个在ObjectPresenter类中转换的数组。因此,请按照这种方式。扩展您的Category类并添加所有必要的定义

class Category extends CategoryCore
{
    public $bottom_description;

    public function __construct($idCategory = null, $idLang = null, $idShop = null)
    {
        Category::$definition['fields']['bottom_description'] = array('type' => self::TYPE_HTML, 'lang' => true, 'validate' => 'isCleanHtml');
        $this->bottom_description = 'bottom_description'; // just to add demo data
        parent::__construct($idCategory, $idLang, $idShop);
    }
}

,然后bottom_description字段将在category.tpl中可用,但类似于数组{$ category.bottom_description}。希望对您有帮助。