Отправка переменных в макет в Zend Framework - PullRequest
38 голосов
/ 08 октября 2009

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

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

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

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

И получите его в виде с

echo $this->whatever;

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

Ответы [ 8 ]

46 голосов
/ 08 октября 2009

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

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

<?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());

43 голосов
/ 10 августа 2010

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

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

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

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

Будет напечатано "foo".

7 голосов
/ 08 октября 2009

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

Итак, у меня есть контроллер ...

<?php
class BaseController extends Zend_Controller_Action
{
  public function init()
  {
    $this->view->foo = "bar";
  }
}

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

<?= $this->foo ?>
3 голосов
/ 25 сентября 2012

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

Zend_Layout::startMvc();

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

$this->_helper->layout->setLayout('layout');
1 голос
/ 21 февраля 2013
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;
}
1 голос
/ 13 октября 2011

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

class Zend_View_helper_abc {

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

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

<?= $this->abc() ?>
0 голосов
/ 06 ноября 2013

Просмотр помощников также хорошая идея. У меня был веб-сайт электронной коммерции, на котором я имел 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();

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

0 голосов
/ 16 апреля 2012

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

...