Мне нужно написать базовый механизм сценариев / шаблонов, который будет работать под PHP. В идеале я мог бы смешивать свой собственный язык разметки с (X) HTML-шаблоном и запускать документ с помощью синтаксического анализа на стороне сервера, чтобы динамически заменить мою собственную разметку на HTML-код, поданный из базы данных.
К сожалению, несмотря на все мои знания PHP и скриптов, я не совсем уверен, с чего начать. Мой первый инстинкт состоял в том, чтобы запустить весь документ через какой-то парсер регулярных выражений и отобразить мою собственную разметку для определенных функций PHP … но это кажется немного медленным и тяжелым для меня.
Какие существуют ресурсы / учебники / примеры, которые могут указывать на меня в правильном направлении? Для сравнения, мне очень нравится новый механизм шаблонов для Razor для .NET MVC … Я не хочу полностью отказываться от него для проекта PHP, но создание чего-то подобного было бы замечательным.
Хорошо, позвольте мне уточнить мое объяснение немного больше … Я разрабатываю веб-сайты для WordPress. Многие мои клиенты хотят настроить свои веб-сайты, но убегают, когда я начинаю говорить о PHP. Это язык сценариев, который выглядит слишком сложным для простого пользователя, даже желающего заинтересоваться.
Я хочу создать собственную форму разметки специально для WordPress. Таким образом, вместо того, чтобы иметь вызовы функций PHP ( get_header()
и get_footer()
и if(has_posts())
…) в файле темы, у вас будет пространство имен XML ( <wpml:header />
и <wpml:footer />
и <wpml:loop> ... </wpml:loop>
), который переводится в одно и то же. Лучше было бы отделить файлы шаблонов от сценария на стороне сервера (есть несколько тем, которые содержат целые PHP-функции непосредственно в файлах шаблонов PHP!) И облегчит работу разработчиков с настройкой темы WordPress.
Имея это в виду, уже предлагаемые решения TWIG и Mackrell определенно поддерживают идею встраивания сценариев «самородков» в файл, но они действительно не помогают мне анализировать пользовательскую разметку XML / XHTML во что-то, узнаваемое на стороне сервера код.
Итак … с чего начать, когда создаю новый процессор разметки на стороне сервера?
Другой вариант – проанализировать ваш шаблон в XML-документе и преобразовать его в другой XML-документ, заменив ваши теги на другие теги (например, инструкции обработки <?php
). В этом случае XSL – это то, что вы ищете.
Похоже, что вам нужен язык шаблонов, который поддерживает расширение пользовательских токенов. Учитывая, что сам PHP соответствует этой потребности, я предполагаю, что вам также нужна песочница.
Для этого я предлагаю TWIG .
По умолчанию он использует тот же базовый синтаксис, что и Django и Jinja2 для Python или Liquid для Ruby (хотя, хотя и не рекомендуется, это настраивается), и он скомпилирован для кэширования PHP для скорости.
Он поддерживает песочницу и автоматическое экранирование параметров, а также замену блоков и наследование, вы выбираете, к каким переменным он получает доступ, и вы можете настроить любую комбинацию, которую вы хотите использовать по умолчанию и пользовательские маркеры и фильтры.
Smarty также может удовлетворить ваши потребности, но я не уверен, есть ли у него все вышеупомянутые функции, его синтаксис, на мой взгляд, не столь изящный, и мне говорят, что это больнее, чем того стоит.
Что бы вы ни делали, думаю, долго и упорно, прежде чем изобретать свой собственный язык шаблонов. Как правило, это огромная боль в долгосрочной перспективе и, как правило, рано или поздно заканчивается на The Daily WTF рядом с BobX .
Обновление: у меня создается впечатление, что вы одержимы использованием XML с расширением имен для шаблонов. Действительно ли стоит изобретать весь шаблонный движок, чтобы ваши пользователи могли использовать <wpml:header />
а не {{header}}
? TWIG не позволяет пользователям встраивать произвольные скрипты … просто переменные и конструкции управления потоком, которые вы явно указали.
Для пользовательского XML вы можете использовать PHP XML parser, желательно SAX для выступлений.
Smarty – очень хороший механизм шаблонов PHP со встроенными тегами, блоками и функциями. Вы можете расширить их, чтобы создать свои собственные и даже удалить встроенные (для Smarty 3).
Если вам нужно создать свой собственный скрипт, я предлагаю вам проверить парсер языка, например, Lex и Yacc . Вы должны будете определить свой язык таким образом, как эти изображения SQLite, только не графическим способом, а текстовым. Есть и другой грамматический языковой парсер . Те, кого я дал, относятся к числу самых старых и самых известных, но это было сделано для C ++.
Вы, вероятно, захотите избежать этого самостоятельно (например, с помощью RegExp). Очень скоро у вас будет много несоответствий в вашем скрипте. Несмотря на то, что RegExp – это сам язык, интерпретируемый автоматикой.
Вы можете смешивать два: парсер XML и общий парсер. Проверьте конечный автомат (FSM) .
Я бы начал с XML, указав, как будет выглядеть типичная разметка страницы, а затем перейдем к расшифровке XML на выбранном вами языке, а затем возьмем это и создадим HTML.
Xml должен быть связкой узлов, которые описывают ваш конкретный язык.
Так…
<MyPage> <MyElement id="myid" type="MyType1"> <MyElement id="myid" type="MyType1" Text="Some text"/> </MyElement> etc...
Я бы посмотрел более внимательно в Интернете, чтобы узнать, есть ли что-то перестроенное, которое бы соответствовало вашим потребностям, прежде чем приступать к чему-то подобному, у которого есть реальный потенциал стать одной из тех вещей, которые выходят из-под контроля и невозможны поддерживать.