![]() |
Модераторы: skyboy, MoLeX, Aliance, ksnk |
![]() ![]() ![]() |
|
CyClon |
|
||||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 838 Регистрация: 3.12.2005 Репутация: 3 Всего: 4 |
Юзал поиск, очень много тем про шаблонизаторы, много чего обсуждалась... Но все не то что мне нужно...
С чего начнем? Я хочу написать свой шаблонизатор, который будет тесно интегрирован с моей CMS (которую я напишу в последствии). Хочется, чтобы шаблонизатор соответствовал только моим требованиями, ничего лишнего, соответственно скорость работы на высоте. Созрели вопрос: 1. Классом или функциями писать? (Вопрос хоть и глупый, но все же, может найдутся сторонники второго варианта) 2. Какими должны быть сами шаблоны в идеале? Я хотел сделать вообще всего лишь один файл, например index.tpl в котором бы был весь код выдаваемой страницы, только места где нужно что-то вставить были заполнены спец-тегами типа {TITLE}, {PAGE} и т.д. Все вроде бы просто, но тут встает вопрос: как быть с блоками? Не стал сильно напрягаться и пока что сделал так:
Файл index.tpl имеет содержание:
То есть сначала я обрабатываю все файлы, соединяю их в одну переменную, потом я обрабатываю index.tpl и вместо {BODY} вставляю все что собрал с других файлов, причем файлы block-xxx я обрабатываю циклом, т.к. блоков может быть несколько. 3. Как парсить шаблоны? Создавать для каждого свой объект и парсить каждый кусок, потом вне класса собирать все в кучу и выводить, или может написать класс с учетом того что у меня куча файлов, чтобы шаблонизатор принимал в качестве аргумента каталог шаблона и дальше уже собиралось все внутри одного объекта. 4. Правильно ли я понял смысл работы шаблонизаторов, разумно ли их использование в моем случае и все ли я делаю рационально? Может нужно кардинально изменить взгляды на какие-либо вещи? Например все-таки использовать один файл шаблона, а в нем для обработки блоков придумать нечто:
То есть, чтобы в этом месте вызывалась функцию block, которая циклом бы выводила нужные блоки (Получить содержание из БД - отпарсить блок - закинуть в переменную, и так циклом, потом вернуть переменную) |
||||||
|
|||||||
Alexey007 |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 129 Регистрация: 30.3.2007 Репутация: 1 Всего: 1 |
CyClon, а я храню шаблоны в БД
![]() Быстрее вызывает "в студию" ![]() Добавлено через 2 минуты и 5 секунд Про парсить, я делаю замену примерно так:
Пояснение надеюсь лишнее ![]() ![]() |
|||
|
||||
CyClon |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 838 Регистрация: 3.12.2005 Репутация: 3 Всего: 4 |
Ну str_replace это только вступление
![]() |
|||
|
||||
GZep |
|
|||
![]() участник Винграда ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1528 Регистрация: 7.7.2006 Где: Москва Репутация: 8 Всего: 32 |
Smarty всех делает... так используется механизм компиляции, поэтому работает очень быстро.
Это сообщение отредактировал(а) GZep - 15.5.2007, 20:59 -------------------- ![]() ![]() |
|||
|
||||
Alexey007 |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 129 Регистрация: 30.3.2007 Репутация: 1 Всего: 1 |
GZep, автор написал, чот хочет сделать свой шаблонизатор, без наворотов.. а Smarty оч. навороченный, хоть и работает быстро
![]() |
|||
|
||||
vasac |
|
||||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1060 Регистрация: 4.5.2006 Репутация: 8 Всего: 36 |
Писать так, чтобы в конце не было мучительно больно. Идеалов нет, есть потребности конкретной задачи.
На протяжении долгого времени я пытаюсь понять, почему создателям шаблонизаторов {TITLE} кажется более лучшим, оптимальным, быстрым и более понятным для верстальщиков-дизайнеров, чем <?=$title;?>. Пока не понял и никто объяснить мне не смог. Может вы сможете? |
||||
|
|||||
CyClon |
|
||||||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 838 Регистрация: 3.12.2005 Репутация: 3 Всего: 4 |
Значит классами ![]()
Ответил красиво, не спорю, только вот мне от этого ответа не жарко не холодно ![]()
Чтобы "отделять мух от котлет", иначе говоря отделить программный код и HTML. Плюс не везде поддерживается <?, нужно писать <?php, а так же если вы написали <?=$title?> почему бы не написать <?php for ($i = 0; $i < 10; $i++) { sleep(1); echo $i; } ?>... Так можно сделать, но так никто не делает, ибо это выглядит как минимум по-идиотски, да и зачем тогда шаблонизатор.
Хочется свое написать именно для своей CMS. Смарти слишком наворочен и то время, которое я потрачку на изучение его возможностей я лучше двину в другой русло, например на изучение теории шаблонизаторов и написания своего ![]() |
||||||||
|
|||||||||
Alexey007 |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 129 Регистрация: 30.3.2007 Репутация: 1 Всего: 1 |
Попытаюсь ![]() Мне кажется, что именно легче писать только скобки {} чем много всего, типа <?=$****;?> А так ответ: проще воспринимается ![]() CyClon, если нужно, выдам функцию шаблонизатора.. ну и саму структуры БД ![]() Ну регулярки потом... Я просто пример показал ![]() |
|||
|
||||
WolfON |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 604 Регистрация: 19.7.2004 Репутация: 6 Всего: 8 |
Интерпретатор на интерпретируемом языке - это бред, по этому надо писать либо компилирующий шаблонизатор (типа смарти, он свои шаблоны переводит в php-код), либо, если уж очень важна скорость - модуль на c\c++ к php.
А писать все это так, как удобно будет потом дорабатывать ) На мой взгляд, смарти совсем не излишен и по сути является лучшим решением, хотя для очень-уж прогрессивной cms имеет смысл выбрать связку xml + xslt. Да и вообще, почему-бы вам просто не порыться в исходниках того-самого-смарти? |
|||
|
||||
CyClon |
|
||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 838 Регистрация: 3.12.2005 Репутация: 3 Всего: 4 |
Я так понял, он регулярками переводит все в PHP код, потом запускает его через eval? ) Смысл тогда?
Огромен он, страшно рыться. Вот с по-проще шаблонизаторе порылся бы, подскажите какой-нить? ![]() |
||||
|
|||||
xolod |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 148 Регистрация: 24.5.2005 Где: Когда: Что: Репутация: 4 Всего: 13 |
Нет, в Смарти три уровня: 1. Шаблоны 2. Компилированные шаблоны 3. Кеш Шаблоны - то, что написал кодер. Компилированные шаблоны, суть те же шаблоны, в которых конкретные действия на языке Смарти ({foreach} например) переведены в натуральный php-код. Кеш - это обычный html с специальными заголовками и, только когда это нужно кодеру, ссылками на динамические вставки. Смарти с отключенной компиляцией и кешированием работает довольно быстро. Смарти с включенной компиляцией и отключенным кешированием работает очень быстро. Смарти с включенными компиляцией и кешированием работает практически так же, как если бы на сервере у вас лежали статические html. Свой шаблонизатор быстрее не сделаете (по крайней мере меньше чем за год-два), универсальнее тоже. Однако изучив поверхностно Смарти можно на 100% интегрировать его с любой CMS. Напоследок: он не так огромен, это вас страшат глаза. Это сообщение отредактировал(а) xolod - 15.5.2007, 22:20 |
|||
|
||||
WolfON |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 604 Регистрация: 19.7.2004 Репутация: 6 Всего: 8 |
А смысл в абстракции. Дизайнеру, да и программисту значительно проще читать\понимать\редактировать\осозновать код вида: {HELLO}, чем <?=$hello;?>. Про то, как выглядят всякие циклы и тд я вообще не говорю. Ну и разные приятные фишки там тоже присутствуют )
Не очень-то и огромен, никто ведь не заставляет читать все дополнительные модули - достаточно порыть всего-лишь один Smarty.class.php, благо, весь код хорошо откомментирован |
|||
|
||||
vasac |
|
||||||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1060 Регистрация: 4.5.2006 Репутация: 8 Всего: 36 |
Извиняюсь за назойливость, но чем проще? Имхо, это два абсолютно различных понятия — "различие алгоритмического мышления у программиста и верстальщика" и "влом набрать лишних три символа". Насчет, читать/понимать — если использовать любой редактор с элементарной подсветкой, то php-вставки будут абсолютно четко видны, в то время, как {} из простого текста визуально вычленить куда сложнее. Что за фишки из-за которых следует отказываться от всей мощи, скорости и гибкости PHP? Не использовать циклы и не будет проблем. А если нужно использовать, никакой шаблонизатор не поможет. Почему-то считается, что код:
он элементарен для понимания человеком не имеющим опыта программирования. И любой верстальщик сможет с легкостью разрулить какую-то циклическую ситуацию в шаблоне в такой код. А вот такой код, абсолютно непонятен, ни верстальщику, ни программисту:
Но фиг с ними с циклами (может быть действительно фигурные скобки сильно на умы действуют) и со Смарти (в нем все-таки есть и другие фишки). Но делать элементарные вставки {TITLE}, чтобы потом все это просто мучать str_replacом, вот в этом я смысла никакого не вижу. Извините, если что не так. |
||||||
|
|||||||
CyClon |
|
||||||||||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 838 Регистрация: 3.12.2005 Репутация: 3 Всего: 4 |
Ты думаешь я не умею работать с файлами и организовывать кеширование? Ничего сверхъестветсвенного не вижу, абсолютно. Кеширование это максимум 50 срок кода, компиляция - это перевод один раз запустить псевдо-компилятор, который переведет шаблоны в PHP код. Можно сделать, например, так:
Я готов жертвовать скоростью ради красоты реализации. Меня <?=$var?> не устраивает, я хочу максимально отделать HTML от PHP.
От гибкости при правильной реализации мы не отказываемся, к тому же подчерку то, что я хочу написать быстрый шаблонизатор. Повода сомвеваться в своих возможностях в данной области на данный момент нет, к тому же есть куча литературы и умные дядьки с винграда ![]()
Гениально. Без циклов не обойтись, так как блоков может быть неограниченное количество, при верстке шаблона мы не знаем сколько их будет + их количество может меняться.
Я не собираюсь оргазиновывать такие конструкции в шаблоке, эти ситуации (например когда выводить "Добро пожаловать ***" или "Зарегистрируйтесь") будут обрабатываться в CMS. |
||||||||||||
|
|||||||||||||
vasac |
|
||||||||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1060 Регистрация: 4.5.2006 Репутация: 8 Всего: 36 |
Я тоже совершенно не собирался сомневаться в твоих технических навыках. Я говорю о самой идее, а не о том, что ты не сможешь ее нормально реализовать.
Т.е. тебя принципиально не устраивает именно PHP? Или ты все таки имел ввиду "HTML от программного кода"? Но ведь все эти шаблонные вставки являются все тем же программным кодом, пусть и не на PHP, точно так же не знакомыми стороннему верстальщику. Компиляцией во что? В машинные команды? Или все-таки в тот же PHP? Тогда чем быстрее он будет чистого PHP? Нормальный php-файл, подключаемый через include() будет оттранслирован в байт-код и храниться в памяти все время работы интерпретатора (а не одного процесса).
Тогда как они будут выглядеть в синтаксисе твоего шаблонизатора, если от {foreach} ты отказываешься?
Как обрабатываться? Формировать html-код? Тогда где же это самое чистое отделение html от PHP за которое мы тут сражаемся? |
||||||||
|
|||||||||
![]() ![]() ![]() |
Правила форума "PHP" | |
|
Новичкам:
Важно:
Внимание:
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, IZ@TOP, skyboy, SamDark, MoLeX, awers. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | PHP: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |