7

我想更改现有的 prestashop 模块而不复制它并创建新的。我知道可以在 prestashop 中覆盖 .tpl 文件,但是可以用 php 类做同样的事情吗?例如,我想改变 blockcart 以便它可以挂在上面。由于原始版本没有那个钩子,我需要更改 install() 函数!我无法更改原始源文件(这不是一个好主意......)我需要通过继承 blockcart 模块来覆盖 install() 函数。是否有可能这样做以及在哪里可以找到示例?

4

5 回答 5

11

我使用自己的 FrontController 类覆盖来允许在 tpl 文件中的任意点显示模块输出——这意味着模块不需要支持特定的钩子。它是通过 smarty 插件实现的,因此您可以例如使用:

{plugin module='blockcart' hook='rightColumn'}

上面将强制模块输出如果挂钩到插入上述标记的右列(可以是任何 tpl 文件中的任何位置),它将显示的内容。您可以从右栏中“取消挂钩”模块,以便使用此技术仅显示您希望它显示的位置。我已在生产站点上使用它并取得了巨大成功。

有一系列文章描述了它是如何工作的(使用所需的代码),请访问:

Prestashop 1.4 插件

于 2011-09-02T22:54:33.330 回答
2

在 Prestashop 1.4 中,您可以覆盖核心类和模块模板 今天,这是不可能覆盖模块 php 文件的,但我们正在努力。

于 2011-08-31T09:20:09.243 回答
1

在 override\modules\blockcart\blockcart.php (如果它不存在则创建它)

<?php 
    class BlockCartOverride extends BlockCart
    {
        public function hookDisplayTop($params)
        {
            return parent::hookTop($params);
        }
    }
?>

像这样,您可以覆盖任何模块以在任何默认或自定义挂钩上挂钩。不要忘记删除 cache/class_index.php 以使覆盖工作:)

于 2018-05-15T13:44:59.660 回答
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/

于 2016-05-30T22:10:31.060 回答
0

请记住,在 1.7.x 时代 - 现在 - 您可以覆盖模块主类,但不能覆盖控制器。为了能够覆盖控制器,您必须覆盖核心类(以检测任何可能的覆盖),然后做任何你喜欢的事情。或者,您必须获取原始文件作为备份,并在安装时将修改后的文件放在同一个位置,在卸载时执行相反的过程。

于 2020-09-08T22:21:00.037 回答