Отправка переменных в макет в Zend Framework
В моем проекте у меня есть ряд динамических элементов, которые последовательно отображаются на каждой странице. Я поместил их в свой layout.phtml
Мой вопрос: как я могу отправлять переменные в свой макет из моих контроллеров?
Если я хочу отправлять вещи с моего контроллера, я могу использовать:
$this->view->whatever = "foo";
И получите его в представлении с помощью
echo $this->whatever;
Я не могу понять, как сделать то же самое с моим макетом. Возможно, есть лучший способ решить проблему?
Ответы
Ответ 1
Макет - это представление, поэтому метод назначения переменных одинаковый. В вашем примере, если вы должны были эхо-$ this- > независимо от вашего макета, вы должны увидеть тот же результат.
Одна из распространенных проблем заключается в том, как назначать переменные, которые вы используете на каждой странице, в макет, поскольку вам не нужно дублировать код в каждом действии контроллера. Одним из решений этого является создание плагина, который назначает эти данные до отображения макета. Например:.
<?php
class My_Layout_Plugin extends Zend_Controller_Plugin_Abstract
{
public function preDispatch(Zend_Controller_Request_Abstract $request)
{
$layout = Zend_Layout::getMvcInstance();
$view = $layout->getView();
$view->whatever = 'foo';
}
}
затем зарегистрируйте этот плагин с помощью фронтального контроллера, например.
Zend_Controller_Front::getInstance()->registerPlugin(new My_Layout_Plugin());
Ответ 2
Без использования помощников или плагинов выполните:
Zend_Layout::getMvcInstance()->assign('whatever', 'foo');
После этого вы можете использовать следующее в своем макете:
<?php echo $this->layout()->whatever; ?>
Это напечатает "foo".
Ответ 3
У меня реализован базовый контроллер, который расширяются все остальные контроллеры.
Итак, у меня есть контроллер...
<?php
class BaseController extends Zend_Controller_Action
{
public function init()
{
$this->view->foo = "bar";
}
}
и в макете и/или просмотре
<?= $this->foo ?>
Ответ 4
Стандартные переменные представления доступны, если вы используете макет внутри MVC. В файл начальной загрузки включите это:
Zend_Layout::startMvc();
Затем вы должны сообщить каждому контроллеру (или даже каждому действию, если требуется гранулированный контроль над несколькими различными макетами), какой макет использовать. Я поместил мой в init() каждого контроллера. Вот пример, если ваш файл макета называется layout.phtml:
$this->_helper->layout->setLayout('layout');
Ответ 5
Ну, я думаю, у вас может быть другое решение, создав помощник вида. Создайте файл в приложении /views/helper и назовите его, когда захотите abc.php
, затем поместите туда следующий код.
class Zend_View_helper_abc {
static public function abc() {
$html = 'YOUR HTML';
return $html;
}
}
Итак, вы можете использовать этот помощник в макете, как..
<?= $this->abc() ?>
Ответ 6
class IndexController extends Zend_Controller_Action
{
public function init()
{
$this->_layout = $this->_helper->layout->getLayoutInstance();
$this->_layout->whatever = $this->view->render('test.phtml);
}
}
В файле макета вы можете позвонить
<p><?php echo $this->layout()->whatever ?>
Если в некоторых действиях, если вы не хотите этого раздела, выполните следующие действия:
public function viewAction()
{
$this->_layout->whatever = null;
}
Ответ 7
В качестве побочного примечания, если вы отправляете json в какой-то момент вашего приложения, будьте осторожны, чтобы переменные глобального вида не отправлялись с ответом.
Ответ 8
Просмотр помощников также является хорошей идеей. У меня был веб-сайт электронной торговли, в котором у меня был 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[]=
В представлениях/помощниках у меня был файл под названием Menus:
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();
Надеюсь, что это поможет кому-то, кому нужно донести данные из базы данных, чтобы отобразить макет.