Переопределить контроллер модуля Prestashop: где разместить php-файл?

Переопределить контроллер модуля Prestashop: где разместить php-файл?

17.11.2015 01:30:02 Просмотров 68 Источник

Я пытаюсь переопределить модуль в Prestashop. Я успешно переопределил шаблоны модулей, но я не могу успешно перезаписать контроллер модулей.

Где должен быть размещен новый файл класса контроллера?

Я пробовал следующие места, но они не добавляют новое поведение (ничего не меняют):

~ / переопределяет / modules / blockwishlist / controllers / front/mywishlist.РНР
~/темы/MY_THEME/модули/blockwishlist/контроллеры/передний/mywishlist.РНР

Согласно моему предыдущему вопросу, я мог бы сделать это, отредактировав основные классы (любезно предложенный u / Sergii P), но я уверен, что есть стандартный способ сделать это, который не включает редактирование основных классов?

Для справки; вот содержание mywishlist.php:

<?php

if (!defined('_CAN_LOAD_FILES_'))
    exit;

//class BlockWishListMyWishListModuleFrontController extends BlockWishListMyWishListModuleFrontControllerCore // extends ModuleFrontController
class BlockWishListMyWishListModuleFrontControllerOverride extends BlockWishListMyWishListModuleFrontController
{

    public function __construct()
    {
        parent::__construct();
    }

    /**
     * Assign wishlist template
     */
    public function assign()
    {
        $errors = array();

        ....

        $this->setTemplate('mywishlist.tpl');
    }

}

Редактировать: у меня есть возможное решение, не будучи в состоянии переопределить ModuleFrontController класс. Цель состоит в том, чтобы добавить кнопку "Экспорт в CSV" на страницу Мои списки пожеланий, когда кнопка нажата, сервер создаст файл CSV, содержащий все продукты в этом списке пожеланий. Прежде чем я сделаю всю работу, вы можете дать совет о том, возможно ли это...

  • Поместите Хук в файл шаблона, который вызовет пользовательский Хук и будет связан с пользовательским модулем {hook h='displayExportToCsvColumn' mod='myCustomModule'}
  • Создайте пользовательский модуль, который регистрирует новый крюк, имеет метод, который отображает столбец таблицы и кнопку и имеет метод, который генерирует файл CSV.
  • Большой вопрос: Можете ли вы иметь модуль внутри модуля? Файл шаблона, который я редактирую, находится внутри модуля BlockWishlist(~/themes/MY_THEME/modules/blockwishlist/controllers/front / mywishlist.php) и тогда мой крюк вызовет мой пользовательский модуль. Возможно ли это?
У вопроса есть решение - Посмотреть?

https://stackoverflow.com/questions/33745857/override-prestashop-module-controller-where-to-place-php-file#comment55268778_33745857
Это может зависеть от того, какая версия PS у вас есть. Некоторые переопределения были добавлены только в последних версиях.
https://stackoverflow.com/questions/33745857/override-prestashop-module-controller-where-to-place-php-file#comment55270775_33745857
@gskema Спасибо за ваш комментарий. У меня есть версия 1.6.1.2. Где должен быть размещен файл контроллера в этой версии PS?

Ответы - Переопределить контроллер модуля Prestashop: где разместить php-файл? / Override Prestashop Module Controller: Where to place php file?

gskema

17.11.2015 11:30:40

Насколько я мог понять, вы не можете переопределить ModuleFrontControllerна данный момент (извините, что говорю). Ключи находятся в Dispatcher::dispatch():

    case self::FC_MODULE :
        $module_name = Validate::isModuleName(Tools::getValue('module')) ? Tools::getValue('module') : '';
        $module = Module::getInstanceByName($module_name);
        $controller_class = 'PageNotFoundController';
        if (Validate::isLoadedObject($module) && $module->active) {
            $controllers = Dispatcher::getControllers(_PS_MODULE_DIR_.$module_name.'/controllers/front/');
            if (isset($controllers[strtolower($this->controller)])) {
                include_once(_PS_MODULE_DIR_.$module_name.'/controllers/front/'.$this->controller.'.php');
                $controller_class = $module_name.$this->controller.'ModuleFrontController';
            }
        }
        $params_hook_action_dispatcher = array('controller_type' => self::FC_FRONT, 'controller_class' => $controller_class, 'is_module' => 1);
    break;

Он проверяет только /modules/?/controllers/ каталог. Вы не можете переопределить ModuleFrontControllerкласс Dispatcher и заставить его сканировать переопределения ModuleFrontController.

Обычно есть способ изменить то, что вы хотите с помощью крючков, в худшем случае - ввести javascript через крючок и изменить содержимое.

https://stackoverflow.com/questions/33745857/override-prestashop-module-controller-where-to-place-php-file/33752281#comment55302931_33752281
Спасибо за ответ. Могу ли я добиться следующего с помощью крючков...То, что я пытаюсь сделать, это добавить новый столбец в таблицу списков пожеланий. В этом столбце есть кнопка "экспорт в CSV". Поэтому мне нужно будет выполнить обратную передачу в PHP-файл для создания csv-файла. Крючки-это вариант здесь?
https://stackoverflow.com/questions/33745857/override-prestashop-module-controller-where-to-place-php-file/33752281#comment55303692_33752281
К сожалению, у меня нет большого опыта работы с модулем wishlist. Если вы имеете в виду столбец в таблице HTML, то да, вы, безусловно , можете сделать это с помощью крючков, проверьте, какие крючки выполняются, выполнив error_log($hook_name)в HookCore::exec, выберите крючок, сделайте ifдля целевой конкретной страницы. Чтобы получить CSV, вам, вероятно, придется вызвать свой собственный PHP-скрипт
Dennis de Best

08.01.2019 02:27:10

Закрыть X