Язык шаблонов против обычного PHP

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

{navigation: products}

vs.

foreach($cms_label['products'] as $product) {

    echo '<li class="product_nav">'.
         '<a href="products/{$product.id}">{$product.name}</a>'.
         "</li>\n";

}

Первый вариант чище, но требует изобретения языка и анализа каждой страницы перед отображением. Последний менее чистый, но я думаю, что он мог бы отлично работать, если бы CMS просто предоставляла данные для всего кода. Но будет ли это считаться смешением логики с презентацией? Другой альтернативой, которую я рассмотрел, является использование функций PHP, похожих на теги шаблона:

<?php navigation('products'); ?>

Что ты думаешь?

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


person Carson Myers    schedule 14.09.2009    source источник
comment
Уверен, что об этом уже много раз спрашивали.   -  person MitMaro    schedule 15.09.2009


Ответы (6)


Языки шаблонов для PHP являются примером анти-шаблона под названием «эффект внутренней платформы». " Smarty является примером структуры шаблонов для PHP, но даже Хасин Хейдер, автор книги о Smarty, говорит, что Smarty мертв, и его больше не нужно использовать.

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

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

Не пишите функции PHP для инкапсуляции блоков вывода HTML. Вместо этого используйте include() для извлечения фрагментов HTML. Эту технику иногда называют «частичными».

Вы также можете использовать инфраструктуру MVC, такую ​​как Symfony, Kohana, Solar, CodeIgniter или Zend Framework, чтобы помочь вам соблюдать дисциплину при отделении кода шаблона PHP от остальной части кода вашего приложения.

person Bill Karwin    schedule 14.09.2009
comment
Я строю на codeigniter. Кроме того, что, если части HTML необходимо указать в PHP? Для вывода списка (как в моем примере) я подумал, что в использовании include нет необходимости. Не нужно писать файл some-specific-navigation.html и включать его, верно? Что касается страниц, то они не будут создаваться на лету. - person Carson Myers; 15.09.2009
comment
Я хочу сказать, что я сохраняю весь HTML в файлах шаблонов, тогда как я пишу PHP-функции (например, в примере navigation(), который вы упомянули) только для предоставления данных в шаблон. Также никогда не повторяйте HTML-теги даже в шаблоне. Откажитесь от блока <?php ?>, если вам нужны буквальные HTML-теги. - person Bill Karwin; 15.09.2009
comment
Я просто подумал, что будет чище написать <a href="products/{$product.id}">{$product.name}</a>, чем <a href="products/<?php echo $product.id; ?>"><?php echo $product.name; ?></a> - person Carson Myers; 16.09.2009
comment
@Carson: Конечно, хорошая мысль, я согласен. Тем не менее, я стараюсь в целом минимизировать эхо полных HTML-тегов. - person Bill Karwin; 16.09.2009
comment
Просто любопытно, чувствуете ли вы то же самое в отношении шаблонов. - person johnny; 30.08.2014
comment
@johnny, я не занимался кодированием веб-презентаций в последние годы, поэтому, возможно, я устарел в отношении последних новых библиотек шаблонов. Но я предполагаю, что те же идеи все еще применимы: использование шаблонизатора может быть удобным во время разработки. Но с точки зрения эффективности времени выполнения я не понимаю, что может быть лучше, чем использование простого PHP. - person Bill Karwin; 30.08.2014

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

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

Довольно тривиально создать собственную маленькую систему шаблонов, которая использует php в шаблонах. Затем создайте различных помощников, чтобы ваш код шаблона оставался чистым (например, функция "navigation ()").

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

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

person timdev    schedule 14.09.2009

Изобретать колесо - в большинстве случаев плохая идея.

PHP уже является языком шаблонов. Вам не нужно реализовывать свои собственные.

Что касается Smarty, это наиболее полная система шаблонов для php, и это все еще плохая идея.

Пара статей по теме:

  • Жил-был Smarty! Хасина Хайдера. На самом деле он написал книгу о smarty и не рекомендует ее.

  • Php и шаблоны Гарри Фуэкса (автора 1-го издания антологии php)

Если вы хотите посмотреть на шаблоны, сделанные лучше, посмотрите:

  • phpSavant использует код php и по-прежнему способствует разделению проблем.

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

person elviejo79    schedule 14.09.2009

Вы можете изучить Smarty - http://smarty.php.net Smarty - очень мощный механизм шаблонов это дает вам лучшее из обоих миров. Он имеет обширную поддержку пользовательских модулей и плагинов.

Я создал собственную CMS с помощью Smarty и PHP и могу сказать о ней только хорошее.

PHP-код для использования Smarty выглядит так

<?php
// my cms

$smarty = new Smarty();
.
.
$smarty->display('home.tpl');

?>

Код шаблона выглядит примерно так

<h1>{$pagetitle}</h1>

{insert tag="navigation"}
person Andrew Hopper    schedule 14.09.2009
comment
Я бы порекомендовал Dwoo [dwoo.org] вместо Smarty. Имеет большинство функций Smarty без наворотов. - person MitMaro; 15.09.2009
comment
+1 Я использовал Smarty для ряда проектов, хотя это было некоторое время назад, так что могут быть и другие движки, которые стоит проверить (например, Dwoo, как упомянул Митмаро). По моему опыту, основная задача языков шаблонов - не допустить проникновения в них бизнес-логики. Обычно это означает небольшую дополнительную работу, чтобы убедиться, что в шаблон предоставляется только информация, которую вы хотите отобразить, оставляя только форматирование и структуру отображения для кода шаблона. - person yukondude; 15.09.2009

Интересно, почему никто не упомянул, что является одним из наиболее важных применений языка шаблонов: автоматическое экранирование вывода.

Здесь или там легко забыть htmlspecialchars (), поэтому язык шаблонов, который предоставляет директивы, такие как {$ name}, должен гарантировать, что $ name автоматически передается через htmlspecialchars, с соответствующей кодировкой и всем остальным.

Конечно, это также означает, что вы можете указать другой «контекст» для вывода переменных, например, alert ('Привет, {$ name | context = singlequotes}!'); где интерпретатор шаблона будет экранировать содержимое $ name, чтобы невозможно было выйти из одинарных кавычек, вместо экранирования XML (что должно быть по умолчанию).

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

Мои 2 цента. Не уверен, что есть решение с открытым исходным кодом, которое позволяет это (было бы интересно услышать об этом!), Я использовал свой собственный интерпретатор для этого на работе. Поскольку результирующий «промежуточный код» является чистым PHP, его также можно очень легко «кэшировать» (как это делают Smarty и другие системы tpl).

person KiNgMaR    schedule 14.09.2009
comment
это хороший момент, который я раньше не рассматривал. Но разве это не может быть сделано так же легко с помощью функций PHP вместо тегов шаблонов? - person Carson Myers; 15.09.2009
comment
Да, но дело в том, что легко забыть вызвать htmlspecialchars () или избежать кавычек в блоке ‹script› и так далее. Имея в виду язык шаблонов, ориентированный на безопасность (Smarty этого не делает, imho), вам не нужно думать о вызове какой-либо функции при каждом обращении к переменной. :-) - person KiNgMaR; 15.09.2009
comment
очень верно. Я думаю, что выберу PHP в качестве языка шаблонов и буду использовать свои собственные функции в качестве тегов шаблонов со встроенной системой безопасности, вместо того, чтобы повторять что-либо. Мне это кажется хорошим компромиссом. - person Carson Myers; 16.09.2009

Мне очень нравится Smarty, и я также считаю, что контроллеры должны быть написаны исключительно на XML, а модели - на YAML. Это единственный способ обеспечить соблюдение MVC.

Если вопрос производительности возникает только тогда, компиляция на php может рассматриваться как возможность (хотя и удаленная) с условием sine qua non, что это делается запутанным образом, чтобы помешать нетерпеливым разработчикам прочитать ее.

person Anonymous Coward    schedule 19.06.2010