Метки страниц

В прошлый раз мы рассмотрели работу с компонентом Zend_Layout. Теперь мы знаем о макетах страниц, где их можно создавать, как получать к ним доступ и как во время работы приложения менять один макет на другой. Однако остаются вопросы о том, как можно изменить заголовок страницы, добавлять стили или скрипты в зависимости от ситуации, как построить меню, как добавить блок новостей на страницу и прочее. В этом нам помогут метки страниц (Zend_View placeholders).

В Zend Framework реализован шаблон “Компоновщик“, который позволяет нам менять страницу любым образом. Суть этого шаблона заключается в том, что в глобальном слое страницы мы определяем те области, где будет выводиться различный контент страницы в зависимости от запроса пользователя. Таким образом наша страница разбивается на множество мелких частей, объединяя которые впоследствии, мы получаем целое приложение.

Помощник placeholder.

Для определения метки на странице существует помощник вида placeholder(). Помните, мы рассматривали каталог книг? Так вот давайте выведем ссылки на управление каталогом на главной странице. Для этого в глобальном слое layout.phtml мы определим область, где мы хотим вывести контент. Назовем ее sidebar.
Добавим в layout.phtml нашу метку:

<div id="sidebar">
<?=$this->placeholder('sidebar')?>
</div>

Доступ к объекту вида можно получить как в загрузчике, так и в контроллере в одном из методов.
В загрузчике мы могли бы написать следующим образом:

protected function _initSidebar()
{
    $this->bootstrap('View');
    $view = $this->getResource('View');
    $view->placeholder('sidebar')
        ->setPrefix("<div class=\"block\">\n")
        ->setPostfix("</div>");
}

Мы задали структуру нашего блока, указали, что контент будет обрамлен дополнительным тэгом div с классом block, т.е. весь контент будет внутри указанного тэга div.
Теперь откроем index controller и в методе preDispatch() сгенерируем наш блок:

public function preDispatch()
{
    $this->view->render('index/_sidebar.phtml');
}

В папке views/scripts/index создадим файл _sidebar.phtml следующего содержания:

<?php $this->placeholder('sidebar')->captureStart() ?>
    <h4>Books</h4>
    <ul>
        <li><a href="<?php echo $this->url(array('controller' => 'book', 'action' => 'index')) ?>">
                List</a></li>
        <li><a href="<?php echo $this->url(array('controller' => 'book', 'action' => 'create')) ?>">
                Create</a></li>
    </ul>
<?php $this->placeholder('sidebar')->captureEnd() ?>

Здесь мы используем методику захвата контента (“capturing”), чтобы вывести блок содержимого.
Внутри действия контроллера также можно обращаться к помощнику вида placeholder(). Например, можно добавить контент в указанную область:

$this->view->placeholder('sidebar')->append("Another content");

Стандартные помощники.

Кроме помощника общего назначения placeholder() существуют стандартные помощники, которые облегчают задание заголовка страницы, указание доктайпа, добавление стилей и т.д.
Рассмотрим их подробнее.

Указание доктайпа.

Внутри представления можно обратиться к методу doctype():

$this->doctype('XHTML1_STRICT');

Доступны следующие аргументы:

 XHTML1_STRICT
 XHTML 1.0 Strict
 XHTML1_TRANSITIONAL
 XHTML 1.0 Transitional
 HTML4_STRICT
 HTML 4.01 Strict
 HTML4_Loose
 HTML 4.01 Loose
 HTML5
 HTML 5 

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

protected function _initDocType()
{
    $this->bootstrap('View');
    $view = $this->getResource('View');
    $view->doctype('XHTML1_STRICT');
}

Заголовок страницы.

Помощник headTitle() позволяет нам управлять заголовком страницы. Можно, например, указать контент, который будет выводиться на всех страницах и дополняться еще строкой, описывающей текущую страницу. Например, в загрузчике мы можем определить начальный заголовок:

protected function _initPlaceholders()
{
    $this->bootstrap('View');
    $view = $this->getResource('View');
    $view->doctype('XHTML1_STRICT');
    $view->headTitle('My Site')
        ->setSeparator(' :: ');
}

Затем при помощи методов append(), prepend() в скриптах вида добавлять строку в начало или в конец заголовка, основываясь на информациии о странице.
Очень удобно на самом деле, и можно с легкостью делать заголовки вида “About – My new site” при переходе по ссылке /about.

Задание стилей и загрузка javascript сценариев на странице.

Используя помощника headLink(), мы можем легко задавать требуемые стили на странице. Можно определить глобальный стиль для слоя, который будет загружаться на всех страницах, или указать стили, которые будут определены только в соответсвующих скриптах вида.

headLink() использует два основных метода – это appendStylesheet() и prependStylesheet(). Каждый принимает до четырех аргументов, основным из которых является первый – путь к файлу скрипта.

Помощник headScript() по сути аналогичен headLink(). Основными методами являются prependFile(), prependScript(), appendFile(), appendScript().
Эти помощники используют коллекции, куда добавляются элементы, поэтому методы append* и prepend* добавляют элемент в конец или в начало коллекции соответсвенно.

Теперь мы освоили две составляющие MVC приложения – view и controller. В следующий раз, на примере работы с базой данных, рассмотрим модель приложения.

P.S. теперь доступны главы 6 и 7 документации на русском языке:

Знакомство с Zend Layout
Знакомство с метками Zend_View.

Leave a Reply

Leave a Reply

Your email address will not be published. Required fields are marked *