#prestashop
#prestashop
Вопрос:
Я хотел бы изменить существующий модуль prestashop, не копируя его и не создавая новый. Я знаю, что можно переопределить файлы .tpl в prestashop, но возможно ли сделать то же самое с классами php? Например, я хотел бы изменить blockcart так, чтобы его можно было подключить сверху. Поскольку в оригинальной версии этого хука нет, мне нужно изменить функцию install ()! Я не могу изменить исходный файл (это было бы плохой идеей, не так ли …), Мне нужно переопределить функцию install (), унаследовав модуль blockcart. Возможно ли это сделать и где я могу найти пример?
Ответ №1:
Я использую свое собственное переопределение для класса FrontController, чтобы разрешить отображение выходных данных модуля в произвольных точках в файлах tpl — это означает, что модулю не нужно поддерживать определенный хук. Она реализована с помощью плагина smarty, так что вы можете, например, использовать:
{plugin module='blockcart' hook='rightColumn'}
Вышесказанное заставит модуль выводить то, что он отображал бы, если бы был подключен к правому столбцу, в который вставлен вышеуказанный тег (который может быть где угодно в любом файле tpl). Вы можете «отцепить» модуль от правого столбца, чтобы он отображался только там, где вы хотите, используя этот метод. Я с большим успехом использовал ее на производственной площадке.
Есть серия статей, описывающих, как это работает (с требуемым кодом), доступных на:
Комментарии:
1. Я всегда чувствовал, что, хотя система модулей и подключений работает во многих случаях, бывают случаи, когда она просто слишком негибкая. Рад, что вы нашли это полезным.
2. Отличный Пол! Кстати, могу ли я передать некоторые параметры в хук модуля? Спасибо!
3. Безусловно, вы можете использовать аргументы = хотя это должен быть массив.
Ответ №2:
В Prestashop 1.4 вы можете переопределять классы ядра и шаблоны модулей Сегодня переопределить php-файл модуля невозможно, но мы работаем над этим.
Ответ №3:
в overridemodulesblockcartblockcart.php (создайте ее, если она еще не существует)
<?php
class BlockCartOverride extends BlockCart
{
public function hookDisplayTop($params)
{
return parent::hookTop($params);
}
}
?>
таким образом, вы можете переопределить любой модуль, чтобы его можно было подключать к любому стандартному или пользовательскому подключению.
не забудьте удалить cache/class_index.php чтобы переопределение сработало 🙂
Ответ №4:
Начиная с версии 1.6.0.11 PrestaShop, появилась новая функция, которая позволяет разработчикам переопределять классы экземпляров модуля.
Переопределить класс экземпляра модуля, расширив его Чтобы переопределить класс экземпляра модуля, вы должны расширить его, присвоив расширенному классу то же имя и добавив суффикс переопределения:
<?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
Ответ №5:
Имейте в виду, что в эпоху 1.7.x — в наши дни — вы можете переопределять основные классы модуля, но не контроллеры. Чтобы иметь возможность переопределять контроллеры, вы должны переопределить основные классы (чтобы обнаружить любые возможные переопределения), а затем делать все, что вам нравится. В качестве альтернативы вы должны получить исходные файлы в качестве резервной копии и поместить измененные в то же место при установке и выполнить обратную процедуру при удалении.