Zend: передает ли метод инициализации action helper переменные в layout view?

#php #zend-framework #layout #controller #helpers

#php #zend-framework #макет #контроллер #помощник

Вопрос:

ПРОБЛЕМА: я не могу передать свои переменные в свой пользовательский макет из метода инициализации action helper.

У меня есть этот помощник по действию «My_Action_Helper_Initializer»:

 class My_Action_Helper_Initializer extends Zend_Controller_Action_Helper_Abstract
{
 public function init()
 {
  $controller=$this->getActionController();
  //variable passed to controller's view
  $controller->view->flop="FLOOP!!";
  //variable passed to controller
  $controller->boom="BOOM!!";
 }
}
  

В моем контроллере «IndexController»:

 class IndexController extends Zend_Controller_Action
{ 
  public function indexAction()
  {
    //print the variable passed from action helper
    echo $this->boom;
  }
}   
  

затем в моем «layout.phtml»:

 //print variable passed from action helper
echo $this->flop;
  
  • Таким образом, переменная «boom», отображаемая действием контроллера, отображается правильно.

  • Переменная «flop» (переданная в мой макет) не отображается.

    ВОПРОС: Почему переменная, переданная в controller action, выводится правильно, а другая, переданная в layout view, — нет?

Спасибо

Luca

Комментарии:

1. echo $ this->boom; в скрипте layout?

2. Моей ошибкой было $ this-> flop спасибо

Ответ №1:

Когда вызывался init () вашего помощника, init() ViewRenderer еще не был. Это из-за порядка в стеке помощников.

Если вы включите отчет об ошибках строгих стандартов, вы должны увидеть что-то вроде этого в вашем помощнике «Создание объекта по умолчанию из пустого значения в …»

Вам следует рассмотреть возможность переноса вашего кода в preDispatch(), поскольку для инициализации помощника следует использовать метод init().

Чтобы получить экземпляр view для контроллера:

 function getView()
{
    $controller = $this->getActionController();
    if($view = $controller->view) {
        return $view;
    }

    if($this->getFrontController()->getParam('noViewRenderer') {
        return $controller->initView();//this view instance will not be used in Zend_Layout!
    }
    $vr = Zend_Controller_Action_HelperBroker::getStaticHelper('viewRenderer');
    return $vr->initView();      

}
  

если вы хотите передать параметр в layout, то используйте

 $view = Zend_Controller_Action_HelperBroker::getStaticHelper('viewRenderer')->initView();
  

Комментарии:

1. «Когда вызывался init() вашего помощника, init() ViewRenderer еще не был.. Вам следует рассмотреть возможность переноса вашего кода в preDispatch()». Вы имеете в виду, что если я использую predispatch () для моего помощника по действию вместо этого .., инициализация ViewRenderer уже была бы вызвана??

2. @luca да, но только если noViewRender = true не был установлен в качестве параметра front controller. ps: проверьте обновленный код. Удаленная часть, которой там не было.

3. @Xerkus не запускает predispatch первым, чем init? Я не понимаю, извините! я думал, проблема заключалась в том, что когда action helper устанавливает переменную view, само представление уже было set..so благодаря предварительному отображению кода моего action helper с помощью predispatch все работает..

4. Я также попытался расположить _initActionHelpers перед _initView в моем bootstrap, и метод init () моего action Helper снова работает!..

5. помощники action init() вызываются в конструкторе Zend_Controller_Action_HelperBroker. Посмотрите на строку 132 в Zend_Controller_Action. Это точка, с которой все начинается.

Ответ №2:

Помощники Action называются так, потому что они позволяют избежать дублирования кода в действиях. Все, что вы делаете в action helper, доступно действиям, но не представлению. Это нормальное поведение actions, пока вы не передаете что-либо в view, view об этом не знает. Если вы хотите избежать дублирования кода в своих представлениях, создайте помощников просмотра.

Иногда может иметь смысл создать помощник action и соответствующий помощник view.

preDispatch работает (), а init () — нет, потому что с помощью init вы фактически не подключаетесь к процессу отправки.

Комментарии:

1. Я отредактировал свой вопрос, который передается в макет.. Я перешел на view helper, но я заметил, что изменение моего метода ‘init ()’ на ‘predispatch’ все работает ..? почему?

2. 1 для помощника action и соответствующего помощника view. Такой подход намного лучше, чем выяснять, откуда берутся эти чертовы параметры view несколько недель спустя.