Думаю, что все мы любим чистый и красивый код. Но разве это красиво, если в обычном HTML шаблоне открываются и закрываются PHP блоки, это же HTML шаблон, зачем там еще что-то? Но ведь надо как-то связывать серверную часть и то, как она преподносится пользователю. Для этого я решил написать небольшой скрипт, который поможет справиться с этой проблемой, оставив красоту в коде. Подробности под хабракатом.
Установка и использование
Для того, чтобы использовать мою разработку, нужно создать файл класса и поместить в него код, который я загрузил на WebCodes (кстати, класс отлично прокомментирован).
Работа со спец. кодами
Спец. код — это выражение, которое можно вставить в HTML шаблон и, при последующей обработке, получить его значение. Для того, чтобы его задать, воспользуемся методом set().
codes::set('code_name', 'code_value')
Или для того, чтобы задать сразу несколько кодов.
codes::set(
array('code_name_1', 'code_name_2'),
array('code_value_1', 'code_value_2')
)
Теперь, в шаблонах можно использовать специальный код $CODE_NAME$. Имя кода обрамлено знаком доллара и сохранено в верхнем регистре. Удаление кода происходит с помощью метода remove().
codes::remove('code_name')
Для того, чтобы получить значение кода, имеется метод get().
codes::get('code_name')
Для получения всех сохраненных имен можно воспользоваться методом get_codes(). Возвращает массив.
codes::get_codes()
Можно получить полную информацию о сохраненных кодах с помощью метода get_all(). Возвращает массив вида $CODE_NAME$ => code_value.
codes::get_all()
Условные выражения
В моем скрипте пользователю предоставляется возможность создавать условные выражения. Начнем их разбор с одиночного IF.
<if{condition}>
HTML код, который будет показан в случае, если условие (condition) будет выполнено.
<endif>
Ваше условие должно быть помещено в фигурные скобки, вместо слова condition. Условие строится по такому же принципу, как и в любых си-подобных языках. Возможно использовать более большие конструкции.
<if{condition_1}>
HTML код, который будет показан в случае, если условие #1 (condition_1) будет выполнено.
<elseif{condition_2}>
HTML код, который будет показан в случае, если условие #2 (condition_2) будет выполнено.
<else>
HTML код, который будет показан в случае, если ни условие #1 (condition_1), ни условие #2 (condition_2) не будут выполнены.
<endif>
Альтернативных условий ELSEIF может быть сколько угодно. Хочу заметить, что важен порядок постановки условных конструкций: если Вы сначала используете ELSE, а после него ELSEIF, то будет выполнен блок ELSE! Повторное использование конструкции ELSE ни к чему не приведет, будет выполнено первое вхождение. В случае, если операторы не будут закрыты или будет нарушен порядок, парсер выдаст ошибку синтаксиса.
Функции
Парсер умеет работать с функциями (но, к сожалению, пока не знает рекурсии). Определение функции выполняется специальной конструкцией.
<def{$FUNCTION_NAME$ ($ARG_1$,$ARG_2$,...)}>
HTML код, который выдает функция при вызове.
<enddef>
Разберемся с синтаксисом. Название функции должно быть записано в верхнем регистре и обрамлено знаками доллара, как в примере ($FUNCTION_NAME$). При этом не важно, сохранен или нет специальный код с таким именем, обработки спец. кодов и функций пересекаются в безопасном месте. Далее идут аргументы функции (в скобках). Желательно, чтобы аргументы были оформлены в том же стиле, что и специальные коды, но пока это не обязательно, т.е. если у вас будет аргумент, под названием a, то при вызове функции, все символы a будут заменены значением переданного параметра. Аргументы перечисляются через запятую. Функции могут быть объявлены в любом месте программы, даже после их вызова, т.к. сначала считываются все объявления, а потом все вызовы. Кстати, о вызовах.
<call{$FUNCTION_NAME$ ($PARAM_1$,$PARAM_2$,...)}>
С помощью этой конструкции осуществляется вызов объявленной функции (иначе вылезет ошибка синтаксиса). $FUNCTION_NAME$ — имя функции, которую вы вызываете, $PARAM_1$,$PARAM_2$ — параметры, которые вы передаете (в строго заявленном порядке). Вызовы функции можно помещать в условные конструкции. Хочу заметить, что все переменные, заданные снаружи функции, ничего не значат и выводятся просто как набор символов (что-то похожее на область видимости). Если вы хотите передать просто строку, а не спец. символ, то не нужно отбивать ее кавычками, т.к. по сути, место, где происходит вызов функции — уже строка.
Обработка
После того, как все ваши шаблоны созданы, настало время их обработать. Для этого есть метод template(), который принимает один строковый параметр и возвращает обработанную строку.
codes::template($html)
Вот и все, теперь шаблон готов для вывода.
Конец
На этом моя инструкция окончена. Надеюсь, она оказалась не слишком трудной и парсер вам понравится. В планах у меня создать проверку синтаксиса логических конструкций, аргументов, создать рекурсию и еще некоторые вещи.
Автор: cheremushkin