Zend: метод init помощника действия передает переменные в представление макета? - PullRequest
1 голос
/ 21 мая 2011

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

У меня есть этот помощник действий "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» (переданная в мой макет) не отображается.

    ВОПРОС: Почемупеременная, переданная в действие контроллера, правильно выводится, а другая, переданная в представление макета, не является?

Спасибо

Luca

Ответы [ 2 ]

2 голосов
/ 21 мая 2011

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

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

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

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

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();      

}

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

$view = Zend_Controller_Action_HelperBroker::getStaticHelper('viewRenderer')->initView();
2 голосов
/ 21 мая 2011

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

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

-

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

...