В чем идея и как работают шаблоны?

Пишу свою систему. Понимаю, что пишу что-то не то.
Похоже, что нужны шаблоны. Но я пока не понимаю их идею, суть и как их использовать.

Пока пишу так - нарушаю правило мешая в кучу код и разметку (ужас, а что делать).
class HTML
{

static function ShowPageHeader($pageTitle='Заголовок страницы') 
{
echo'
<!DOCTYPE html><html><head>
//...можно и return - не суть
';
}

static function ShowPageFooter() {
echo"</body></html>";
}	

static function ShowPage() {
HTML::ShowPageHeader;	
echo'Контент';
HTML::ShowPageFooter;	
}	

}

HTML::ShowPage();


Можно привести краткий и простой пример использование шаблонов.
Главное - понять суть.
В чем идея и как работают шаблоны?
  • Вопрос задан
  • 451 просмотр
Решения вопроса 1
ipatiev
@ipatiev Куратор тега PHP
Потомок старинного рода Ипатьевых-Колотитьевых
Вопрос очень хороший.
А ответ на него очень простой.

Шаблоны нужны для отделения логики приложения от логики отображения.
Разделив их, мы получим сразу кучу выгод:
  • Нормальную структуру приложения, когда вывод начинается только после того, как отработала вся логика. То есть у нас никогда не будет проблем с ошибкой headers already sent, с возвратом json-а вместо html, с выводом в page header-е тех данных, которые появляются только в процессе работы скрипта
  • Мобильность - один и тот же движок можно будет использовать на нескольких сайтах, меняя только шаблоны, но весь код оставляя одинаковым. Что поможет, в частности, вносить обновления в движок и исправлять ошибки на всех сайтах разом.
  • Разделение труда - сейчас обычно над отображением работают фронтендеры, то есть, когда бизнес-логика отделена от шаблонов, то любой фронт сможет с ней работать


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

После этого есть варианты, которые отличаются в основном удобством работы с кодом шаблона.
Править HTML код записанный в виде РНР строки - это САМЫЙ неудобный .

Дальше идут всякие наколенные решения, типа
бизнес-логика
include header
?>
хтмл конкретной страницы
<?php include footer ?>

или чуть более продвинутый, когда шаблоны хранятся отдельно и могут вкладывться друг в друга. Сначала пишем функцию,
function render_template($filename, array $data = [])
{
    ob_start();
    extract($data);
    require __DIR__ . '/' . $filename;
    return ob_get_clean();
}

а потом в коде страницы пишем
бизнес-логика
...
$page_html = render_template('page.tpl.php', [
    'data' => $data,
]);
echo render_template('main.tpl.php', [
    'navigaton' => $nav_list,
    'title' => $title,
    'page' => $page_html,
];

где сами шаблоны это
...
        <?php foreach ($navigation as $item): ?>
            <li>
                <a href="<?= e($item['href']); ?>"><?= e($item['title']); ?></a>
            </li>
        <?php endforeach ?>
Важно! Любой вывод в этих шаблонах должен экранироваться в обязательном порядке (кроме очевидных случаев, когда мы выводим результат рендера).

Ну и наконец нормальные шаблонизаторы, из которых я горячо рекомендую Twig.
Главное, что про него надо знать - даже самые зелёные нубы осваивают его без затруднений. И настоятельно рекомендую сразу перейти на него, после того как наиграетесь с решениями на коленке.
Ответ написан
Пригласить эксперта
Ответы на вопрос 3
sergiks
@sergiks Куратор тега PHP
♬♬
Идея шаблонов – держать HTML разметку отдельно и удобно.

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

Простейший пример Twig мало чем отличается от обычного PHP:
Шаблон hello.html.twig:
Привет, {{ name }}!,
и вывод в него типа
echo $twig->render('hello.html.twig', ['name' => 'Хабр']);
передаются имя темплейта и данные, которые там нужно подставить.
В шаблоне обычно никаких вычислений, максимум простые циклы или условия.

Шаблоны могут наследовать друг от друга. Например, у сайта один главный темплейт от которого наследют шаблоны страниц - в них только содержание. И далее шаблоны для разделов, секций, фрагментов.
Ответ написан
Комментировать
@alekcena
Нелинейный наставник
Мне нужно реализовать коментарии, на разных страницах. Ещё нужна возможность быстро изменить визуал в 1 месте, и чтоб всё сразу заработало.
Я могу или в ручную писать повторяющуюся логику делая ctrl+c/ctrl+v и потом при изменение визуала искать где я это вставил и также там менять это.
Или сделать шаблон в 1 месте и вызывать его на каждой странице, где это нужно.

Тем самым я 1 раз меняю что-то в шаблоне. И он автоматически меняется на всех страницах.
Ответ написан
Комментировать
@rPman
изначально php это язык шаблонов

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

php файл это, сюрприз, фактически html (точнее ему пофиг) файл, в котором вставлены вставки с кодом <?php ... ?>, при этом эти вставки могут семантически делить шаблон на блоки, и использовать их как просто вызов echo текст шаблона, в результате можно использовать условные блоки, циклы, и функции:

<html>
<body>
<?php function test($p) { ?>
Привет <?=$p; ?>
<?php } ?>
циклы:
<ol>
<?php for($i=3;$i>0;$i--) { ?>
<li value="<?=$i; ?>">ha ha ha</li>
<?php } ?>
</ol>
Вызовы:
<?php test('blablabla'); ?>
<?php test('123123123'); ?>

</body>
</html>

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

На практике, генерация именно html на серверной стороне, идеологически устарела. Да, если надо сформировать документ (например docx или лучше open document .odt) то шаблоны идеальны, но для web лучше формировать итоговую страничку на клиентской стороне, используя шаблоны уже на javascript
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы