Созданный на заказ движок шаблонов PHP

#php #templates #template-engine

#php #шаблоны #движок шаблонов

Вопрос:

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

В любом случае, мне пока удалось закодировать что-то простое: у меня есть класс, создаю его экземпляр, добавляю некоторые данные в экземпляр, затем передаю файл шаблона. Файл содержит ряд тегов, таких как {this}, которые затем заменяются данными. Просто.

Проблема, с которой я сталкиваюсь, заключается в том, когда дело доходит до зацикливания вещей, то есть таблицы пользователей или списка категорий. На данный момент у меня есть файл шаблона для страницы (users.html ), который содержит открывающий и закрывающий теги с тегом шаблона между ними, называемым {users}. Затем у меня есть другой файл шаблона (users-detail.html ), который отображает строку таблицы с информацией о пользователе. Я создаю новый экземпляр users-detail.html шаблон, добавление данных, их синтаксический анализ, затем помещение выходных данных (строка HTML) в массив. Затем я зацикливаю этот массив, соединяю все строки вместе, затем присваиваю это тегу {users} в users.html файл шаблона.

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

Если у кого-нибудь есть какие-либо советы / рекомендации о том, как я могу этого добиться, или какие-либо учебные пособия, которым я мог бы следовать, чтобы получить вдохновение, это было бы очень ценно.

Заранее спасибо.

Комментарии:

1. Взгляните на исходный код шаблонов h2o — github.com/speedmax/h2o-php — это должно помочь вам в вашем пути

2. Почему бы вам не изучить код существующих движков шаблонов, в которых есть то, что вы ищете, и извлечь из этого уроки? Что может быть лучше практического примера?

Ответ №1:

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

Я бы посоветовал вам вместо этого пойти по пути Smarty.

Классически это утверждение:

Я не хочу использовать автономную систему, такую как Smarty, потому что я сам написал все остальные части проекта и не хочу возвращаться к этому сейчас.

… указывает, что вы действительно должны просто использовать Smarty. В реальном мире это было бы плохим оправданием для повторной реализации чего-либо самостоятельно. Но я такой же, как вы, и я понимаю, что вы хотите что-то реализовать самостоятельно (потому что вы хотите учиться, вам это интересно, вы перфекционист и т. Д.). Если вы делаете это в свободное время и это личный проект, дерзайте.

Стоило бы изучить Smarty, чтобы увидеть, как он работает (не только синтаксис, но и то, как он компилирует шаблоны, сохраняет скомпилированную версию и т. Д.). Вам удобно писать токенизатор / синтаксический анализатор на PHP, который может компилировать ваш язык шаблонов и выводить PHP? Если вы достаточно продвинуты, чтобы сделать это, сделайте это. В самом простом случае вы читаете в теге like {foreach from=$something} и каким-то образом переводите его на <?php foreach ($something as $thing) { ?> . Вы проверяете типы токенов и т. Д., Чтобы убедиться, что тег шаблона действителен, и так далее.