Отправка переменных в макет в Zend Framework

В моем проекте у меня есть ряд динамических элементов, которые постоянно находятся на каждой странице. Я поместил их в свой layout.phtml

Мой вопрос: как я могу отправлять переменные в мой макет из моих controllerов?

Если я хочу отправить вещи с моего controllerа, я могу использовать:

$this->view->whatever = "foo"; 

И получить его в представлении с

 echo $this->whatever; 

Я не могу понять, как сделать то же самое с моим макетом. Возможно, есть лучший способ решить эту проблему?

    Макет это представление, поэтому метод назначения переменных одинаковый. В вашем примере, если вы должны были эхо-$ this-> независимо от вашего макета, вы должны увидеть тот же результат.

    Одна из распространенных проблем заключается в том, как назначать переменные, которые вы используете на каждой странице, в макет, так как вы не захотите дублировать код в каждом действии controllerа. Одним из решений этого является создание плагина, который назначает эти данные до отображения макета. Например:

     getView(); $view->whatever = 'foo'; } } 

    затем зарегистрируйте этот плагин с помощью фронтального controllerа, например

    Zend_Controller_Front::getInstance()->registerPlugin(new My_Layout_Plugin());

    Без использования помощников или плагинов выполните:

     Zend_Layout::getMvcInstance()->assign('whatever', 'foo'); 

    После этого вы можете использовать следующее в своем макете:

     layout()->whatever; ?> 

    Это напечатает «foo».

    У меня реализован базовый controller, который расширяют все остальные controllerы.

    Поэтому у меня есть controller …

     view->foo = "bar"; } } 

    и в макете и / или в представлении

     foo ?> 

    Стандартные переменные представления доступны, если вы используете макет внутри MVC. В файл начальной загрузки включите это:

     Zend_Layout::startMvc(); 

    Затем вы должны сообщить каждому controllerу (или даже каждому действию, если требуется гранулированный контроль над несколькими макетами), какой макет использовать. Я поместил мой в init () каждого controllerа. Вот пример, если ваш файл макета называется layout.phtml:

     $this->_helper->layout->setLayout('layout'); 

    Ну, я думаю, у вас может быть другое решение, создав хелпер-представление. Создайте файл в приложении / views / helper и назовите его, когда захотите abc.php затем abc.php следующий код.

     class Zend_View_helper_abc { static public function abc() { $html = 'YOUR HTML'; return $html; } } 

    Поэтому вы можете использовать этот помощник в макете, как ..

     abc() ?> 
     class IndexController extends Zend_Controller_Action { public function init() { $this->_layout = $this->_helper->layout->getLayoutInstance(); $this->_layout->whatever = $this->view->render('test.phtml); } } 

    В файле макета вы можете позвонить

     

    layout()->whatever ?>

    Если в некоторых действиях, если вы не хотите этого раздела, выполните:

     public function viewAction() { $this->_layout->whatever = null; } 

    В качестве побочного примечания, если вы отправляете json в какой-то момент вашего приложения, будьте осторожны, чтобы переменные глобального вида не отправлялись с ответом.

    Просмотр помощников также является хорошей идеей. У меня был веб-сайт электронной торговли, в котором у меня был layout.phtml с меню с категориями и подкатегориями, которые мне нужно было вывести из базы данных.

    Для этого я сделал следующее:

    Bootstrap.php:

     protected function _initHelperPath() { $view = $this->bootstrap('view')->getResource('view'); $view->setHelperPath(APPLICATION_PATH . '/views/helpers', 'View_Helper'); } 

    application.ini:

     resources.view[]= 

    В представлениях / помощниках у меня был файл под названием «Меню»:

     class View_Helper_Menus extends Zend_View_Helper_Abstract { public function categories(){ $categories = new Application_Model_DbTable_Categories(); return $categories->fetchAll(); } public function subCategories(){ $subCategories = new Application_Model_DbTable_SubCategories(); return $subCategories->fetchAll(); } } 

    В layout.phtml мне просто нужно было вызвать конкретный помощник и вызвать из него методы:

     $menu = $this->getHelper('Menus'); $categories = $menu->categories(); $subCategories = $menu->subCategories(); 

    Надеюсь, что это поможет кому-то, кто должен принести данные из базы данных, чтобы отобразить макет.

    Давайте будем гением компьютера.