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