#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) { ?>
. Вы проверяете типы токенов и т. Д., Чтобы убедиться, что тег шаблона действителен, и так далее.