Как я могу использовать несколько представлений в Zend_Application (используя Zend_Layout)? - PullRequest
3 голосов
/ 01 сентября 2010

У меня есть макет с 4 отдельными «кусками». Это:

  • Панель навигации с меню и сухарями. Это построено с использованием Zend_Navigation.
  • Боковая панель, которая показывает общие "новости" по умолчанию
  • Область содержимого, в которую будет помещен основной вывод каждого действия контроллера
  • Область заголовка, расположенная над навигацией, которая обычно отображает только некоторый стандартный текст и фотографию.

Область содержимого вписывается в традиционную модель единого представления, о которой говорится в документации для Zend_Application, а остальные три - нет. Все они имеют разумные представления по умолчанию, но контроллер должен иметь возможность переопределять их при необходимости. Например, для страницы администрирования имеет смысл переопределить представление "newsy", чтобы отобразить журнал последних административных действий, выполненных в системе.

Примеры Zend_Layout / Zend_Application, однако, все предполагают одно представление (они вызывают <?php echo $this->layout()->content; ?>.

Как можно добиться такого переопределения макета? Единственное решение, о котором я подумал, - это хранить переопределенные Zend_View с внутри Zend_Registry, но это похоже на скрепление вещей клейкой лентой;)

Ответы [ 2 ]

4 голосов
/ 01 сентября 2010

Я считаю, что то, что вы имеете в виду, называется «Именованные сегменты».Объект ответа Zend Framework поддерживает эти так называемые «именованные сегменты» и позволяет вам разделять содержимое тела на разные сегменты.

Например, возьмите следующий файл макета:

<div id="nav">
    <?php echo $this->layout()->nav ?>
</div>
<div id="content">
    <?php echo $this->layout()->content ?>
</div>

Здесь у вас есть 2 именованных сегмента: «content» и «nav».По умолчанию выходные данные из ваших скриптов вида будут отображаться в сегменте «контент».Чтобы отобразить вывод в сегмент «nav», в контроллере можно сделать следующее:

<?php

$response = $this->getResponse();
$response->insert('nav', $view->render('nav.phtml'));

?>

Эта функция особенно полезна при использовании вместе с помощником действий ActionStack.Возьмем, к примеру, то, что вы находитесь на странице администрирования, и вы хотели бы переопределить раздел «nav», тогда вы можете определить для каждого контроллера, какую часть вы хотите визуализировать в этот сегмент.Лучший способ объяснить это будет на примере кода:

<?php

class PageController extends Zend_Controller_Action
{
    public function barAction()
    {
        // this would render the output of NavController::menuAction()
        // to the "nav" segment (note how we set the response segment in the
        // NavController in order to do this)
        $this->_helper->actionStack('menu', 'nav');
    }
}

class NavController extends Zend_Controller_Action
{
    public function menuAction()
    {
        $this->_helper->viewRenderer->setResponseSegment('nav'); 
        // do stuff
    }
}

?>
3 голосов
/ 01 сентября 2010

Обычно у вас есть макет, который содержит область заголовка, панель навигации, область содержимого и боковую панель.Область содержимого будет загружена с использованием включенного вами фрагмента содержимого $ this-> layout () ->, остальные фрагменты могут быть вызваны в основном макете или включены через.обертоны.Если вы воспользуетесь последним подходом, ваш файл макета может выглядеть примерно так:

<html>
<head>
<title><?=$this->headTitle()?></title>
</head>

<body>

<?=$this->render('_header.phtml')?>

<?=$this->render('_navigation.phtml')?>

<?=$this->render('_sidebar.phtml')?>

<?=$this->layout()->content?>

</body>
</html>

Если вы обнаружите, что ваши партиалы включают в себя больше кода PHP, чем HTML, вы можете вместо этого написать помощника.Таким образом, вы можете создать помощник боковой панели по этим линиям:

<?php
class My_View_Helper_Sidebar extends Zend_view_Helper_Abstract
{
    public function sidebar()
    {
        $html = '';

        // code to generate side bar here

        return $html;
    }
}
?>

, а затем вместо рендеринга частичного, как я делал выше, вы бы назвали свой помощник боковой панели:

<?=$this->sidebar()?>

Это довольноДля контроллеров легко переопределить макеты, поэтому вы можете создать макет администратора, который выглядит как мой пример выше, но без боковой панели и, возможно, с другим заголовком.Затем вы заставите свой администраторский контроллер использовать это вместо значения по умолчанию.

Я могу вспомнить несколько ситуаций, когда вам нужно будет настроить несколько объектов Zend_View, которые, как вы предполагали, вы рассматриваете.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...