Это уже на блитз смахивает. Я кстати где-то видел решения на php. Пока и тк слишком много работы с парсером, чтобы ещё и версию блочной структуры девелопить.
MaXyC_Web_Studio А может просто функции printf и sprintf использовать? Или 2-е кавычки и в них вставлять переменные?
В этом и есть вся проблема когда начинаешь делать более-менее умный парсер. Это превращается в высокоуровневый язык программирования написанный на PHP. По мне так проще написать зачастую меньше кода на самом PHP в шаблоне. А всё форматирование данных провести в логику приложения, а оно как правило не очень уж и большое если думать заранее - к примеру я никогда не форматирую даты, т.к. вывожу их из SQL уже в нужном формате, а форматированием сообщений занимается специальный класс (т.к. данные в основном либо c PHPBB либо вообще HTML). Вызываешь один метод для каждой записи и всё. К тому же многие тут спорят по поводу того, что в шаблоне не должно быть вообще логики. А если шаблон сложный и в нём нужно выводить ьлоки в зависимости от 4-х уровней доступа? Т.е. чем больше уровень, тем больше блоков видит пользователь. Выносить на уровень приложения? ИМХО, мне проще в шаблоне вставить PHP: <? if (is_set('items')) {?> <table> <? if (get('access') >= MODERATOR) {?> <tr> <td><a href="delete.php?id=<?get('item_id')?>">Delete</a></td> </tr> <?}?> <? foreach (get('items') as $row) {?> <tr> <td><span class="heading"><?=$value['name']?></span><p class="text"><?=$value['msg']?></p></td> </tr> <?}?> </table> <?} else {?> <div class="no-data">No data avaliable</div> <?}?> Имхо, ничуть не хуже чем любой шаблонизатор. Те же теги, только PHP'ные, та же логика, только не компилируется перед исполнением и есть свобода выбора между конструкциями. А вдруг где-то нужен будет switch (ну мало ли какие задачи попадаются - бывает и такое) или while вместе for или foreach. Да и логика самой программы сильно упрощается и куда понятнее чем если бы все эти условия были бы в программном коде. Так что всё это фигня. Я вот щас работаю с системой, где в шаблонах для подстановки используются XML style теги. И отнюдь не потому что круто или быстро или так захотелось, а потому что там нужен такой функционал и он там к месту - из XML выжимается всё что тока можно, потому что программируются системы автоматизированного управления целыми далеко не маленькими предприятиями, где контракты на разработку заключаются на годы. Шаблон по сути управляет выводом данных. Там event-based система и обработка чем-то похода на MVC подход, однако там только два управляющих компонента: Event handler и Tag processor. Если честно, помоему даже куда удобнее чем MVC Я считаю что делать мощьный парсер есть смысл тогда, когда шаблон задаёт поведение системы, когда он указывает что нужно вывести данные вот для этого модуля, а потом для этого. И есть ещё обработчики событий. А если идёт логика приложения и оно уже указывает какие шаблоны выводить - парсер не нужен, хватает небольшого класса-прослойки для сбора данных в одном месте и лёгкой абстракции от самого приложения - главное что бы всё запихнули в класс а каким образом - шаблону плевать. Остальное на мой взгляд извращение в контексте PHP, т.к. от этого драматически страдает производительность. ИМХО. Я сказал.
2 Psih: А этот парсер собственно то и делает, что ты сказал. И делает единажды. О чём и разговор, что стоит ли париться писать пыхные теги руками, или же их разок обработать парсером. Конечно с функционалом не поспоришь, да и отсутствием шаблонки как вида, но ведь и обращение к значениям массива быстрее по цифрам идёт, однако же все юзают буквы. Точно так же и на асме никто не пишет. С, для вёба тоже отпирает по тихой. Удобство побеждает. 2 vs: А куда денутся короткие теги? А как же поддержка снизу вверх? Если так и будет, то будут конфигурить так, чтобы так не было. Начнут парсеры писать, заменяющие короткие на длинные )))) Но имхо это гон.
Danilka А разница между написать тег шаблонизатора или написать тег PHP? Т.е для меня разницы между ниже описанным нету. PHP: <?=get('items')?> <!-- vs //--> {MODULENAME_ITEMS} Почему здесь ещё есть module name - что-бы в большой системе не случилось конфликта имён (уж поверь, когда проект вырастает за 1.5-2 MB тока PHP кода это уже становится проблемой).
насколько я понимаю, нельзя использовать теги {: и :} ? можно только однобуквенные? Просто с []возникают большие проблемы с js массивами в теле шаблона. В тоже время с {} иногда вообще отказывается работать. + ко всему я-то думал, что из кеша отдаются готовые html, заглянул сегодня туда, а там пруд-пруди <?php echo ?>. Не самое радостное открытие.
продолжаем наш концерт. Я очень прошу ввести поддержку тегов в стиле {: :}. И чтоб они не вызывали ошибок. Так же хотелось бы чтоб в кеше был чистый html. Или тогда объясните мне какой вообще смысл такого кеширования. В заключение: доделал тут скрипт голосования: http://www.koc-tmp.tu2.ru/ регистрацию не писал. Просто идем на login.php и вводим придуманый cookie(int). через admin.php добавляются опросы (не запаролено. Добавляйте че хотите) Итого: этот шаблонизатор+jQuery+amCharts+swfObject+часть CSS с Хабра . огромная просьба к Danilka: раз уж ты автор шаблонизатора, то глянь Код (Text): http://www.koc-tmp.tu2.ru/vote.zip - исходники и поправь их так, как делал бы ты. + Ко всем остальным: тоже помогите советом по оптимизации/улучшению кода и шаблонов. Зы: [offtop]дайте мне какую-нить идею для сайта/стартапа. Хочется немного попрактиковаться.[/offtop] upd: баг1 - нужно проверять, отвечал ли кто-нить на этот вопрос. Если нет, то не стоит пытаться выводить результаты. баг2 - проблемы с кодировками и ajax. Нужно отправлять header. недоделка1 - $anonym=0 предполагает не выводить uid пользователей в результатах. Еще не сделано. недоделка2 - $showNoVoted=1 предполагает не показывать результаты не проголосовавшим. Еще не сделано. идея1 - отказаться от swfObject и делать все силами jQuery
2 Koc: Ща буду посмотреть на голосовалку. А что за проблема была с тегами { } ? Одинарные должны были работать без проблем. Двойные посмотрю и сделаю поддержку, но хотелось бы как можно скорее знать, что не так с одинарными, чтобы сразу подправить. Не совсем понял что не так с кешем? По-моему я изначально описал что так и будет. Это не тот кеш о котором ты говоришь. "Тот" появится после создания нескольких версий. Как уже обсуждали ранее. Сейчас немного загружен, так что разделение версий будет не сию секунду, а чуть погодя. Про стартапы, могу подкинуть такое дело. У меня есть домен timemail.ru уже очень давно. Было решение, но потом загнулось что-то. Всё мечтаю написать, но руки чувствую никогда не дойдут. Могу предложить создать проект. Суть идеи можно посмотреть на http://futureme.org То, что проект не коммерческий, исключает драку за права, обладание и т. п. P.S. С меня домен и хостинг.
Не совсем понял, что я должен был увидеть в коде... Тем более его там такая куча. Но так при создании голосования вылезла целая куча варнингов. А почену не ользуешься буфером? В начале скрипта пишешь PHP: ob_start(); В конце PHP: ob_end_flush(); И все проблемы с выводом хэадеров решаются.
возможно с loop'ами можно было б как-то по другому сделать. вспомнил, какие проблемы были с {} - они в js используются.
Koc, Danilka, можно сделать так: если после { сразу идет идентификатор, то это спецтег шаблонизатора, иначе - обычная скобка. Тогда проблем с JS/CSS не возникнет.
Вообще я что-то такое делал, но точно не помню. Постораюсь посмотреть сегодня. А так, я делаю, как mclaud.
Разобрался с тегами. Теперь поддерживается любая длинна. Так же не обрабатываются теги [' [" [пробел. Прошу всех к тестированию. Я не нашёл ошибок, связанных с тегами. Последняя версия на сайте 0.5а
2 момента, из-за которых я так хотел эти теги: если нам нужно сгенерировать конструкцию типа: ... <input type="text" name="answer[0]" size="50" /> <input type="text" name="answer[1]" size="50" /> ... Как это делать? <input type="text" name="answer[[id]]" size="50" /> - не даст ничего толкового. <input type="text" name="answer\[[id]\]" size="50" /> - тем более. Выносить js тоже не всегда получается: var myVar = [tVar]; . в общем сейчас потестирую новую версию, попробую исправить свои недочеты. Зы: интересен так же шаблонизатор из CacePHP. Не ставил этот фреймфорк и не знаю, как он там кеширует: html или нет, но есть очень прикольный тег <nocache></nocache>. Что между ним - не кешируется. зызы: PHP: <?php private function write_cache( $data ) { $all = $this -> load_all; $load = $this -> load; $cache_dir = $this -> cache_dir; $cache_name = $this -> cache_name; $data = str_replace( '\[' , '[' , $data ); $data = str_replace( '\]' , ']' , $data ); if( file_put_contents( $cache_dir.$cache_name.TPL_CACHE_FILE_TYPE , $data ) ) return( true ); else return( false ); } ?> строки 8 и 9 мне определенно не нравятся.
С кэшем хтмла будем разбираться в "версиях". Просто перед разделением хотелось по лучше отдебажить то, что есть. Про зызы: Да уж, я и забыл, что такое есть, а вчера не заметил. Сегодня подвыкину и выложу. Версиюя обновлять не буду, просто тут отпишу, когда сделаю.