Передача переменных в макет после начальной загрузки ресурса макета - PullRequest
0 голосов
/ 31 января 2012

Мне пришлось создать метод в 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 или я что-то не так сделал?

Ответы [ 2 ]

0 голосов
/ 31 января 2012

В вашем контроллере (или там, где вы видите)

$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 голосов
/ 31 января 2012

Ваши помощники по видам реализуют метод setView(), напрямую или, возможно, как подклассы Zend_View_Helper_Abstract?

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

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

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

...