问题描述
|
我想更改现有的prestashop模块,而不复制它并创建一个新模块。我知道可以在prestashop中覆盖.tpl文件,但是是否可以对PHP类做同样的事情?例如,我想更改blockcart,以便可以将其挂在顶部。由于原始版本没有该挂钩,因此我需要更改install()函数!我无法更改原始源文件(不是个好主意...)文件,我需要通过继承blockcart模块来覆盖install()函数。是否可以这样做?在哪里可以找到示例?
解决方法
我对FrontController类使用了自己的重写,以允许在tpl文件中的任意点显示模块输出-这意味着该模块不需要支持特定的钩子。它是通过smarty插件实现的,因此您可以使用例如:
{plugin module=\'blockcart\' hook=\'rightColumn\'}
上面的内容将强制模块输出,如果钩到插入了上面的标签的右列(可以在任何tpl文件中的任何位置),它将输出显示的内容。您可以从右列“摘机”该模块,以使其仅显示使用此技术所需的位置。我已经在生产现场成功使用了它。
您可以在以下位置找到一系列描述其工作方式(带有所需代码)的文章:
Prestashop 1.4插件
,在Prestashop 1.4中,您可以覆盖核心类和模块模板
今天,这不可能覆盖模块php文件,但我们正在研究中。
,从PrestaShop的1.6.0.11版本开始,有一项新功能允许开发人员覆盖模块的实例类。
通过扩展模块的实例类来覆盖它
要覆盖模块的实例类,您必须对其进行扩展,为扩展的类赋予相同的名称,并添加Override后缀:
<?php
if (!defined(\'_PS_VERSION_\'))
exit;
class BlockUserInfoOverride extends BlockUserInfo
{
public function hookDisplayNav($params)
{
return \'<div class=\"header_user_info\"><a>Test</a></div>\';
// return $this->display(__FILE__,\'nav.tpl\');
}
}
资料来源:http://build.prestashop.com/howtos/module/how-to-override-modules/
,在override \\ modules \\ blockcart \\ blockcart.php中(如果尚不存在,则创建它)
<?php
class BlockCartOverride extends BlockCart
{
public function hookDisplayTop($params)
{
return parent::hookTop($params);
}
}
?>
像这样,您可以覆盖任何模块以使其可挂在任何默认或自定义钩子上。
不要忘记删除cache / class_index.php以使覆盖生效:)