#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 несколько недель спустя.