принцип шаблонизации

KeyZy

Новичок
принцип шаблонизации

Здравствуйте!

Я читал о шаблонах и на форуме и в интернете, но не смог ответить на один вопрос. Как строится шаблон =))))

То есть если что-то простое типа:
Хидер;
контент;
футер.

То все понятно. Но если не все так однозначно?

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

Как шаблон/модуль понимает, что нужно грузить на определенной странице?

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

Неужели все прописывает в самом модуле?

возможно я задал вопрос не совсем понятно, но думаю, по ходу дискуссии смогу объяснить =)
 

HraKK

Мудак
Команда форума
Есть 2 вида шаблонов - пассивные и активны, в пассивные ты перед отображением собираешь все данные из контроллеров и назначаешь например блоку polls - голосовалку со всеми данными, а в шаблоне просто вставляешь
{section %poll%}
В активных( мне больше нравиться) ты собираешь только первоначальную инфу какой шаблон грузить и его основные данные, а потом уже этот шаблон при выполнении если встретит
{section %poll%}
То вызовет контроллер пулла и узнает у него все необходимые ему данные и подставит.

-~{}~ 04.02.10 15:45:

И почитай про MVC
 

Фанат

oncle terrible
Команда форума
На самом деле хидер и футер к шаблонизаторам никакого отношения не имеют.
Шаблонизатор - это то, что занимается отображением контента.
 

KeyZy

Новичок
HraKK
то есть в активном шаблоне будет зависимость контроллера от шаблона?

Получается, что переходя по ссылке вида:
domain/news/123

берется за основу управляющий шаблон (если не сказано иного в модуле news)

и на основании строится отображение страницы, при этом загружаются и голосовалки и т.д., а так же отображается вся информация подгружая модули по мере их нахождения в шаблоне.

так?

*****
я привел пример, который я знаю как построить. А суть вопроса, как построить более сложное представление.
 

Alexandre

PHPПенсионер
то есть в активном шаблоне будет зависимость контроллера от шаблона?
да
активные шаблоны нарушают логическую структуру приложения
ИМХО - это не совсем хорошо
 

Фанат

oncle terrible
Команда форума
Не знаешь ты, на самом деле, как построить.
Знал бы - вопроса про меню не возникло бы.
У тебя шаблон для контента есть? Нету.
вот когда освоишь шаблон для контента, вопросов уже не будет.
 

KeyZy

Новичок
*****
Я строил следующим образом:
есть основной шаблон, в котором есть хидер, контент и футер.

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

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

Для футера готовится инфа используя шаблон футера, которая потом вставляется в главный шаблон.


Сейчас хочу выводить представление другим способом, т.к. строить контент внутри модуля - это огромные проблемы с модификацией и унификацией вывода.

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

Но в итоге мне кажется, что я иду не по тому пути. В итоге почитав массу информации я окончательно запутался. Я не хочу писать старым способом, но и не могу понять как писать новым.
Читая примеры по шаблонизации, там нет сложногенерируемого вывода.
 

Фанат

oncle terrible
Команда форума
Для контента используется свой шаблон, вернее я использовал генерацию внутри модуля, но хочу от этого уйти.
ну вот когда будешь уходить, таких вопросов, "где что как выводить", придется решать кучу.
потому что шаблонизатор - это шаблон для к о н т е н т а. В первую очередь.
берем любой шаблонизатор и делаем шаблоны для всех разделов.
после того, как закончили - вопроса, как вывести в хидере меню в зависимости от условия, уже не возникнет :)
Я не хочу писать старым способом, но и не могу понять как писать новым.
на самом деле, очень просто.
модуль только готовит данные для вывода, а потом вызывает шаблонизатор, передавая ему данные и имя шаблона
Читая примеры по шаблонизации, там нет сложногенерируемого вывода.
Это правда.

Вот примеров и надо поспрашивать у окружающих.
 

KeyZy

Новичок
*****
у меня нет вопроса как в хидере вывести меню от условия. у меня вопрос в другом.

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

То есть частностии - построить отображение у меня нет.

Проблема в другом.

есть страница:

main.tpl
PHP:
      <html>
   
      <head><title>{title}</title></head>
  
      <body>

          <table>
            <tr><td>{header}</td></tr>
            <tr><td>{content:news}</td></tr>
            <tr><td>{footer}</td></tr>

          <table>
       

      </body>
   
      </html>
header.tpl
PHP:
          <table>
             <!-- может генерится, но для упрощения пусть будет статичным -->
            <tr><td>Menu 1</td></tr>
            <tr><td>Menu 2</td></tr>
            <tr><td>Menu 3</td></tr>

          <table>
footer.tpl
PHP:
          <table>
             <!-- может генерится, но для упрощения пусть будет статичным -->
            <tr><td>Menu 1</td></tr>
            <tr><td>Menu 2</td></tr>

          <table>

news.tpl
PHP:
          <table>
             <!-- может генерится, но для упрощения пусть будет статичным -->
            <tr><td>Новость дд.мм.гггг</td></tr>
            <tr><td>текст новости</td></tr>

          <table>
в этом примере все просто. в главный шаблон вставятся эти. Данные для них будут сгенерированы.

Но что делать, если я не могу заранее сказать, какие данные попадут в контент? ведь помимо новостей, могут отображаться банеры, например или ещё какие-либо разделы? и мне для каждого модуля надо имесь свой шаблон контента? наподобие news.tpl?
 

Духовность™

Продвинутый новичок
Есть 2 вида шаблонов - пассивные и активны, в пассивные ты перед отображением собираешь все данные из контроллеров и назначаешь например блоку polls - голосовалку со всеми данными, а в шаблоне просто вставляешь
{section %poll%}
В активных( мне больше нравиться) ты собираешь только первоначальную инфу какой шаблон грузить и его основные данные, а потом уже этот шаблон при выполнении если встретит
{section %poll%}
То вызовет контроллер пулла и узнает у него все необходимые ему данные и подставит.
очень заманчивый подход, только вот как быть, если в одном из контроллеров нужно использовать данные, полученные в другом контроллере? Как пример: как передать в контроллер, который строит строку для тега <title> название статьи, полученной в другом контроллере?
 

С.

Продвинутый новичок
и мне для каждого модуля надо имесь свой шаблон контента? наподобие news.tpl?
Любое отображение требует шаблона.
ведь помимо новостей, могут отображаться банеры, например или ещё какие-либо разделы?
Баннеры - не самостоятельный контент. Это часть шаблона новостей, шапки или подвала.
 

KeyZy

Новичок
triumvirat А действительно, как получить данные из одного модуля другим? То есть как понять какой модуль выполнить первым?

С.

Баннеры могут быть самостоятельными, если в них выполняется логика. Не просто отображение банера.

*****

Я думал, что используется какой-либо унифицированный шаблон, а модуль генерит внутри себя сущности (типа чек боксов, кнопок), которые берет из какого-то главного шаблона-описателя элементов.

Опять же, встает вопрос, допустим есть модули:
Новости;
Статьи;
блог.

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

Я вижу как выход, создать массив элементов главного шаблона, типа:
PHP:
$tplLabel=array('tpl'=>'wrapper','label'=>array('header','banner','content','footer'));

// Если надо показать информацию как-либо по-другому, то в модуле переопределяю массив

$tplLabel=array('tpl'=>'wrapperBlog','label'=>array('header','content','footer'));
так?

p.s. Кто-нибудь может выложить сложный шаблон? я действительно уже сам себя запутал разными статьями.
 

HraKK

Мудак
Команда форума
triumvirat
Title - это данные основного шаблона, подгружать нужно только "второстепенные" типа меню, блока новостей и т.д. Они не требуют данных глобальных. А если требуют у меня сделан хелпер include который работает с главным view, а не создает свой.

KeyZy
triumvirat А действительно, как получить данные из одного модуля другим? То есть как понять какой модуль выполнить первым?
Тебе этого не понадобиться, а если понадобится читай выше про include.


Alexandre
Почему не хорошо? Как по мне это реализация паттерна Lazy Initialize в глобальном уровне. У меня все модули пассивны, кроме основного куда пришел реквест. Например на страницу товара, загрузился модуль продуктов. Он инитиализировал базовые данные нужные мне для загрузки - а именно вставил 1 лишь Обьект Product( id ) который реализует лейзи, и в шаблоне - мне если надо название продукта - контроллер его подхватит и загрузит, надо сопутсвующие товары - подхватит и загрузит. Надо сбоку блок новостей? Подхватит хелпер и загрузит. Это позволяет не лезть в программный и код и загружать минимальные потребные данные для отображения. Когда я перешел на такой подход - я ощутил значительное уменьшение оверхеда.
 

KeyZy

Новичок
HraKK

Я хочу сделать на подобие твоей реализации, только боюсь пока мой уровень не позволяет осознать как это сделать =)
 

HraKK

Мудак
Команда форума
поэтому лучше начни с простого - посмотри как работают другие
 

KeyZy

Новичок
exceilence спасибо, я уже почитал. Очень хороший пост. =)
 

Фанат

oncle terrible
Команда форума
этот пост опять не объясняет, что шаблонизатор нужен для контента.
а как шапку к нему подключить - дело десятое. вообще не вопрос.

мне все эти посты напоминают кликушество на тему SQL инъекций.
Первая фраза - "предположим, что девелопер - дебил, и не составляет запросы корректно..." и дальше - сто килобайт разных примеров, какие можно составить запросы.
При том, что без вводной фразы все эти килобайты отправляются в помойку.
Так и здесь. куча рекомендаций на тему, как воткнуть хидер.

-~{}~ 05.02.10 10:43:

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

KeyZy

Новичок
Автор оригинала: *****

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