2012-01-31 3 views
0

Мне нужно было создать метод в Boostrap, который загружает ресурс Layout и регистрирует некоторые помощники вида.Передача переменных в макет после компоновки макета начальной загрузки

protected function _initViewHelpers() { 
    $this->bootstrap('layout'); 
    $layout = $this->getResource('layout'); 
    $view = $layout->getView(); 

    $view->registerHelper(new Application_View_Helper_LoadMenu, 'loadMenu'); 
    $view->registerHelper(new Application_View_Helper_InfoLink, 'infoLink'); 
    $view->registerHelper(new Application_View_Helper_InfoData, 'infoData'); 
} 

Теперь я передаю некоторые переменные макета (к примеру Zend_View, как всегда), но расположение не признает, что он имеет их.

Когда я перемещаю код, который регистрирует помощников, метод init() в контроллере, все в порядке. Это ошибка ZF, или я сделал это неправильно?

ответ

0

в контроллере (или там, где у вас есть вид)

$view->layout()->some_var = "Some Value"; 

в макете

<?php echo $this->layout()->some_var; ?> 

если я не хватает какой-то части вашего вопроса, дайте мне знать.

Редактировать: в противном случае другим правильным способом было бы использовать помощник-заполнитель (http://framework.zend.com/manual/en/zend.view.helpers.html#zend.view .helpers.initial.placeholder)

Редактировать 2: Убедитесь, что вы также загружаете просмотр.

$this->bootstrap('view'); 
$view = $this->getResource('view'); 
0

Помогают ли ваши посредники по представлению метода setView(), либо напрямую, либо, возможно, в качестве подклассов Zend_View_Helper_Abstract?

Если вы посмотрите на код для метода Zend_View_Abstract::registerHelper($helper, $name), вы увидите, что он проверяет наличие метода setView() в помощнике. Если он найдет такой метод, он вызывает $helper->setView($this), где $this - $view.

Здесь происходит соединение. В отсутствие этого вызова кажется, что, хотя представление будет знать об помощнике (в конце концов, вы только что зарегистрировали его), помощник не будет знать о представлении. Если хелпер пытается получить доступ к представлению, он создает новый объект , который не тот, который вы настроили в Bootstrap.

tl; dr: Вероятно, нет необходимости явно регистрировать помощники. При использовании ресурса-автозагрузчика по умолчанию и соглашения об именах классов и методов, которые, как представляется, вы используете, вы, вероятно, можете позволить встроенному плагину-загрузчику обрабатывать все экземпляры. Просто позвоните $this->myHelperMethod() в свои макеты или сценарии просмотра, и все должно быть круто.