1. Есть URL. Например, "/news/society/gibdd-suxx/".
2. Есть юзер, залогиненный и привязанный к какой-то группе, например.
3. Через некоторый роутер мы его создаем такой XML:
<context>
<path>
<n type="website" id="1" host="site.com">
<n type="section" id="2" code="news" name="Новости">
<n type="section" id="3" code="society" name="Общество">
<n type="material" id="4" code="gibdd-suxx" name="ГИБДД опять облажались" allow_comments="Y" is_current="Y" />
</n>
</n>
</n>
</path>
<user id="10" name="Василий" main_group="admin" />
</context>
То есть "path" - это что-то вроде хлебных крошек, где каждому уровню соответствует тег "n" - нода.
4. Формулируя правила привязки модулей к страницам на русском разговорном, мы оперируем как раз таки структурой сайта и инфой о сессии. Например, правила могут быть сформулированы так:
- На любой странице сайта, если пользователь залогинен, показываем блок "привет вася" в верхнем правом углу
- В разделе "новости" справа на всех страницах показываем навигацию по подразделам
- Если мы в каком-то из подразделов новостей, слева показываем последние новости из этого подраздела
- Если мы на странице материала в новостях, показываем в главной колонке сам материал, а под ним - "похожие материалы"
- Для любой ноды, для которой разрешены камменты, показываем их в самом конце главной колонки.
Это я так от балды сформулировал, часто правила еще сложнее.
5. Так вот, если записать это все в текущем формате, получится:
<rules>
<!– На любой странице сайта, если пользователь залогинен, показываем блок "привет вася" в верхнем правом углу –>
<rule match="/context/user[@id]"> <!– пользователь с известным ID –>
<module name="user.greet@user_id:{@id}" area="top.right" />
</rule>
<!– В разделе "новости" –>
<rule match="/context/path/n[@code = 'news]">
<!– справа на всех страницах показываем навигацию по подразделам –>
<!–
передаем модулю параметр "current_section_id",
который берем из атрибута "id" вложенной секции, если такая есть;
в контексте примера это будет "3", раздел "общество"
–>
<module name="news.sections@current_section_id:{n/@id}" area="data.right" position="-10" />
<!– Если мы в каком-то из подразделов новостей –>
<rule match="n[@type = 'section']">
<!– слева показываем последние новости из этого подраздела –>
<module name="news.last@section_id:{@id}" area="data.left" />
</rule>
<!– Если мы на странице материала в новостях –>
<rule match=".//n[@type = 'material' and @is_current = "Y"]">
<!– показываем в главной колонке сам материал –>
<module name="news.show@material_id:{@id}" area="data.main" position="1" />
<!– а под ним - "похожие материалы" –>
<module name="news.relevant@material_id:{@id}" area="data.main" position="2" />
</rule>
</rule>
<!– Для любой ноды, для которой разрешены камменты –>
<rule match="//n[@allow_comments = 'Y']">
<!– показываем их в самом конце главной колонки. –>
<module name="comments.show@entity_id:{@id}" area="data.main" position="100" />
</rule>
</rules>
[/code]
На самом деле это хранится не как большая простыня, а хитрее. И привязка к новостям, например, делается не по коду (где написано [@code = 'news'] - код может поменяться), а просто все эти правила хранятся отдельно в разделе "Новости", если этот раздел попадает к контекст (в "хлебные крошки"), подгружаются и его правила.
Откуда берутся "area" тут тоже не очевидно, это тоже отдельная тема, но думаю общий смысл понятен.
Вот сейчас я все это хозяйство рефакторю, и есть мысль, не сменить ли формат записи. О чем и речь.