Статьи
Портфолио
Друзья
Контакты

Последние статьи

17.02.2010 Презентация проекта LINKGATOR.NET 6 коммент.

02.02.2010 Первая в России конференция по Zend Framework 8 коммент.

30.12.2009 Новый Год 2010 9 коммент.

Все

Категории

PHP 2 стат.

Zend Framework 23 стат.

Javascript 3 стат.

Другое 11 стат.

Книги 1 стат.

Украина 1 стат.

Все

RSS

Статьи

Комментарии

Портфолио

Облако тегов

программирование  Программы  портфолио  php  zend framework  Zend_Db  Smarty  Zend_Form  паттерны  javascript  niceforms  jQuery  Zend_Mail  веб  Google  Zend_Rest  Zend_View_Helper  zend casts  Zend_View  Zend_Layout  speedUp  интернет  Загрузчик фотографий  Flash  ВКонтакте  zend  localization  zend_translate  gettext  антон шевчук  подарки  Я читаю  Книги  sphinx  релизы 

Все

Реклама



Статистика



Rambler's Top100

Главная > Статьи > Zend Framework > Zend_Layout - это просто! Шаблонизация проектов
28.03.09 Zend_Layout - это просто! Шаблонизация проектов

Zend_Layout - один из важнейших компонентов Zend FrameworkZend_Layout — один из важнейших компонентов Zend Framework. Компонент очень простой, но многие  не  правильно понимают его предназначение либо и вовсе не знают что это такое. Так вот, данная статья просто и доходчиво объясняет следующее:

  • Что такое Zend_Layout;
  • Для чего он нужен;
  • В чем разница между Zend_Layout и Zend_View;
  • Реальные примеры использования.

 

 

Что такое Zend_Layout и для чего он нужен?


 

Zend_Layout — мощный инструмент в руках профессионального программиста. Этот инструмент позволяет четко поделить Вашу View логику на две части: шаблоны и скрипты вида. Что это Вам дает?

  • Вы получаете прозрачный механизм шаблонизации
  • Вы сможете избежать повторения кода в Ваших скриптах вида
  • Получите возможность менять шаблоны на лету
  • Сможете более удобным образом использовать head* помощники вида

Поэтому для большинства проектов я настоятельно рекомендую Вам использовать Zend_Layout. Конечно, всю мощь и удобство данного подхода никакая статья Вам не объяснит — Вы должны обязательно сами все опробовать!

 

 

В чем разница между Zend_Layout и Zend_View


 

При использовании Zend_View, Вы вероятнее всего создаете несколько скриптов вида, для того, чтобы использовать одинаковое оформление для однотипных страниц, потом Вы подключаете эти скрипты вида в конкретные скрипты, выводящие весь контент, не так ли?

 

Zend_Layout делает эти операции за Вас! Вы создаете скрипт шаблона, потом скрипт вида. Zend_Layout собирает для Вас шаблон и вставляет в него срендеренный скрипт вида в указанное Вами место (при этом не стоит считать, что Zend_View вообще не работает потому, что это не так. Именно Zend_View рендерит, как и прежде Ваши скрипты вида, а Zend_Layout «перехватывает» их вставляя в шаблон). Это оказывается очень удобным инструментом, особенно при разработке крупных портальных проектов. Ну что, я Вас уже заинтересовал? Тогда читайте дальше, и я расскажу Вам в виде практических примеров как именно все это добро использовать.

 

 

Реальные примеры использования


 

Итак, давайте опробуем все вышесказанное на практике. Начнем с Вашего загрузочного файла (bootstrap).

 

Чтобы включить поддержку Zend_Layout Вам нужно настроить этот компонент.

 

Впишите следующие строчки в Ваш бутстрап (до вызова метода dispatch() front-контроллера):

Честно признаться это не единственный способ сконфигурировать Zend_Layout, но, ИМХО, самый удобный.

 

С помощью опций конфигурации (см. мануал) можно многое поменять в работе шаблонизатора, например, сменить расширение Ваших шаблонов с phtml на tpl. Это очень просто и доходчиво расписано в мануале, поэтому на этом останавливаться не буду, потому, что нужно объяснить и более важные вещи.

 

Теперь нужно написать скрипт шаблона. Это проще чем Вы думаете. Итак, предпримем такие шаги:

  1. Откройте папку, которую Вы указали в бутстрапе
  2. Создайте в ней файл index.phtml
  3. Откройте файл index.phtml и для теста вставьте в него следующее:

В данном примере активно использовались помощники вида, ценность которых в шаблоне Вы несомненно оцените позже. В шаблоне Вы также работаете в контексте Zend_View, что означает, что переменная $this это объект Zend_View. $this->layout() - это объект Zend_Layout, где $this->layout()->content — содержимое срендеренного скрипта вида.

 

Вы также можете хранить переменные доступные из любого скрипта вида с помощью Zend_Layout.

 

Принцип создания скриптов вида остается таким же, только Вам теперь не нужно подключать кучу разных header и footer скриптов вида. Вот пример простого скрипта вида:

Теперь, если мы попадем в контроллер и действие, для которого мы создали скрипт вида, в браузер нам вернется следующий код:

Т.е. как видите, сначала рендерится скрипт вида, потом рендерится шаблон, и уже при рендеринге шаблона вставляется содержимое срендеренного скрипта вида.

 

А если Вы обратите внимание на помощники вида, использованные в примерах, то Вы лучше поймете целесообразность использования такого подхода.

 

Спасибо за внимание.

 

Теги:  zend framework, Zend_View, Zend_Layout

Другие категории:

■ PHP ■ Zend Framework ■ Javascript ■ Другое ■ Книги ■ Украина
Комментарии к статье
  Dr0n

30.03.09 15:46:48

Спасибо все очень прозрачно и понятноУлыбается
Скажите, а у вас в планах нет, случаем статьи, в которой бы рассматривался пример использования нескольких макетов? К примеру:
макет для пользовательской части
макет для админ части
.....
макет для n части проекта
Т.е. очень интересует способ реализации, особенно интересно, по каким критериям делать выбор загрузки необходимого шаблона.

зы Кстати привет из Крыма, вы ведь тоже с Украины?

  illusive

01.04.09 10:29:29

Спасибо все очень прозрачно и понятноУлыбается

Спасибо за признательность. Смеётся

Скажите, а у вас в планах нет, случаем статьи, в которой бы рассматривался пример использования нескольких макетов? К примеру:
макет для пользовательской части
макет для админ части
.....
макет для n части проекта

Зачем же писать отдельную статью для расказа о такой простой теме? Я хотел бы, чтобы мои читатель получали пищу для мозгов, поэтому открываем мануал и смотрим, что реализация подобного совсем не вызывает вопросов... Хотя если Вы все же хотите увидеть подобный материал, с возможно некоторыми важными замечаниями по этому поводу, то отпишите здесь о Вашем желании и я обязательно напишу Улыбается

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

Это зависит от Вашей системы организации программного продукта. У меня, например, используются разные бутстрапы на админ-часть, пользовательскую часть ... n часть (потому, что нужно поразному конфигурировать ядро, например, по другому запускать кеширующие механизмы) и в основном шаблон по-умолчанию задается именно в бутстрапе, а иногда где-то в контроллерах я меняю шаблон ($layout->setLayout('admin')), но очень редко.

Поэтому получается: заходиш в админ-часть - шаблон 'admin' по-умолчанию, заходиш в аккаунт - шаблон 'account' по-умолчанию.

Кстати привет из Крыма, вы ведь тоже с Украины?

Да я тоже с Украины. Спасибо, привет из Луцка (Волынь) Подмигивает

  Dr0n

02.04.09 07:25:26

Собственно реализация выбора шаблонов действительно очень хорошо описана в мане. Мне интересно, каким образом выбирается, необходимый бутсрап (ну или функция выбора шаблона).
Вот варианты, о которых я думаю:

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

2) Модулем является отдельная сущность, ну или компонент (к примеру новости, статические страницы и т.д.). Для каждого модуля реализован свой набор контроллеров видов, и т.д., единственное это модели, тут уже спорный вопрос делать их общими или автономными для каждого модуля. Тогда механизм смены шаблона должен быть реализован таким образом, чтобы каждый модуль знал свой шаблон, т.е. при загрузке модуля сам модуль мог выбрать шаблон под себя.

В общем получилось вроде как и не совсем по теме Улыбается


, скорее больше про модульность, но я думаю что здесь все взаимосвязано. Сам использую 1 вариант, но как то, он мне не очень нравится, скорее всего, потому как хочу видеть модулем модуль из варианта 2Смеётся. Очень хотелось бы услышать Ваше мнение , другие варианты реализации  .
С данным Фреймворком работаю совсем недавно (но уже понял что наконец нашел, тот базис который так давно искал)) хочется сразу все распланировать и спроектироватьВ нерешительности
ps.  ИМХО: Неплохо бы к капче кнопу обновить добавить, а то мрет быстро.

  illusive

07.04.09 13:55:22

У меня бутстрап выбирается по директории: в папке admin лежит index.php, который запускает к примеру Core::runAdmin() - это как бы режим работы ядра.

Т.е. подобные вопросы при такой технике использования вообще отпадают.

  Dr0n

08.04.09 08:18:38

Ясно, спасибо.

  Meonlyone

10.04.09 09:27:57

Не понятно для кого статья написана. Если для тех "кто продвинутый", то да им понятно. Но результата от этого у них мало, т.к. они это уже знают. ...

мне, новичку, здесь мало что понятно, хотелось бы иметь пример (файлы) которые заработают и можно будет их изменить и посмотреть, как они работают

 

  illusive

10.04.09 09:57:13

Не понятно для кого статья написана. Если для тех "кто продвинутый", то да им понятно. Но результата от этого у них мало, т.к. они это уже знают. ...

мне, новичку, здесь мало что понятно, хотелось бы иметь пример (файлы) которые заработают и можно будет их изменить и посмотреть, как они работают

Статья для тех, кто ознакомился с Zend_View и основами MVC. Зная выше перечисленное не составит труда быстро освоить Zend_Layout по моей статье

  Алексей

30.04.09 07:56:48

Доброго времени суток,

Все ясно и понятно, но тема (на мой скромный взгляд) раскрыта не полностью.

Я все ищу примеры того каким образом можно разделить вывод

<?php echo $this->layout()->content?>

на два или больше частей, зависимых от выполняемого "Action"

и использующих каждый свой скрипт вида.

Например в скрипте layout-а

указываю

<?php echo $this->layout()->top?>

<?php echo $this->layout()->left?>

<?php echo $this->layout()->right?>

в нужных участках шаблона.

И каждому из этих выходов соответствует скрипт вида (top.phtml,left.phtml,right.phtml)

И набор скриптов вида (top.phtml,left.phtml,right.phtml) можно создавать индивидуально для каждого действия.

Надеюсь сумел высказать свой вопрос правильно и доступно :)

 

С уважением

Алексей

  Over

30.04.09 17:54:53

Есть много решений. Вы сначало расскажите, для чего это нужно? И уже от этого будем исходить.

  illusive

07.05.09 13:39:04

Тема раскрыта полностью, ведь Ваш вопрос Алексей относится к категории специфических, но все же отвечу. Есть два варианта:

  1. Обратите внимание на хелпер вида action
  2. Перепишите Zend_Layout под свои нужды
  Алексей

07.05.09 17:24:50

Спасибо за помощь.

Сейчас уже ушел совсем в другую степь..

Это был скорей теоретический вопрос, и Over тут прав :)

Нужно сначала понять для чего это нужно.. пока мне хватает

и <?php echo $this->layout()->content?>.

Всеже сильно распылять шаблон тоже не стоит :)

  Snowcore

21.05.09 09:49:19

А особо распылять и не получится:

1) header

2) content

3) sidebar

4) footer

Классическая схема layout

  illusive

21.05.09 16:38:31

Snowcore, верно подметили...

  Скакунов Александр

03.07.09 12:12:42

Что касается вот этого кода ниже - бутстрап-то общий для всего приложения, а темплейты/лейауты для модулей разные (фронтенд и админка). Как быть?

 

  illusive

04.07.09 10:06:48

В Zend_Layout нет такой возможности. Да и вообще это идеологически неверно - шаблоны должны быть собраны в одном месте, как например, в разнообразных разработках темы. А для гибкости интерфейса шаблон стоит разбивать на разнообразные блоки - таким образом Вы сможете решать проблемы вывода различной информации в разные части страници разными модулями.

  Ravx

20.07.09 08:24:53

Извините что не в тему:
Как сделать подстветку синтакса пхп как у Вас в ВП

И понравился редактор для комментов, подскажите откуда взяли ? 

И уберите плиз поле УРЛ с обязательных в комментах, так будет удобней!!!  

  illusive

21.07.09 12:36:43

Как сделать подстветку синтакса пхп как у Вас в ВП

Извините, ничем не могу Вам помочь, так как блог самописный.

И понравился редактор для комментов, подскажите откуда взяли ?

Визуальный редактор TinyMCE

И уберите плиз поле УРЛ с обязательных в комментах, так будет удобней!!!

Извините, после последних правок допустил маленький недочет. Спасибо.

  Ravx

26.07.09 12:10:22

Почему это помочь не можете :)
Можете, даже очень можете... Просто скинуть код подстветки, а я уже как плагин попробую в WP интегрировать! Подмигивает 

  illusive

28.07.09 13:36:12

http://code.google.com/p/syntaxhighlighter/

Здесь есть все что нужно...

 

  Ravx

30.07.09 18:42:50

спасибо за ссылку
поправте

Вот что мне приходит на почту!!!
http://images.server-ua.net/viewer.php?file=81tnwz5cbuhsyhnfa.jpg

  illusive

31.07.09 17:27:31

@Ravx

Проба пера... Немного поправил ХТМЛ письма....

Как я заметил, Ваша почта не воспринимает CSS из письма

  Cross

30.12.09 18:44:15

А как тогда разграничеть использование скрипта шаблона. Написал шаблон layout.tpl. Теперь он используется во всех подстановках. Я бы хотел чтобы в один случаях использовался один шаблон у других - другой. Где это нужно указать?

  illusive

30.12.09 18:54:50

$layout->setLayout('layout_name')

  Cross

30.12.09 19:02:08

Куда мне это вставить?

$layout->setLayout('layout_name')

В настройках Bootstrap.php или где?

  illusive

30.12.09 19:05:56

Где угодно после инициализации Zend_Layout)))
  Snowcore

30.12.09 19:15:25

Один из популярных способов - применить это в плагине загрузке модулей

  Cross

30.12.09 19:20:05

что-то я не пойму.

инициализации Zend_Layout проходит у меня в Bootstrap.php.

// Получение объекта Zend_Layout
$layout = Zend_Layout::getMvcInstance();

layout_name - это имя шаблона должно выглядеть к примеру 

$layout->setLayout('layout_test')

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

  illusive

30.12.09 19:26:40

А вот логику выбора шаблона Вы должны спроектировать и запрограммировать сами...
  Cross

31.12.09 09:01:53

Будьте так любезны, помогите разобраться в подключениях стилей к макетам: Пишу код

 в строке указываю ссылку подключения:

В итоге при просмотре html кода получаем:

<link href="&"quot;/public/css/site.css" media="screen" rel="stylesheet" type="text/css" /> 

Но стили так и не работают!

Когда вписуем в заголовок напрямую стили к примеру:

<style>
body {background:#FF9}
</style>

Все отлично работает! Как же все таки правильно подключить стили? Да и со вставлением рисунокв такая же проблема! Спасибо!

 

 

 

  illusive

31.12.09 09:53:11

Посмотрите в Firebag'е какие файлы грузятся, а какие нет. Убедитесь, что пути к файлам построены верно. Попробуйте скопировать ссылки на файлы и открыть их отдельно в браузере.

  Andrey

31.12.09 14:00:27

Скажите, пожалуйста, есть у меня макет-скрипт шаблон - layout.tpl.

Мне у него нужно вставить несколько скриптов вида, скажем contakt.tpl, menu.tpl, usluga.tpl у один макет - layout.tpl.

У скрипта шаблона есть метод $this->layout()->content — содержимое срендеренного скрипта вида. Он вставляет только один скрипт вида, а как можно реализовать вставку нескольких скриптов вида???Клёвый

  Gorelov.serj

01.02.10 10:27:06

Здравствуйте. Скажите пожалуйста как реализуется такая конструкция К примеру у меня есть 3 типа страниц, Layot для них общий: ...
layout()->header>
layout()->left_col>
layout()->mid_col>
layout()->right_col>
layout()->footer>
А вот содержимое этих 3-х колонок на каждой странице абсолютно разное. Как мне подставить нужное содержимое в нужную колонку на нужной странице ) ? Сейчас нашёл такой выход : Из вида определённого экшена я вызываю другие экшены (...$this->layout()->left_col= action("foo","bar"); ...). Мне такой подход кажется кривоватым, но ничего оригинальней придумать не смог. Есть ещё одна задумка, написать классы не наследуемые от Zend_controller_action а из экшенов делать лишь вызовы методов этогих классов. Как вы решаете такую задачу???
  illusive

01.02.10 10:59:19

У меня это реализовано довольно сложно.. В общем это сделано через плагины фронт-контроллера. Там я готовлю нужные данные для вида и с помощью функции render() вида генерирую необходимую часть страницы..

Оставить свой комментарий

 
Статьи | Портфолио | Друзья | Контакты
Идея и мозги: Васильев Андрей © 2008-2009 Web-Blog Кисточка и фантазия: Зелинский Богдан