В чем отличие Layout и Template?

StalkerClasses

Новичок
Объясните пожалуйста на пальцах - в чем отличие шаблона от слоя? Что такое часть (partial) понимаю. Но вот с этим не могу никак разобраться. И какая последовательность работы сборки слоя и шаблона (что сначала собирают фреймворки, куда что кладут в буфер, где идет include)
 
Последнее редактирование модератором:

fixxxer

К.О.
Партнер клуба
В современных компилирующих template engines, таких как Twig, Blade, Smarty 3, существует концепция наследования, похожая на наследование классов. @WMix дал ссылку на документацию по Twig. Аналогичные конструкции: в blade, в smarty. Какая там последовательность работы, можно узнать, просмотрев сгенерированный компилятором template engine код. В случае twig честно генерируются классы и методы, насчет остальных не помню (но вроде бы в smarty делается копипаста).

В более примитивных template engines, основанных на plain php, применяется упрощенная система с только одним уровнем наследования, в этом случае шаблон, выполняющий роль "абстрактного класса", называют layout-ом.
 
Последнее редактирование:

StalkerClasses

Новичок
О спасибо за информацию.
Почитаю поразбираюсь!

Пока на заметку оставлю вопрос - что за чем наследуется, что сначала отрабатывается и как отрабатываются например If-условия.
 

Вурдалак

Продвинутый новичок
Объясните пожалуйста на пальцах - в чем отличие шаблона от слоя? Что такое часть (partial) понимаю. Но вот с этим не могу никак разобраться. И какая последовательность работы сборки слоя и шаблона (что сначала собирают фреймворки, куда что кладут в буфер, где идет include)
Прежде чем создавать очередную тему на форуме, найди ответ на свой вопрос сам.
 

StalkerClasses

Новичок
Разобрался с данным паттерном.
Очень помогли ответы.

Но все же остается вопрос - т.к. не совсем могу его использовать на проекте.
И поэтому есть вопрос следующего характера.

Страница у меня собирается так:

Код:
1. <head>
<meta>
<meta>
</head>
2. <body>

меню
хлебные крошки

код основного шаблона

3. > здесь идет if(== 1 колонка)
3.1 require_once('column-1column');
      в этом же файле я запрашиваю содержимое страницы из элементов содержимого
      условно говоря получается
           $rows = getContent('page-Id');
           while($row => get()){
                // в зависимости от того, что за запись соответственно включается нужный файл
                 3.1.1 require_once('content'-$row['typeContent']);
           }
                 require_once('content'-text) // пример
                 require_once('content'-image) // пример
                 require_once('content'-form) // пример
                 require_once('content'-plugin) // пример
                 require_once('content'-accordion) // пример

3.2 > здесь идет if(== 2 колонка)
require_once('column-2column');

           $rows = getContent('page-Id','column-1');
           while($row => get()){

           $rows = getContent('page-Id','column-2');
           while($row => get()){

...
</html>
Как видно из этого примера у меня насколько понимаю нет возможности использовать такое классической наследование (Action, Layout) - т.к. страница собирается сверху вниз. Меня все устраивает в этом проекте что есть с такой сборкой и он поддерживаем.

Но есть одна проблема с которой приходится изворачиваться - из например плагина require_once('content'-plugin) я никак не могу отправить данные в секцию Head - например Meta description, Meta Keywords. Либо например из этого же плагина я не могу например отправить данные в хлебные крошки - т.к. эти секции уже собраны.

Вопросы:
1. Можно ли при таком подходе использовать наследование template extends layout
для страницы?
для элемента контента?
2. Если нет такой возможности то как можно реализовать алгоритм отправки данных в Head, в хлебные крошки из плагина которые уже выше по коду собраны и отданы в браузер?
 

StalkerClasses

Новичок
Возьми уже нормальный шаблонный движок…
На шаблонизаторе можно реализовать вот такое "сверху вниз"? Как понимаю нет.
Заранее не могу знать сколько будет колонок на странице. Сколько будет плагинов, какое будет содержимое в этих колонках.

При использовании MVC в фреймворках и их шаблонизаторов - Вы всегда заранее знаете что у Вас будет:
- какой-то Action, который вернет PageTitle, BreadCrumbs, переменную $content.
- и заранее укажите шаблон который уже будет знать о выше описанных переменных.

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

Пример
https://hello-site.ru/web-notes/otlozhennye-funkcii-v-php/
http://minicode.ru/otlozhennye-funkcii-kak-v-bitrix/
http://www.cyberforum.ru/php/thread185536.html
https://yunaliev.ru/2011/08/otlozhennye-funkci-bitrix-api/

Или может что-то не правильно понимаю в шаблонизаторах фреймворках?
Header я еще могу вываливать после Body. Но вот добавить например хлебные крошки уже проблема.

Почитал ценное замечание:
https://phpclub.ru/talk/threads/Отложенный-вызов-функции.43267/

"как раз сама идея использования шаблонов состоит в том, чтобы сначала получить все ДАННЫЕ, а только потом начинать вывод на экран."

Еще раз подчеркну, что не могу заранее знать все что будет на странице в плане ДАННЫХ!
 
Последнее редактирование:

WMix

герр M:)ller
Партнер клуба
На шаблонизаторе можно реализовать вот такое "сверху вниз"?
как раз от этого хочется избавится (если о шаблонах), чтоб не думать "не забудь закрыть body в файле хз", хочется писать уровнями

можно, шаблонизатор обрабатывается сверху вниз
 

AnrDaemon

Продвинутый новичок
Как понимаю нет.
Ну раз ты всё лучше нас знаешь, то что ты тут делаешь?

Или может что-то не правильно понимаю в шаблонизаторах фреймворках?
https://www.smarty.net/docs/en/language.function.extends.tpl
https://www.smarty.net/docs/en/language.function.block.tpl#idp34769440
 

StalkerClasses

Новичок
К сожалению так и не услышал как можно при подходе сверху вниз отправить данные в head и в хлебные крошки. Все примеры которые приведены они на основе блоков и Layout
 

WMix

герр M:)ller
Партнер клуба
вот скушно с тобой, голову не включаешь. не пиши а собирай данные, просто складывай их в переменные,
Код:
//не echo '<b>'.$d.'</b>';  а

$data['d'] = $d;
как все собирешь тогда и только тогда начинай вывод с помощью echo
 

Фанат

oncle terrible
Команда форума
Я не догоняю.
Вроде был, клиент понимает, что его "сверьху вниз" с запросом данных посередине - это говнокод, который является причиной кучи проблем.
Но при этом по какой-то причине отчаянно цепляется за этот подход, не объясняя при этом, чем конкрено он ему дорог и почему нельзя сделать по-человечески - сначала получить данные, а потом начать вывод?
 

StalkerClasses

Новичок
Придется делать как положено.
Сначала собирать содержимое страницы в зависимости от того, соклько у нее колонок.
После выводить саму страницу.

Но есть один вопрос. Допустим собрал содержимое в
$content_1
$content_2
$content_3.

А в шаблоне страницы например стоит if() на то что бы скрыть $content_3. И как тогда - получается зря собирал $content_3 если оно все равно не выводится на стракнице. Как правильно логику делать?

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

WMix

герр M:)ller
Партнер клуба
соклько у нее колонок.
это уже вид

индекс_строки%кол-во_колонок -- это колонка
$content[ индекс_строки%кол-во_колонок ]=$строка -- это никогда не поздно сделать
И как тогда - получается зря собирал $content_3
а вот количество необходимых строк может быть управляемым
 

Фанат

oncle terrible
Команда форума
На самом деле это все может и должно делаться в шаблоне.

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

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

Потому что "собрал содержимое в $content_1" попахивает говнокодом и HTML в бизнес-логике.
 
Сверху