PrestaShop 1.5: Добавляем контроллер в собственный модуль(Перевод)

test

Собственный контроллер модуля

Предисловие к переводу

Статей о том как создать собственный модуль для PrestaShop в принципе достаточно. А вот на счет добавления контроллера в собственный модуль все обстоит гораздо печальнее. Так как мне нужно создать модуль для PrestaShop 1.5., а значит в любом случае читать материал на английском, заодно сразу и переведу. Может еще кому помогу, возьму, так сказать, на карму себе доброе дело )) Но вполне вероятно есть неточности перевода, а значит будьте внимательны.


Оригинал

Prestashop 1.5.x порадовала нас чудесной возможностью создавать контроллеры в модулях. Это главная задача классов ModuleFrontController и ModuleAdminController. Давайте рассмотрим их ближе(уделите особое внимание комментариям):

/*класс перегружает 2 метода и добавляет новый*/
class ModuleFrontControllerCore extends FrontController
{
    /**
     * @var Module
     */
    public $module;
    public function __construct()
    {
        $this->controller_type = 'modulefront'; //наследуем тип стандартного фронт контроллера
        $this->module = Module::getInstanceByName(Tools::getValue('module')); // экземпляр модуля
        if (!$this->module->active)
            Tools::redirect('index'); //Если модуль отключен, пользователь будет переадресован на главную страницу index.php
        $this->page_name = 'module-'.$this->module->name.'-'.Dispatcher::getInstance()->getController(); //для примера: module-belvg_storelocator-search
        parent::__construct();
    }
    /**
     * Подключаем шаблон модуля
     *
     * @param string $template
     */
    public function setTemplate($template)
    {
        if (Tools::file_exists_cache(_PS_THEME_DIR_.'modules/'.$this->module->name.'/'.$template))
            $this->template = _PS_THEME_DIR_.'modules/'.$this->module->name.'/'.$template; //если файл шаблона располагается в корневой директории
        elseif (Tools::file_exists_cache($this->getTemplatePath().$template))
            $this->template = $this->getTemplatePath().$template; //иначе используем файл в директории модуля module_dir/views/templates/front/
        else
            throw new PrestaShopException("Template '$template'' not found"); //если и тут не нашли файл шаблона, генерируем исключение(ошибку)
    }
    /**
     * Получаем путь к шаблону фронт-офиса для модуля
     *
     * @return string
     */
    public function getTemplatePath()
    {
        return _PS_MODULE_DIR_.$this->module->name.'/views/templates/front/';
    }
}
/*класс перегружает 2 метода и добавляет новый*/
abstract class ModuleAdminControllerCore extends AdminController
{
    /**
     * @var Module
     */
    public $module;
    public function __construct()
    {
        $this->controller_type = 'moduleadmin'; //наследуем административный контроллер( AdminController's)
        parent::__construct();
        $tab = new Tab($this->id); //Создаем вкладку в админке, если не удается то генерируем исключение
        if (!$tab->module)
            throw new PrestaShopException('Admin tab '.get_class($this).' is not a module tab');
// экземляр модуля создан
        $this->module = Module::getInstanceByName($tab->module);
        //проверяем установлен ли модуль
        if (!$this->module->id)
            throw new PrestaShopException("Module {$tab->module} not found");
    }
    public function createTemplate($tpl_name)
    {
        //$this->override_folder = Tools::toUnderscoreCase(substr($this->controller_name, 5)).'/';
        if (file_exists($this->getTemplatePath().$this->override_folder.$tpl_name) && $this->viewAccess())
            return $this->context->smarty->createTemplate($this->getTemplatePath().$this->override_folder.$tpl_name, $this->context->smarty);
        return parent::createTemplate($tpl_name);
    }
    /**
     * получаем путь для шаблона бэк-офиса модуля
     *
     * @return string
     */
    public function getTemplatePath()
    {
        return _PS_MODULE_DIR_.$this->module->name.'/views/templates/admin/';
    }
}

Перейдем от теории к практике. PrestaShop вызывает контроллер фронтенда прямо из директории модуля, достаточно создать controllers/front/mycontroller.php в директории модуля..

/*Будьте внимательны, MyModule здесь имя вашего модуля(хорошим тоном будет если название совпадает с названием директории модуля), MyController - имя вашего контроллера(хороший тон когда совпадает название файла контроллера).
*/
class MyModuleMyControllerModuleFrontController extends ModuleFrontController
{
}

Шаблоны вашего модуля могут располагатся как в корневой директории, так и в директории модуля:
module_dir/views/templates/front/

URL Modulecontroller отличается от фронт-енд контроллеров и выглядит так:
http://domain.com/index.php?fc=module&module=mymodule&controller=mycontr...

Категория: 
Share/Save

Делитесь с друзьями в социальных сетях! Оставляйте комментарии!

Share/Save

Это Вам так же может быть интересно!