Andy ([info]neithere) wrote,
@ 2006-06-12 06:10:00
Previous Entry  Add to memories!  Tell a Friend  Next Entry
Entry tags:dev, soft.acme, web

Готов работающий прототип для Акме (0.x→1.0?), в котором:

  1. хитро поддерживаются дружественные урлы;
  2. действия могут запускаться в двух контекстах: первичный и вторичный;
  3. методы всех уровней имеют единый API, который в минимальном виде ограничивается кодом ответа.

Как освобожусь, буду переносить на него текущую версию Акме (0.7+). А пока — чуть более подробное описание прототипа:

1. Урлы

  1. проекция урла на код (поиск действия по первому компоненту урла); если не вышло, то:
  2. проекция урла на данные (поиск элемента дерева1 с наиболее похожим на урл супертегом)

2. Действия

  1. Действие запускается как первичное; может выбирать content-type. Если это application/xhtml+xml, то:
  2. Запускается шаблонизатор, который может запускать другие действия как вторичные (они уже обязаны предоставлять контент только в application/xhtml+xml; если что, могут давать линк на себя, тогда по линку они запустятся в первичном контексте)
  3. Все действия в любом контексте могут переформулировать внутренний урл (см. API) и перенаправить его в другое действие. Контроль числа «прыжков» (защита от бесконечного цикла).

3. API

3.1. Вызов

Как обычно, $h->interact({ foo => 'bar' });, т.е. именованные аргументы. При этом для действий (в т.ч. вложенных) аргумент path содержит ссылку на массив следующего вида: [ 'user', '1', 'profile', 'edit' ]. Каждый модуль (звено цепочки вызовов) откусывает необходимое ему число аргументов и работает с ними; далее он может вызвать свой подмодуль, передав ему измененный путь, или переформулировать начало пути и вызвать другое действие.

Т.о., path — из браузера, шаблона или кода — является главным средством оформления запроса к действию. Ессно, это не распространяется на другие модули (не действия).

3.2. Ответ

Примерный вариант ответа:

$response = {
	code    => 200,
	content => {
		name => "Greeting",
		type => "application/xhtml+xml",
		body => "<p>Hello world!</p>"
		}
	};

Обязательным элементом является только code (код ответа). Коды ответа взяты из спеков HTTP. Итак, в API минимальный ответ выглядит так: { code => 404 }. Этот код будет передаваться по цепочке назад, пока не будет заменен или не достигнет контроллера. В контроллере код ответа будет преобразован в нормальный текст через gettext (i18n), т.е. будут заполнены $response->{content}{name} и ...{body} (если переменные были пусты). Затем все это отдается шаблонизатору.

Внутри content нет обязательных элементов; могут быть дополнительные.

Примечания:

1 Дерево состоит из категорий. Это жесткая иерархия на вложенных множествах. К категориям цепляются сообщения. Но на самом деле категория может быть и сообщением тоже. Это две роли узла. Таким образом, мы можем спокойно сажать в урл (и меню) как категории, так и сообщения.
Комментарии не могут быть узлами.

Кстати, прототип весит 17 кб вместе с документацией и дебаговым мусором. Вот поэтому меня особенно бесят всякие JS по полмегабайта.




(7 comments) - (Post a new comment)


[info]ike_novodvorsky
2006-06-12 02:44 pm UTC (link)
Что-то непонятно ничего
И кстати непонимал никогда друвовидной структуры -- у ctmz реализова one to many и many to many

(Reply to this) (Thread)


[info]neithere
2006-06-12 03:12 pm UTC (link)
что именно непонятно?

что такое ctmz?

(Reply to this) (Parent)(Thread)


[info]ike_novodvorsky
2006-06-12 03:28 pm UTC (link)
ctmz == у меня

структура системы непонятна. Можно подробнее для публики?

(Reply to this) (Parent)(Thread)


[info]neithere
2006-06-12 04:30 pm UTC (link)
Acme — это постоянно перестраивающаяся CMS, желающая в перспективе стать CMF.
см. http://acme.sourceforge.net
также см. http://neithere.livejournal.com/tag/soft.acme
в частности, http://neithere.livejournal.com/165861.html
если все равно будет непонятно, дам ссылку на wiki или нарисую схемку. только до конца месяца вряд ли.

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

(Reply to this) (Parent)(Thread)


[info]ike_novodvorsky
2006-06-12 04:31 pm UTC (link)
Я чуть попозже расскажу о системе, буквально на днях.

(Reply to this) (Parent)(Thread)


[info]neithere
2006-06-17 11:51 am UTC (link)
окей, будем ждать =)

(Reply to this) (Parent)(Thread)


[info]ike_novodvorsky
2006-06-17 11:55 am UTC (link)
Да.. мне бы чуть времени.

(Reply to this) (Parent)


(7 comments) - (Post a new comment)

Create an Account
Forgot your login or password?
Login w/ OpenID
English • Español • Deutsch • Русский…