Язык шаблонов и прямой PHP - PullRequest
9 голосов
/ 15 сентября 2009

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

{navigation: products}

против

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.

Ответы [ 6 ]

13 голосов
/ 15 сентября 2009

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

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

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

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

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

7 голосов
/ 15 сентября 2009

Изобретать колесо чаще всего плохая идея.

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

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

Пара статей на эту тему:

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

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

Конечной целью, конечно же, является создание более простого кода для поддержки путем поощрения разделения Business Logic и Presentation

7 голосов
/ 15 сентября 2009

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

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

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

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

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

2 голосов
/ 15 сентября 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"}
1 голос
/ 19 июня 2010

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

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

1 голос
/ 15 сентября 2009

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

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...