Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Вопросы по реализации шаблонизатора

31K
25 ноября 2008 года
WarLooK
29 / / 23.06.2008
Здравствуйте!

Изучаю php на примере своего шаблонизатора, посмотрите идею пожалуйста, выскажите свои "за" и "против".

Ответы, а почему бы не использовать смарти или что-то подобное не принимаются, т.к. проект учебный и для меня важно именно самому все сделать.

Как будет выглядеть такая конструкция: есть отдельный шаблон для всей страницы и набор шаблонов для отдельных "типов данных", которые могут встраиваться в основной шаблон?

Вот пример:

Основной шаблон:
Код (html): скопировать код в буфер обмена
[HTML]<html>
<body>
#NEWS#
</body>
</html>[/HTML]
Шаблон для #NEWS#:
Код (html): скопировать код в буфер обмена
[HTML]<div>#NEWS_NAME#</div>
<div>#NEWS_CONTENT#</div>[/HTML]
А специальный класс смотрит какие блоки указаны в основном шаблоне и собирает в соответствии с ними всю страницу целиком, причем, как уже говорилось выше, для каждого "типа блока", например #NEWS# есть свой отдельный шаблон и свой контроллер, который вставляет в этот шаблон данные, а количество новостей (итераций цикла), сортировка и т.д. указывается в конфигурации контроллера.

Получается 2 типа наборов шаблонов, один тип - для станицы целиком, другой - для динамических данных в теле страницы.

имеет ли право на жизнь такая конструкция?

у меня дальше str_replace пока не пошло, т.е. еще нет логики в шаблоне, есть только вставка подшаблонов и данных и вывод пока что командой echo.

Вопросы:
1. Чем плохо хранить шаблоны не в файлах, а например в базе данных? Как это влияет на скорость выполнение программы? На что это еще может повлиять?
2. Как вообще можно реализовать логику в шаблоне, например ветвление, только заменой спец. тэгов на php-код?
3. Как происходит компиляция шаблона, и его вывод, если он компилируемый? Я заменяю все блоки в шаблонах на соотв. пхп код, сохраняю во временный файл и выдаю его пользователю, как шаблон изменяется - я его заменяю новым? Тут происходит одновременно и компиляция и кеширование, я правильно рассуждаю?
4. Как еще можно вывести шаблон, чтобы выполнился код (код нужен для реализации логики), кроме как includ'ом?

Спасибо. Надеюсь на вашу помощь.
244
25 ноября 2008 года
UAS
2.0K / / 19.07.2006
1) Ужасно. Шаблоны, в принципе, это статические данные. Зачем тогда лишний раз дергать базу данных? Храните все в файлах + кэширование созданных шаблонов (типа как у smarty)

2) Опять же только компиляцией шаблона. Т.е. есть управляющие последовательности, в зависимости от них строить php-файл-шаблон и исполнять (опять же как у Smarty).

3) Правильно. Компилиируете шаблон - это и будет как бы кэш. Потом просто подставлете нужные данные в этой скомпилированный php-шаблон.

4) Никак.
31K
25 ноября 2008 года
WarLooK
29 / / 23.06.2008
Цитата: UAS
1) Ужасно. Шаблоны, в принципе, это статические данные. Зачем тогда лишний раз дергать базу данных? Храните все в файлах + кэширование созданных шаблонов (типа как у smarty)



Понятно, подскажите пожалуйста, чем отличается дерганье файла от дерганья базы, насколько я знаю время доступа примерно одинаково (у файла немногим быстрее, но очень немногим)

Цитата: UAS
2) Опять же только компиляцией шаблона. Т.е. есть управляющие последовательности, в зависимости от них строить php-файл-шаблон и исполнять (опять же как у Smarty).

3) Правильно. Компилиируете шаблон - это и будет как бы кэш. Потом просто подставлете нужные данные в этой скомпилированный php-шаблон.

4) Никак.



Тут все ясно.
Вот только про первый пункт интересно, насколько сильными могут быть потери производительности?

244
25 ноября 2008 года
UAS
2.0K / / 19.07.2006
Поймите, что лучше вообще лишний раз базу данных не дергать. Зачем? Это же все равно нагрузка на сервер.
Да и какой смысл хранить данные в БД (это от силы 20-40 шаблонов), когда их можно с тем же успехом хранить в файле.
Времени на доступ в разы меньше, лишний раз БД дергаться не будет => работать будет быстрее.
+ помимо запросов шаблона из базы обычно ещё что-то тянется. И количество запросов для "этого чего-то" может быть разное кол-во. А ещё нагружать выборкой шаблонов => повыситься кол-во траффика между сервером и базой данных.

Так что, в принципе, только одни минусы
31K
25 ноября 2008 года
WarLooK
29 / / 23.06.2008
Просто с базой работать удобнее, я всю жизнь с базами работаю, SQL для меня привычнее, чем работа с файлами.

Да и вообще меня всегда учили что "всю нагрузку грузи на базу". Работал в Ростелекоме, там использовался Oracle. И политика была именно такая - всю работу должен делать сервер БД.

В веб-программировании не так?

Да, кстати, и какая разница собственно, где хранится шаблон в файле или базе, ведь все равно скомпилированная версия шаблон хранится в php-файле, и используется именно она??? Только что додумался.

Так что если шаблоны кешируются, то абсолютно все равно, где будет храниться текст шаблона, обращение к базе будет только тогда когда вы изменяете этот шаблон, т.е. только из админки и только 2 раза:
1. чтение шаблона.
2. запись шаблона. (при записи создается скомпилированная версия и записывается в кеш, т.е. на жесткий диск как файл и потом используется пользователями.)
244
25 ноября 2008 года
UAS
2.0K / / 19.07.2006
Ну если таким образом - то да, разницы никакой нет. Но помне, так все равно такое не использовал бы. Гемор один для меня. Например я хочу добавить шаблон новый, или переделал 5-6 шаблонов. Мне будет намного легче и быстрее закинуть файл на сервак и все) А уже определенные классы у меня все это дело парсят и т.д.=)

Ну, вообщем, дело твое=) Но я только за файлы, в этом случае
13
26 ноября 2008 года
RussianSpy
3.0K / / 04.07.2006
Храните однотипные шаблоны вместе...

Например шаблон вывода новостей может содержать десятки мелких элементов вроде ссылок, тела новости и т.д. - храните их в одной записи чтобы сразу выдернуть одним запросом.

Естественно при хранении шаблонов в базе к ней придется обращаться и 1-2 запросами тут дело не обойдется (я смог снизить количество обращений до 2-4). Но можно еще написать кеширование и тогда к базе вообще не придется обращаться ;)
563
26 ноября 2008 года
MrLinker
249 / / 17.09.2006
Цитата:
Так что если шаблоны кешируются, то абсолютно все равно, где будет храниться текст шаблона, обращение к базе будет только тогда когда вы изменяете этот шаблон, т.е. только из админки и только 2 раза


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

Цитата:
И политика была именно такая - всю работу должен делать сервер БД.


Ясен пень, там выделенный сервер.
А в большинстве случев web-программисты имеют дело с виртуальным хостингом, где с базой особо не наиграешься.
Поэтому необходимо, при возможности, сокращать кол-во запросов к БД, а использование файловой системы для кеширования страниц/блоков - отличный пример такой оптимизации.

Цитата:
Как еще можно вывести шаблон, чтобы выполнился код (код нужен для реализации логики), кроме как includ'ом?


При помощи функции eval().
Однако, необходимо передвать чистый php-код, т.е. экранировать html код c помощью echo, например.

Цитата:
Получается 2 типа наборов шаблонов, один тип - для станицы целиком, другой - для динамических данных в теле страницы.


Некогда я мудрил свою CMS и отказался от какого либо разделения. Все шаблоны одного типа, что макет всей страницы, что отдельный блок.
Это упростило мне жизнь.

Цитата:
Как вообще можно реализовать логику в шаблоне, например ветвление, только заменой спец. тэгов на php-код


Можно писать логику(php-код) прямо в шаблоне. Понятно, что в этом случае теряется смысл шаблонов.
При условии четкого разделения логики от представления, единственный вариант задать любую желаемую логику для шаблона - это писать код, который его парсит.
В ином случае, нужно вмешиваться в различные стадии обработки (стадию выборки данных, обработку данных перед передачей в шаблон, в каждую итерацию цикла в парсере).
Можно расширить шаблонизатор, чтобы он учитывал атрибуты для спецтагов, т.е. {NEWS rows=20}.
Популярные продвинутые шаблонизаторы это умеют.

Циклы, например, реализвать достаточно просто. Шаблон. в этом случае, содержит парные теги, например: {ROWS}{/ROWS}.

31K
26 ноября 2008 года
WarLooK
29 / / 23.06.2008
Цитата: MrLinker
Почему?
При каждом запросе к сайту надо грузить шаблон из базы данных, если он, конечно, нужен. А это есть запрос.



По моему плану - запрос к базе ведется только при редактировании шаблона (шаблон - html и спец. тэги типа <if> <else>), при его сохранении он компилируется в html+php и сохраняется в файле.

Цитата: MrLinker
При помощи функции eval().
Однако, необходимо передвать чистый php-код, т.е. экранировать html код c помощью echo, например.



Многие почему то являются ярыми противниками eval(), говорят что это зло, а почему обьяснить не могут, я до сих пор не понимаю, что в нем плохого.

Цитата: MrLinker
Некогда я мудрил свою CMS и отказался от какого либо разделения. Все шаблоны одного типа, что макет всей страницы, что отдельный блок.



Не, тип то один - html код, я имел ввиду что есть один большой шаблонище и несколько мелких шаблончиков :)

Цитата: MrLinker
Можно писать логику(php-код) прямо в шаблоне.



я под логикой в шаблоне имел ввиду не php-код. Логика разделяется в моем представлении на 2 типа: бизнес-логика (описывает все бизнес процессы на сайте) и логика представления (описывает отображение информации, например если пользователь залогинен - показывается одно, а если нет - другое). Буду значит писать парсер спец. тегов

Цитата:
Ну если таким образом - то да, разницы никакой нет. Но помне, так все равно такое не использовал бы. Гемор один для меня.



На вкус и цвет, как говорится.

Цитата:
Естественно при хранении шаблонов в базе к ней придется обращаться и 1-2 запросами тут дело не обойдется (я смог снизить количество обращений до 2-4). Но можно еще написать кеширование и тогда к базе вообще не придется обращаться



Вот об этом я как раз и говорю!:)

304
26 ноября 2008 года
Fenyx
707 / / 26.01.2005
Цитата: WarLooK
По моему плану - запрос к базе ведется только при редактировании шаблона (шаблон - html и спец. тэги типа <if> <else>), при его сохранении он компилируется в html+php и сохраняется в файле.


Учим мат часть... пхп не компилируеться (пока). И хороший стиль программирования - это разнести программный код от хтмл кода

31K
26 ноября 2008 года
WarLooK
29 / / 23.06.2008
Цитата: Fenyx
Учим мат часть... пхп не компилируеться (пока). И хороший стиль программирования - это разнести программный код от хтмл кода



php не компилируется, компилируется шаблон в php, а потом этот php выполняется до следующего изменения шаблона. Шаблон и нужен чтобы отделить html от кода.

Читаем внимательнее, уважаемый.:)

563
26 ноября 2008 года
MrLinker
249 / / 17.09.2006
Цитата:
php не компилируется, компилируется шаблон в php, а потом этот php выполняется до следующего изменения шаблона. Шаблон и нужен чтобы отделить html от кода.


Вы же собирались хранить этот самый шаблон в БД?
А значит при каждом запросе, придется обращатся за этим шалоном к базе.

Цитата:
Многие почему то являются ярыми противниками eval(), говорят что это зло, а почему обьяснить не могут, я до сих пор не понимаю, что в нем плохого.


eval() - это круто. А коль объяснить не могут, нечего тут и говорить.

Цитата:
я под логикой в шаблоне имел ввиду не php-код. Логика разделяется в моем представлении на 2 типа: бизнес-логика (описывает все бизнес процессы на сайте) и логика представления (описывает отображение информации, например если пользователь залогинен - показывается одно, а если нет - другое).


Как не назови, любая логика на сервере, в данном случае, есть php-код (Хотя не обязательно именно php).

Цитата:
Буду значит писать парсер спец. тегов


А этого никак не избежать...

31K
26 ноября 2008 года
WarLooK
29 / / 23.06.2008
Цитата:
Вы же собирались хранить этот самый шаблон в БД?
А значит при каждом запросе, придется обращатся за этим шалоном к базе.



Это верно, но у меня эти запросы будут только во время редактирования шаблона. Потому как кэш - хорошая штука.

Цитата:
eval() - это круто. А коль объяснить не могут, нечего тут и говорить.



Мне тоже нравится эта функция, правда не было нужды пока что в ней, а так удобно, ИМХО

Цитата:
Как не назови, любая логика на сервере, в данном случае, есть php-код (Хотя не обязательно именно php).


ну да, в конечном итоге это код, просто хочется его замаскировать под html в шаблонах, дабы дизайнер легче врубался.

563
26 ноября 2008 года
MrLinker
249 / / 17.09.2006
Цитата:
Это верно, но у меня эти запросы будут только во время редактирования шаблона. Потому как кэш - хорошая штука.


Народ, кто-нибудь скажите, это я чего-то не понимаю?
Пойду водички себе налью, как-то затрусило...
Уважаемый WarLooK, вам что, услугу кэширования инопланетяне предоставляют?

244
26 ноября 2008 года
UAS
2.0K / / 19.07.2006
MrLinker, кэш вручную делается, он же тут про это и говорит.

Данные считаются из БД, парсятся и компилятся в html + php (аля Smarty) и хранятся уже как файлы на серванте. Далее, при запросе пользователем страницы, берется этот файл, в него вставляются необходимые данные. В итоге этот обработанный файл отдается пользователю
563
26 ноября 2008 года
MrLinker
249 / / 17.09.2006
Цитата:
Данные считаются из БД, парсятся и компилятся в html + php (аля Smarty) и хранятся уже как файлы на серванте.


Это не кэширование, а "компиляция" шаблона.
Кэширование - это когда, например, html-текст страницы/блока с уже подставленными значениями сохраняется. При выводе страницы/блока, если обновлений не производилось, или истекло время (или любое другое условие), готовый текст тупо выводится, а если условие не выполняется, то выполняется "компилированный" шаблон (который, как я понял, решено все-таки хранить в файловой системе).

И вот как тут вас понимать:

Цитата:
Это верно, но у меня эти запросы будут только во время редактирования шаблона. Потому как кэш - хорошая штука


а?

244
26 ноября 2008 года
UAS
2.0K / / 19.07.2006
Я имел ввиду это, как кэширование на сервере) Чтобы не тянуть шаблоны из БД.
31K
27 ноября 2008 года
WarLooK
29 / / 23.06.2008
Цитата: UAS
Я имел ввиду это, как кэширование на сервере) Чтобы не тянуть шаблоны из БД.



Именно

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог