Простейшая шаблонизация

doran7

Новичок
Установка. Переменные в шаблонах можно выводить с помощью конструкции кода типа <?=$content?>, которая является ни чем иным, как сокращенной записью оператора echo. При этом никакого интерпретатора шаблонов не нужно.

Описание идеи.

1. Создаем шаблон, включаем в него php-код вывода необходимых переменных с данными и html-сегментами страницы.
2. В коде php-скрипта основного сборщика страницы (рендера) нужные данные, а также html-сегменты для сборки шаблонов собираем в переменные.
3. В конце скрипта рендера инклюдим файл шаблона, который получит значения всех прописанных в нем переменных из скрипта рендера.

Файл шаблона tpl.html

PHP:
<html>
<title><?=$title?></title>
<body>
<?=$content?>
</body>
<html>
Файл основного скрипта (рендера) main.php

PHP:
<?php
$title = "Заголовок по умолчанию";
$content = "Содержание страницы по умолчанию";

// Код основного скрипта , текущие значения переменных могут быть взяты из БД или файлов 
$title = "Заголовок текущей страницы"; 
$content = "Содержание текущей страницы";

return include "tpl.html";
?>
Вопрос к знатокам. Насколько такой подход грамотный и эффективный, при условии что функции программиста и дизайнера выполняет один человек и создается простейший сайт для себя (но с MySQL).
Понимаю что для заказчика такой подход слишком примитивен.
 

WMix

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

1. Layout, (его конечно можно сделать и такими средствами, но проблемы очевидные) иногда я хочу использовать layout иногда (в случае с ajax) нет... (механизм должен быть явно сложнее)
2а. безопасность, это активный код, а значит при возможности (верстальщик к примеру) туда можно внедрить опасный код который обработается на уровне сервера...
2b. безопасность, постоянно чистить некоторые переменные к примеру $content c помощью htmlspecialcars на возможность внедрения html тэгов (xss)...

но для начала лучше так, чем все вперемешку...
 

doran7

Новичок
WMix, благодарю за ценные замечания. Про расширение .phtml ничего особо не нашел, кроме того что в Zend Framework по умолчанию используются шаблоны вида .phtml. Думал о том чтобы шаблону дать другое расширение, например .tpl, но и про .tpl никакого толкового описания пока не нашел. Конечно шаблон с расширением .phtml лучше воспринимается, чем с расширением .html.

Насчет Layout (макет?) - не врубился до конца, что ты под этим имеешь в виду... я пока малограмотный в этих делах...

Насчет 2а. Безопасность - да, ее надо продумывать, о ней пока не думал совсем в этом подходе. Хотя верстальщик и программист предполагается как одно лицо, для такой простейшей шаблонизации.

Насчет 2b. Если $content будет браться из БД, а заноситься в БД опять же, только программистом - тоже надо чистить? Если будет заноситься в БД через форму пользователем сайта - тогда надо чистить по полной, и применять все возможные меры безопасности.

Продолжение. Как включать в такой шаблон данные через переменные мне, в основном, понятно. Но ведь можно в такой шаблон включать через переменные и части (блоки) html-страницы. А это я еще не продумал, как.

Например, включить простое меню.

PHP:
<html>
<title><?=$title?></title>
<body>
<?=$menu?>
<?=$content?>
</body>
<html>
Дальше сделать шаблончик с меню menu.phtml , и либо через include как-то либо через file_get_contents вставить его в рендер, например так

PHP:
<?php
...
// Код основного скрипта , текущие значения переменных могут быть взяты из БД или файлов 
$title = "Заголовок текущей страницы"; 
$content = "Содержание текущей страницы";
$menu = file_get_contents("menu.phtml");

return include "tpl.html";
?>
Как ссылки в меню добавлять и изменять - тоже надо продумать. Пока только мысль - просто шаблон меню редактировать как текстовый файл.
 

WMix

герр M:)ller
Партнер клуба
вот как раз 2а пока забудь, 2б помним всегда! к примеру берем не проверенное значение... обезопасить!... а вот с пунктом первым очень скоро поймешь, когда будет страниц штук 5 и будешь видеть что постоянно повторяешь кусок кода...

html это когда голый html - мы понимаем что этот кусок можно вывести простым echo (echo file_get_contents('...html') )
tpl это еще не хтмл но и не пхп тут подразумавается что есть обработчик типа str_replace
phtml самые первые скрипты на пхп так назывались... это как раз пхп+хтмл... и тут как раз include

те твой код
PHP:
$menu = file_get_contents("menu.phtml");
return include "tpl.html";
как раз написан НАОБОРОТ, правильней так
PHP:
$menu = file_get_contents("menu.html");
return include "tpl.phtml";
но это помарки,...
 

AmdY

Пью пиво
Команда форума
зачем всё это, если я знаю что в папке view лежат шаблоны, нафик заморачиваться с расширениями, лучше использовать стандартное .php и не париться
 

WMix

герр M:)ller
Партнер клуба
Если $content будет браться из БД, а заноситься в БД опять же, только программистом
я с этим не согласен, ты даешь редактировать базу, пользователю (администратору или еще правильней редактору), и тут 2 варианта, либо обезопасить в самом начале при записи (я сторонюсь этого, и записываю так как попросили), или при выводе обезопасить, (вот тут мое место)!

http://phpfaq.ru/tpl - более жизненный вариант
это правда... прочти!
 

WMix

герр M:)ller
Партнер клуба
AmdY
на самом деле соглашусь с тобой, у меня не бывает такого, что в папке контроллеров лежит шаблон или наоборот, но хочется называть шаблоны несколько иначе...
другая мысль, у меня нет ни одного файла .php кроме стартового, который исполнится. .php это класс...
проще сказать, они не содержат html код... и по этой причине я разделяю...

хотя да, в этом нет необходимости!
 

doran7

Новичок
http://phpfaq.ru/tpl - более жизненный вариант
Благодарю за ссылку. Но этот phpfaq.ru я не только весь просмотрел когда-то, но и весь полностью скопировал и задокументировал в формате .doc со своими пометками. Статья о шаблонах ценная, из нее много полезного почерпнул.

Остался вопрос - о грамотном применении файлов с расширением .tpl. Где бы об этом что прочитать толкового, хотя бы на английском?
 

Фанат

oncle terrible
Команда форума
весь полностью скопировал
скопировать мало, надо ещё и понять.
проблема в том, что человек может принять только ту информацию, к которой он готов.
всё остальное пройдёт мимо
поэтому тот же самый текст, который ты читал раньше, может повернуться совсем другой стороной через некоторое время.
Человек, который прочел и понял статью по ссылке, никогда не напишет
PHP:
$content = "Содержание текущей страницы";
Потому что там акцентируется этот момент, про запихивание динамического контента в переменную.
вопрос о грамотном применении файлов с расширением .tpl.
вопрос непонятен.
канонического расширения .tpl не существует (по крайней мере, в мире РНР).
Любой человек может поместить любой шаблон в файл с расширением .tpl
"грамотное применение" таких файлов зависит исключительно от идей поместившего.

что конкретно имеется в виду под "грамотным применением файлов с расширением .tpl"?
 

doran7

Новичок
канонического расширения .tpl не существует (по крайней мере, в мире РНР).... что конкретно имеется в виду под "грамотным применением файлов с расширением .tpl"?
Просто я это расширение часто встречаю, в разных CMS на PHP и разных статьях. В официальном описании PHP прро эти tpl-шаблоны мало чего нашел, а от фонаря их тыкать куда попало не хотелось.

Человек, который прочел и понял статью по ссылке, никогда не напишет
$content = "Содержание текущей страницы";
Это я упрошенно написал... :) Понятно, что должен быть запрос к БД с выборкой этого контента для текущей страницы и помещения этого контента в переменную в шаблоне. Конечно это все сложнее, чем в моем первом сообщении темы.

В любом случае благодарю за замечания. Хочу понять, как сделать шаблонизацию примерно такую же как в MODX, по тому же принципу, но гораздо проще, за счет значительного сокращения функционала.
 

Фанат

oncle terrible
Команда форума
Это я упрошенно написал... :) Понятно, что должен быть запрос к БД с выборкой этого контента для текущей страницы и помещения этого контента в переменную в шаблоне.
Это ты не упрощённо написал, а именно что ничего не понял.

Вот это самое "помещение" как, по-твоему, будет делаться?
 

doran7

Новичок
Вот это самое "помещение" как, по-твоему, будет делаться?
Примерно так. В скрипте рендера пишу такое:

PHP:
$content =  include "get_db_content.php";
В скрипте get_db_content.php пишу:
PHP:
...
//Соединение с БД, запрос SELECT, выборка из БД контента для текущей страницы
...
$req=... // контент для текущей страницы
return $reg; // обязательно, чтобы контент проинклюдился в рендере в переменную $content
Защиту думаю делать на этапе ввода юзером (во фронт-энде) или админом (в бэк-энде) контента из формы и далее записи его в БД..
 

doran7

Новичок
Пока для себя выделил такие правила простейшей шаблонизации

Правила шаблонизации при создании простых сайтов (из PHP-FAQ и других статей о шаблонах)

1. Код получения данных и код отображения данных надо разделять.
2. Любой вывод данных должен начинаться только после того, как для него готовы все данные. Поэтому файлы шаблонов включаются в скрипт рендера на завершающем этапе генерации страницы сайта.
3. Как следствие, любой скрипт должен заниматься только обработкой данных. После этого он может либо вызвать шаблон, передав ему подготовленные данные, или отправить какой-либо НТТР заголовок, или и то и другое вместе.
4. Каким именно шаблонизатором пользоваться - вопрос второстепенный. Самый простой и быстрый шаблонизатор - сам РНР. При создании простых сайтов шаблонизатором может быть сам PHP – это называется чистой (pure) шаблонизацией.

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

Пока для своих простых сайтов, которые делаю только для себя (не для заказчика) склоняюсь к чистой шаблонизации (средствами самого PHP), без Smarty, Twig и пр. спец-шаблонизаторов. Для меня, как новичка, на начальном этапе такой подход, возможно, будет в самый раз. Потом - жизнь покажет...
 

Фанат

oncle terrible
Команда форума
1. Код получения данных и код отображения данных надо разделять.
PHP:
//Соединение с БД, запрос SELECT, выборка из БД контента текущей страницы
$req=... // контент текущей страницы
^^ взаимоисключающие параграфы ^^
3. Как следствие, любой скрипт должен заниматься только обработкой данных. После этого он может либо вызвать шаблон, передав ему подготовленные данные
get_db_content.php возвращает не данные, а HTML. Что противоречит всем перечисленным выше правилам.
 

doran7

Новичок
^^ взаимоисключающие параграфы ^^
Может, я неточно сформулировал, мыслю в терминах MODX ... :). Исправил кое-что, имелось в виду не контент текущей страницы как весь HTML текущей страницы, а содержимое БД, текст новости, статьи и пр. ДЛЯ текущей страницы. В БД есть такблица site_content в которой есть числовое поле id (ключ) и текстовое поле content, в этом поле хранится текстовый контент (текст новостей, статей, разных прочих публикаций), для каждого id (для каждой страницы сайта). Запрос SQL выглядит так:

PHP:
$sql="SELECT $content FROM site_content WHERE id=$curiq"; // $curiq получаем из URL текущей страницы (из запроса браузера)
// Дальше
$result = mysql_query($sql) or die(mysql_error());
$row = mysql_fetch_row($result);
$req = $row[0]; // контент ДЛЯ текущей страницы
Извиняюсь за неточность.
 

Redjik

Джедай-мастер
зачем делать свой велосипед, который повторяет modx?
не проще ли пользоваться modx?
 

Фанат

oncle terrible
Команда форума
PHP:
$req = $row[0]; // контент ДЛЯ текущей страницы
Отлично! теперь осталось понять, где у нас шаблон для текущей страницы.
То, что я здесь вижу, больше напоминает общий шаблон сайта.
Если же это шаблон текущей страницы, то делать его копию для каждого раздела - эээ... на это идут только истинные титаны духа (и свободного времени)
 

doran7

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

Если же это шаблон текущей страницы, то делать его копию для каждого раздела - эээ... на это идут только истинные титаны духа (и свободного времени)
Я еще маленький в PHP и шаблонизации... мне бы с одним разделом разобраться, на большее мозга пока не хватает... :) Потом надеюсь осилить.

зачем делать свой велосипед, который повторяет modx?
не проще ли пользоваться modx?
Мне MODX никак не повторить, надорвусь... :) Если повторю хотя бы 1% от MODX Evo - уже хорошо будет. Админка MODX Evo меня в принципе устраивает, как бы ее оттуда выдрать и минимизировать...
Зачем свою CMS делать - я и не собираюсь ее делать, просто хочу понять принцип работы. Пользоваться MODX спокойно невозможно. Меня вполне бы устроила Etomite, она была легкая и быстрая, но ее поддержка и развитие прекратилось. MODX Evo тоже более-менее устраивала, но ее поддержка тоже прекратилась, и потом, она для меня процентов на 80 избыточна. MODX Revo совсем не устраивает, никаким образом. Так и получается с готовой CMS - то она начинает развиваться ни туда, куда надо, то поддержка прекращается. А одному такую CMS как MODX поддерживать - это я никак не потяну. Потому, если когда-нибудь мне удастся создать свою мини-CMS, простенькую и легкую, я от таких проблем буду избавлен. PHP - это тоже CMS... :) И ни от кого не зависишь.
 
  • Like
Реакции: WMix
Сверху