| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > PHP: Общие вопросы > помогите с шаблонизатором |
| Автор: VingradFan 19.1.2009, 23:09 |
| Всех приветствую пишу шблонизатор... Но все-таки... Итак идея: ОЧЕНЬ простой синтаксис; минимальный функционал; возможность инклуда: а. Текста <!--some_text--> б. ПХП Скриптов <!!--some_php_file--> допустим, сначала, для простоты рассуждений, что шаблон формируется в два этапа: 1. текст заменяется на строки с помощью str_replace 2. а вот тут встает проблема: как инклудить код? придумал такой алгоритм: 1. записываем в $template то что получилось после 1-го подхода. 2. ищем все до первого <!!--(что-угодно)-->, выводим это 3. инклудим скрипт из первого <!!--(что-угодно)--> 4. удаляем из $template подстроку, которую уже вывели и первый тег <!!--(что-угодно)--> 5. возвращаемся к шагу 2. подозреваю, что можно все проще делать.... Жду советов, спасибо! |
| Автор: ksnk 19.1.2009, 23:59 |
| Нужно, в принципе, расчитывать на компилируемый шаблонизатор, когда шаблон компилируется в более-менее простой PHP код. Если шаблонизатор некомпилируемый - когда-нибудь настанут тормоза, знаю по своей поделке С таким подходом к использованию, синтаксис можно наворачивать сколь угодно сложно - собственно время компиляции шаблона будет непринципиально... |
| Автор: VingradFan 20.1.2009, 00:11 |
| ksnk, спасибо за наводку на компилирующий шаблонизатор... буду гуглить что-то я совсем забыл про функцию eval();!!! она ведь решает всю проблему и сводит код к двум строчкам |
| Автор: ksnk 20.1.2009, 00:40 |
| VingradFan, Для тестирования могу предложить в меру тяжёлую тестовую задачку - "вписать" шаблонный движок в "магазинную страничку ". Магазинная страничка - это: -- страница вывода товара по категории. Для простоты - слева "деревянный" список категорий (категорий 50-100). Справа - таблица товаров. Снизу еще одна категория товаров (новинки... штуки 3-6). Товар - ассоциативный массив с картинкой, ценой и фиксированным набором атрибутов, некоторые из них удобно выводить выпадающим списком... -- Список товаров разношаблонный. Для каждого товара (даже и в одной категории) может использоваться разные шаблончики. Впрочем, это на потом -- Таблица товаров - раскрашена полосками - чёт-нечёт + выделяются цветом некоторые столбцы. Нужно разработать систему шаблонов, которую было бы несложно подменять для разных проектов. Чтобы при смене количества атрибутов "товара" не приходилось переделывать всю цепочку шаблонов. В принципе, для конкретики можно в любой e-магазин ткнуться... Оно там везде такое А так - задачка интересная. Разрабатывает логическое мышление. |
| Автор: VingradFan 20.1.2009, 01:34 |
| ksnk, ну причем тут навороченный магазин я ведь делаю шаблонизатор для конкретной цели: небольшая hand-made CMS... т.ч. я думаю, eval здесь самое оптимальное решение.... PS я таки осознал, что для большого проекта нужен нативный PHP шаблонизатор |
| Автор: bars80080 20.1.2009, 10:09 |
| имхо, если есть варианты решения без eval(), даже с полным изменением логики работы, то надо ибегать её |
| Автор: ksnk 20.1.2009, 11:18 | ||
Угу, угу, знакомая история. Честно говоря, для небольшого проекта шаблонизатор, как таковой и не нужен. Нужно выделить все классы-функции, ответственные за формирование HTML'я в отдельный файл. обозвать его "шаблонизатором " или view-контролером по вкусу и наслаждаться жизнью... |
| Автор: VingradFan 20.1.2009, 16:51 |
| bars80080, она типо непроизводительна? ksnk, ну раньше, когда я не слышал слова шаблонизатор у меня в шаблонах были для текстовых данных echo "somwthing"; а для подключения компонентов include (something); но потом я прочитал, что так некруто |
| Автор: ksnk 20.1.2009, 17:21 | ||
| VingradFan, Нужно уж определиться, это маленький проект, который по определению весь делается одним человеком, или большой проект, для которого специальный верстальщик делает специальные шаблоны. Обычная, imho, практика работы с шаблонами - приложение формирует ассоциативный массив с данными и передает его шаблонизатору. Шаблонизатор уже сам вставляет нужные параметры в нужные места. Чего-нибудь такое:
|
| Автор: VingradFan 20.1.2009, 18:37 | ||||
пишется пока для себя, но хочется "чтоб все как у взрослых"
ну это понятно.... суть темы состоит в том, как передавать шаблонизатору куски кода PHP в виде файлов.... 1. вариант - eval(); 2. вариант - в первом посте.... пока идею иссякли |
| Автор: ksnk 20.1.2009, 19:00 | ||
приведи пример, где это понадобилось. Всяко можно задачку решить и без eval'а. eval - сильно проигрывает другим методам в скорости выполнения, так что лучше его избегать... |
| Автор: VingradFan 20.1.2009, 22:11 | ||
привожу пример шаблона
<!--menu--> <!--login_form--> <!--body--> надо заменить на php код, который формирует меню, форму логина, и тело страницы. |
| Автор: bars80080 20.1.2009, 23:43 | ||
| причём здесь пхп-код? наверно в браузер ты всё же отправляешь целиком и полностью хтмл-разметку, без единого кусочка кода? достаточно считать весь файл и заменить куски на соответствующие части:
где $title, $menu, $form данные из БД или файлов, с генеренные и скомпонованные на пхп в нужном виде |
| Автор: ksnk 20.1.2009, 23:44 | ||||
| VingradFan, А можно было бы придумать как записать в шаблоне "заголовок" и описать LoginForm, Body и Menu в том-же файле. Это, типа, круто. Все шаблоны маленького приложения в одном файле. Ну в крайнем случае, можно в нескольких файлах, а имя "шаблона" брать из имени файла... Если свести к моему примеру, все будет примерно так
И куда тут теперь нужно вставить какие-то PHP-шные файлы? |
| Автор: VingradFan 21.1.2009, 00:42 | ||||
| bars80080, ksnk, спасибо за мысли, буду перечитывать и обдумывать bars80080, например, на место <!--news--> надо подгрузить компонент news.php
очень просто и логично звучит тоесть надо каким-то образом результат работы этого скрипта записать в текстовую переменную и заменить ею <!--news--> ? похоже надо будет менять тогда принцип работы компонентов. |
| Автор: bars80080 21.1.2009, 10:24 |
ну, это смотря, что ты подразумеваешь под компонентами. на деле мне кажется это наиболее простой вариант работы. я уже привык делать как: пишу статическую страницу со всеми элементами, css и js (рабочим), а когда всё готово и работает, просто разделяю страницу на блоки, которые могут быть или не быть, или множиться, а все переменные и тексты, что генерируются на странице, выглядят так: {PEREM}. в итоге полнейшее разделение html и php, они вообще никак не пересекаются |