2015-12-16 3 views
0

В разделе клиента клиента я хотел бы отобразить меню учетной записи пользователя (которое мы можем увидеть по умолчанию при достижении URL-адреса /my-account) в качестве бокового столбца на некоторых других контроллерах, например, связанных с «/ my-adresses», «/ identity» pages ..Контроллеры, разделяющие части: как включить выход контроллера с другого вида контроллера в Prestashop> = 1.5?

Я думал, что мне нужно будет создать еще один контроллер, целью которого было бы собирать информацию о меню и отображать только меню <ul>. Тогда я мог бы переопределить контроллеры, такие как MyAccountController, IdentityController, чтобы включить этот прежний Ctrl, а затем отобразить его содержимое как часть представлений этих двух других видов контроллеров.

Так как можно загрузить определенный контроллер из другого, чтобы отображать общие представления между страницами? Каков правильный/чистый способ сделать это?

Я слышал о $this->getController(), но я не нашел ни одного фрагмента или реализации того, чего бы я хотел достичь. Я новичок в Prestashop, но даже если код кажется ясным, я не понимаю здесь.

Спасибо!

ответ

0

После того, как немного глубже в источники, я в конечном итоге перемещение меню (первоначально часть из MyAccountControllerCore псевдонима my-account шаблона) в новый контроллер «MyAccountMenuController», в /override/controllers/front/.

<?php 
// In /override/controllers/front/MyAccountMenuController.php 
// The "exposer" controller 
public function display() 
{ 
    // Do what ever you want to pass specific variables 

    if (! $this->template) { 
     throw new Exception(get_class($this) . '::display() : missing template.'); 
    } 
    $this->context->smarty->display($this->template); 
    return true; 
} 

Я теперь в состоянии импортировать это меню, добавив следующий фрагмент кода внутри initContent() метода каждого контроллера, которые являются частью раздела счета клиента (это означает, что каждый из них должен быть перегружен, для получения дополнительной информации о главенствующие контроллеры см documentation):

<?php 
// In /override/controllers/front/MyAccountController.php 
// The "consumer" controller 
public function initContent() { 
    // ... 
    // Importing the customer area's menu 
    $menuController = $this->getController('MyAccountMenuController'); 
    ob_start(); 
    $menuController->run(); 
    $this->context->smarty->assign('myAccountMenu', ob_get_clean()); 
} 

Я не думаю, что первоначальная цель getController методы (находится в классе ControllerCore) должна была включать в себя другой выход контроллера, по крайней мере, в Prestashop 1.5. Тем не менее, для меня этот подход намного чище, чем дублирующий код.

Если у вас есть лучший (более чистый) подход для реализации такого механизма, пожалуйста, дайте мне знать!

Любые мысли?

Смежные вопросы