Подтвердить что ты не робот

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

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

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

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

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

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

echo $this->whatever;

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

4b9b3361

Ответ 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();

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