在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。
答案 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}。希望对您有帮助。