我想更改现有的prestashop模块而不复制它并创建新模块。我知道可以在prestashop中覆盖.tpl文件,但是可以用php类做同样的事情吗?例如,我想更改blockcart,以便它可以挂在顶部。由于原始版本没有那个钩子我需要更改install()函数!我不能改变原始来源(这不是坏主意......)文件我需要通过继承blockcart模块来覆盖install()函数。是否可以这样做,我可以在哪里找到例子?
答案 0 :(得分:10)
我使用自己的覆盖到FrontController类,允许在tpl文件中的任意点显示模块输出 - 这意味着模块不需要支持特定的钩子。它是通过一个smarty插件实现的,所以你可以使用:
{plugin module='blockcart' hook='rightColumn'}
上面将强制模块输出如果挂钩到上面插入标签的右列(它可以在任何tpl文件中的任何位置)显示的内容。您可以从右列“取消挂钩”模块,以便它只显示您希望它使用此技术的位置。我在生产现场使用它非常成功。
有一系列文章描述了它的工作原理(带有所需的代码):
答案 1 :(得分:2)
在Prestashop 1.4中,您可以覆盖核心类和模块模板 今天,这是不可能覆盖模块php文件,但我们正在努力。
答案 2 :(得分:0)
从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/
答案 3 :(得分:0)
在override \ modules \ blockcart \ blockcart.php中(如果它还不存在则创建它)
<?php
class BlockCartOverride extends BlockCart
{
public function hookDisplayTop($params)
{
return parent::hookTop($params);
}
}
?>
像这样你可以覆盖任何默认或自定义钩子上可挂钩的模块。 不要忘记删除cache / class_index.php以使覆盖工作:)
答案 4 :(得分:0)
请记住,在当今的1.7.x时代,您可以覆盖模块主类,但不能覆盖控制器。为了能够覆盖控制器,您必须覆盖核心类(以检测任何可能的覆盖),然后执行您喜欢的任何事情。或者,您必须将原始文件作为备份,并将修改后的文件放在安装位置,而相反的过程则在卸载位置。