2011-05-26 83 views
8

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

回答

11

我使用我自己的覆盖到FrontController类,以允许在tpl文件中的任意点显示模块输出 - 这意味着模块不需要支持特定的钩子。它通过一个智者插件实现的,所以你可以例如使用:

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

以上将强制模块输出什么,如果钩到上面的标签插在右列会显示(可任何tpl文件中的任何地方)。您可以从右栏中“解除”模块,以便它仅显示您希望使用此技术的位置。我已经在生产网站上使用它,取得了巨大的成功。

有说明它是如何工作(与所需的代码)提供了一系列的文章:

Prestashop 1.4 Plugins

+0

Wow伟大的解决方案保罗! – 2011-09-07 10:30:09

+0

我一直觉得虽然Modules和hooks系统在很多情况下都有效,但有些时候它太僵化了。很高兴你发现它很有用。 – 2011-09-08 18:02:29

+0

优秀的保罗!顺便说一下,我可以传递一些参数到模块的钩子?谢谢! – 2013-12-06 06:19:42

3

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

1

由于的PrestaShop 1.6.0.11版本中,有一个新的功能,允许开发人员重写模块的实例类。

通过 扩展它要覆盖一个模块的实例类重写模块的实例类,你必须把它扩大,从而扩展的类相同的名称和增加覆盖后缀:

<?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/