Цитата:
Цитата:
Цитата:
Цитата:
Цитата:
я думал, ты на сервисы разбил в связи с ограничением количества одновременных запросов на домен. Ну т.е. по инерции, после статики (или они тоже отдельные сервисы?). Вообще создается впечатление, что роутер у тебя будет внешне-внутренним, в результате... Цитата:
Цитата:
Цитата:
DjDiablo, я все еще помню, что ты обещал помочь с тестированием разобраться :\ p.s. карма напомнила ситуацию в Зимбабве |
Цитата:
В любом случае это именно тот подход: "страница, на которую пришел запрос, сама вытягивает нужные ей данные." Цитата:
Во втором примере вроде бы всё очевидно: для страницы данные формируются в одну пачку, для AJAX-запроса придется писать свой сервис/контроллер/как хотите Цитата:
Цитата:
Цитата:
Цитата:
Цитата:
Цитата:
Вообще, забудьте про "объединенный вариант". Сейчас я склоняюсь к модели, в которой шаблон будет асинхронно дергать ручки и обрабатывать от них ответ. Соответствующий шаблонизатор скоро научится это делать. Цитата:
|
Цитата:
Цитата:
какие проблемы я вижу? 1) говрят, в процессе рендеринга шаблона, может выясниться, что другой блок надо перерендерить. Мне никаких конкретных примеров в голову не приходит. Разве что несколько другой вариант, когда блок может потребовать подключить далее по тексту страницы нужные js-файлы или вставить нужный js-код (вариант, когда теги скрипт указаны перед </body>). Но это вроде решаемо. Т.е. если обобщить: рендеринг блоков может влиять друг на друга, и должна быть возможность это как-то решать 2) как будут исключения/ошибки обрабатываться? больше ничего не приходит в голову... Теоретически, должно быть реализуемо и не сложно. Вопрос в том, в чем преимущества активного шаблона и когда его использовать. Возможно, для основного контента страницы больше подходит пассивный шаблон, а для дополнительных (меню, баннеры, и т.д.) - активный... ну и не надо забывать, что есть POST (действие) и GET (вывод), т.е. не на каждый запрос надо рендерить шаблон. |
Цитата:
Цитата:
Цитата:
Цитата:
|
а вообще, если шаблон будет напрямую обращаться к параметрам запроса, не нравится мне такой вариант. Поэтому гибридный вариант мне кажется оптимальным.
Цитата:
Цитата:
Цитата:
|
Цитата:
Раз уж речь пошла о шаблонизаторах, стоит говорить на примере какого-то конкретного. Предлагаю TSN, так как он будет использоваться у меня. Ну и в контексте NodeJS. Цитата:
Цитата:
Я считаю надо делать так. Цитата:
|
Цитата:
Цитата:
Цитата:
и расскажи подробнее, как происходит обработка запроса. А то я вот придумал ситуацию, но не знаю, возможно ли такое при твоем подходе: запускается рендеринг шаблона и когда дело доходит до основного контента выясняется, что 404 Not Found. Т.е. весь этот рендеринг выше был ненужным, чего хотелось бы избежать Цитата:
|
Цитата:
Цитата:
Цитата:
Ну и при поддержке нужно будет синхронизировать шаблон с логикой агрегации данных, а это лишний геморрой. Его не будет в активных шаблонах. Цитата:
Цитата:
Рядом можно посмотреть на примеры запросов данных, если интересно. Цитата:
Цитата:
|
Цитата:
|
Цитата:
Цитата:
Цитата:
Цитата:
Цитата:
Цитата:
Цитата:
Цитата:
кстати, есть все-таки две вещи, которых немного не хватает в mustache... :) |
Цитата:
Цитата:
1. На объекте пространства имен шаблонизатора генерируется ошибка: { message: 'ReferenceError: data is not defined', templatePath: 'путь к шаблону', TypeError: 'RenderError', nodeName: 'имя тега', line: 'номер строки', char: 'позиция символа, с которого начинается тег' } 2. Тег со всем содержимым не попадает в результат. 3. Если использовать опцию конфига debug - true, на месте тега будет сгенерирован html-код: <h3>RenderError:<br /> ReferenceError: data is not defined<br />Template: templates\page.xml<br />Node name: if<br />Line: 30<br />Char: 2</h3> Цитата:
1. Запрос передается в сервис. 2. Сервис валидирует запрос и вызывает подходящий шаблон. Цитата:
Цитата:
Цитата:
Всё-таки есть некий предел. В PHP его нет. Цитата:
Цитата:
|
Цитата:
Представь обычную рабочую ситуацию: пришел таск убрать некий блок. У нас сейчас достаточно скинуть задачу на верстака и он всё сделает. А так придется напрягать как верстака так и кодера. Круто? Я считаю что нет. |
Цитата:
Цитата:
Цитата:
Цитата:
Цитата:
Кроме того, следующий момент остался без примера: Цитата:
|
Цитата:
TEN.on('error', function () {}); Какие сайчас могут быть ошибки на этапе шаблонизации: 1. Ошибки выполнения шаблона. Типо из JS-выражения обращаемся к неизвестной переменной. Такие ошибки обрабатываются на том уровне, из которого вызывается шаблон для рендеринга, что логично. Некорректный кусок шаблона вместе со своим содержимым не выводится (или выводится отладочная инфа) и при этом никак не влияет на выполнение остального. К этим ошибкам так же относятся исключения, выкидываемые методами получения данных (ручка). 2. Ошибки получения данных. Типо: Цитата:
Эти ошибки так же могут быть обработаны на уровне логики получения этих данных. Цитата:
Цитата:
Если бы задача стояла как: "выпилить такой-то блок со всего сайта", кодер выпилил бы ручку. Кодеру в любом случае как минимум нужно посмотреть таск. Если он хорошо знает систему, то сходу было бы ясно - выпиливать ручку или нет. Цитата:
Цитата:
Цитата:
Как я вижу рабочую ситуацию, используя мой подход с активными шаблонами: Пришел таск: "вывести список online-пользователей". Таск переводится руководителем на кодера. Кодер реализует метод getOnline. В комментах к таску пишет: "Дернуть метод getOnline. Принимает аргументы: (бла бла), возвращает параметры: (бла бла)." и переводит на верстака. Верстак пишет в шаблоне: <ten:query method="getOnline" arguments="" params="error, data"> <ten:if expr="data"> <!-- обработка data --> </ten:if> </ten:query> Где тут много кода? Не намного больше чем в пассивном шаблоне. Если придет задача вывести этот блок на другую страницу, кодер, зная что уже есть такой метод, перекинет таск сразу на верстака. Совершенно не задумываясь куда его нужно вставить. Как тебе такой сценарий? Можно работать? |
Какая-то у тебя странная категоризация ошибок: "К этим ошибкам [парсинга] так же относятся исключения, выкидываемые методами получения данных (ручка)." Какого плана исключения?
Цитата:
Кого кому жалко... не думаю, что это способствует конструктивному обсуждению... А у php как шаблонизатора не большие недостатки (как для меня): 1) невозможно наследование шаблонов, 2) нереализуема защита от дурака, ну и от ошибок типа "забыл проэкранировать переменную". Знаешь, был какой-то период когда я возлагал слишком большие надежды на них (шаблонизаторы), а потом пришло понимание, что native php ни чем не хуже большинства существующих, а то и лучше. Ну и не только у меня так было. Наверное это был акт массового слабоумия :) Цитата:
Цитата:
Цитата:
Цитата:
Как я говорил, я бы разделил контент на основной (то, что соответствует url) и дополнительный (всякие top10, баннеры, меню, наверное). Данные из url должны передаваться пассивным методом, из контроллера в шаблон, а остальное можно и активным. При этом шаблон в любом случае состоит из активной части, которая получает нужные данные либо от контроллера, либо сама, из модели, и подготавливает их для отображения. И пассивной, которая рендерит данные. Первое давай назовем вид, второе - шаблон. Цитата:
<ten:query method="getOnline" arguments="" params="error, data"> <ten:if expr="data"> <!-- обработка data --> </ten:if> </ten:query> {{#online_users}} {{/online_users}} но я говорю в первую очередь не о том, что его больше, а что он неудобно записан. Потому что в твоем шаблоне рендеринг смешивается с кодом. Т.е. сложнее понять, что должно отрендериться. Потому что это для тебя менее приоритетная цель, чем чтобы-кодера-не-отвлекали-по-пустякам. Цитата:
Цитата:
|
Цитата:
Цитата:
Цитата:
Цитата:
Цитата:
Цитата:
Цитата:
<ten:context object="online_users()"> </ten:context> Цитата:
Цитата:
|
Цитата:
Цитата:
Цитата:
Код:
f(1, 2, 3) <call function="f"> <arg value="1"> <arg value="2"> <arg value="3"> </call> :) Цитата:
Цитата:
Цитата:
Цитата:
|
Цитата:
Цитата:
Вызвал функцию с аргументом - числом. Функция ожидала строку. Либо функция сама падает (например, пытается применить к аргументу метод строки), либо она проверяет тип и выкидывает исключение. Т.е. это то же самое, что и ошибка программиста, о которой ты писал выше. Что касается ошибок обращения к ресурсам. Сами обращения происходят в недрах логики метода, вызываемого из шаблона, правильно? В ноде принято в callback первым параметром прокидывать объект ошибки, если это имеет место быть. Так вот, допустим в недрах этого метода возникла ошибка обращения к ресурсу и логика метода это отловила. Метод может передать в callback этот объект и уже в шаблоне на уровне разметки это обработается. Пример: <ten:query method="getOnline" params="error, data"> <ten:if expr="error"> <!-- произошла ошибка доступа к ресурсам или ещё что --> <ten:else if="data" /> <!-- всё ок, пришли данные, обрабатываем их --> </ten:if> </ten:query> Если ты про это говорил, то всё разделено. Если нет - расскажи на примере что ты имел ввиду. Цитата:
Тем более, в том же Dust можно вызывать функции и обрабатывать от них результат. Логика таких конструкций ничем не отличается от моего шаблонизатора (см. пример с query, context), кроме синтаксиса самих конструкций. Цитата:
Цитата:
Цитата:
А, я понял. Тебе нравятся шаблоны типа: Код:
<% for (var i; i < array.length; i++) { %> Цитата:
Цитата:
Цитата:
Если не использовать некоторые конструкции в моем шаблонизаторе, то он ничем не будет отличаться от Mu или Dust. |
Цитата:
Цитата:
Цитата:
Цитата:
Цитата:
Цитата:
2) моя религия (читабельность, разделение обязанностей) ни чем не хуже твоей (по-меньше дергать кодера); 3) у меня складывается впечатление, что ты все что я говорю (по-крайней мере в последнее время) ты списываешь на религию, это так? Цитата:
Цитата:
Цитата:
Цитата:
Цитата:
Цитата:
да, давай приведу пример: Пример: 1.xml
<?xml version="1.0" encoding="UTF-8"?> <ten:root xmlns:ten="TEN" xmlns="http://www.w3.org/1999/xhtml"> <ten:block> <ten:query method="getOnline" params="error, data"> <ten:each object="data" item="user"> <ten:echo data="user.name" /> </ten:each> </ten:query> </ten:block> </ten:root> и как-нибудь так: Пример: 1.mustache
{{#onlineUsers}} {{name}} {{/onlineUsers}} Пример: 1.js
this.onlineUsers = getOnline(); |
Цитата:
Цитата:
Цитата:
Цитата:
Цитата:
Цитата:
Цитата:
Цитата:
Цитата:
Общую суть твоей религии я понял, остается только понять чем она лучше и что она дает как кодеру так и верстаку. Цитата:
Цитата:
|
Цитата:
Цитата:
Цитата:
Цитата:
Цитата:
Цитата:
Цитата:
Цитата:
Цитата:
|
Цитата:
|
Цитата:
|
Цитата:
С другой стороны, как сказал B~Vladi, TSN может работать с любым форматом данных, поэтому нет смысла привязываться к XML. Тогда почему бы не сделать дополнение для шаблонизатора, которое бы проверяло валидность XML-кода? Все остальное, как мне кажется не так существенно, т.к. есть основные управляющие конструкции, удобный вызов функций, возможность получения переменных окружения, встраивание шаблонов.... что еще нужно? Цитата:
PS: Еще меня сильно смущает, тот факт что шаблонизатору слишком многое дозволено: <tsn:if> <tsn:else if="typeof this === 'string'" /> </tsn:if> Если уж отделять логику от представления, то этой логике (typeof this === 'string') явно в шаблоне не место :) |
Цитата:
И ещё вопрос - что валидировать? Исходный код или конечный результат? Исходный валидирует IDE, конечный тот инструмент, которому он отдается (браузер, например). Цитата:
Ну и опять же, никто не запрещает валидировать эти данные до входа в шаблон. Цитата:
Цитата:
Цитата:
Цитата:
Цитата:
Ещё раз хочу обратить внимание, что TSN не принуждает к использованию какой-то конкретной модели шаблонизации. Хочешь - пишешь пассивный шаблон и не пользуешься этими вызовами. Хочешь - активный. То же самое и с выражениями. Если видишь, что typeof-у не место в шаблоне - выноси в логику и совесть будет чиста. Цитата:
monolithed, расскажи нам, что вам это дает? И даёт ли. |
Цитата:
Цитата:
Цитата:
|
Цитата:
Так как функция getOnline синхронна, нет смысла вызывать её из query. Шаблон должен выглядеть так: <?xml version="1.0" encoding="UTF-8"?> <ten:root xmlns:ten="TEN" xmlns="http://www.w3.org/1999/xhtml"> <ten:each object="getOnline()" item="user"> <ten:echo data="user.name" /> </ten:each> </ten:root> Или так: <ten:each object="getOnline()" item="user"> <ten:echo data="user.name" /> </ten:each> |
Цитата:
В общем-то все уперлось в то, что "надо ли дергать ручки прямо в шаблоне". Не уверен, что это так уж плохо. Но с другой стороны, не уверен, что это решение распространенной актуальной проблемы. Ну или чем тут еще руководствоваться, кроме распространенности проблемы? а чего это getOnline - синхронна? p.s. сорри, не особо старался сделать оптимальный tsn-шаблон... :( |
Цитата:
Цитата:
Цитата:
this.onlineUsers = getOnline(); Цитата:
|
Цитата:
Цитата:
Цитата:
|
Часовой пояс GMT +3, время: 14:53. |