Я разработчик аддонов для обучения в Prestashop. Я пытался решить эту проблему в течение длительного времени, как правильно переопределить файл шаблона из модуля? На данный момент я перезаписываю весь файл, копируя файл шаблона в папку переопределения из моего модуля при установке:
От:
/modules/<module>/views/templates/admin/products/informations.tpl
Для того, чтобы:
/override/controllers/admin/templates/products/informations.tpl
Переопределение всего файла просто для добавления поля ввода кажется довольно грубым.
Это работает просто отлично, но я волнуюсь, потому что, если пользователь устанавливает какой-то другой модуль, который хочет использовать тот же файл, и он повреждает, или новая версия Prestashop изменяет файл, и он больше не поддерживает новую версию. Во всех отношениях это похоже на грязное решение проблемы.
Есть ли способ переопределить только часть файла и, возможно, прямо из папки модуля? Есть ли лучший способ сделать это? Как ты это делаешь?
Чтобы переопределить шаблоны в 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
Если вашему модулю необходимо изменить какой-либо код в файле .tpl, лучше сделать это в оригинальном .tpl и поместить туда оператор IF-ELSE, который добавит ваше поле ввода, только если модуль включен. Вы не можете избежать уничтожения этих файлов, когда кто-то обновит скрипт.
Вы можете подумать о некотором решении JS, которое добавит входные данные на стороне клиента.