我是Prestashop的学习插件开发人员。我一直试图解决这个问题很长时间,你如何正确地覆盖模块中的模板文件?目前,我通过在安装时从我的模块中复制覆盖文件夹中的模板文件来覆盖整个文件:
自:
/modules/<module>/views/templates/admin/products/informations.tpl
要:
/override/controllers/admin/templates/products/informations.tpl
覆盖整个文件只是为了添加输入字段似乎非常粗糙。
这很好用,但是我很担心,因为如果用户安装了一些其他模块想要使用同一个文件并且它会损坏或者Prestashop的新版本更改了文件,那么它就不会出现问题。 t再支持新版本。在任何方式,这感觉就像一个解决问题的肮脏解决方案。
有没有办法只覆盖文件的一部分,也许直接从模块文件夹?有没有更好的方法来做到这一点?你是怎么做到的?
答案 0 :(得分:1)
要覆盖PrestaShop中的模板,您需要覆盖模块控制器中的hookDisplayOverrideTemplate
方法。
要注册您的挂钩,请将其添加到您的安装功能:
$this->registerHook('DisplayOverrideTemplate');
现在将您自己的函数版本添加到服务器.tpl文件中。
public function hookDisplayOverrideTemplate($params)
{
$controllerName = get_class($params['controller']);
$tpl = dirname(__FILE__) . '/views/templates/override/example.tpl';
if ($controllerName == 'ExampleController' && file_exists($tpl))
return $tpl;
return false;
}
在我的示例中,您需要将要覆盖的模板放在模块/views/template/override
文件夹中。
加载页面时,前端控制器classes/controller/FrontController.php
调用hookDisplayOverrideTemplate
函数,如果返回模板,则会加载,否则会加载默认模板。
我已对此进行了测试,并知道它适用于PrestaShop v1.5和v1.6
答案 1 :(得分:0)
如果您的模块需要更改.tpl文件中的某些代码,最好在oryginal .tpl中执行此操作并添加IF-ELSE语句,只有在模块打开时才会添加输入字段。当有人更新脚本时,您无法避免销毁这些文件。
您可以考虑一些将在客户端添加输入的JS解决方案。