ФорумПрограммированиеPHP для идиотовРасширения PHP → Запись иерархии правил: XML vs YAML vs еще чой-то

Запись иерархии правил: XML vs YAML vs еще чой-то

  • Коля Дубр

    Сообщения: 45 Репутация: N Группа: Адекваты

    Spritz 27 июля 2010 г. 8:48, спустя 35 минут 22 секунды

    Лан, попробую :) Смори.

    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="[email protected]_id:{@id}" area="top.right" />
    </rule>

    <!– В разделе "новости" –>
    <rule match="/context/path/n[@code = 'news]">
    <!– справа на всех страницах показываем навигацию по подразделам –>
    <!–
    передаем модулю параметр "current_section_id",
    который берем из атрибута "id" вложенной секции, если такая есть;
    в контексте примера это будет "3", раздел "общество"
    –>
    <module name="[email protected]_section_id:{n/@id}" area="data.right" position="-10" />
    <!– Если мы в каком-то из подразделов новостей –>
    <rule match="n[@type = 'section']">
    <!– слева показываем последние новости из этого подраздела –>
    <module name="[email protected]_id:{@id}" area="data.left" />
    </rule>
    <!– Если мы на странице материала в новостях –>
    <rule match=".//n[@type = 'material' and @is_current = "Y"]">
    <!– показываем в главной колонке сам материал –>
    <module name="[email protected]_id:{@id}" area="data.main" position="1" />
    <!– а под ним - "похожие материалы" –>
    <module name="[email protected]_id:{@id}" area="data.main" position="2" />
    </rule>
    </rule>

    <!– Для любой ноды, для которой разрешены камменты –>
    <rule match="//n[@allow_comments = 'Y']">
    <!– показываем их в самом конце главной колонки. –>
    <module name="[email protected]_id:{@id}" area="data.main" position="100" />
    </rule>
    </rules>
    [/code]

    На самом деле это хранится не как большая простыня, а хитрее. И привязка к новостям, например, делается не по коду (где написано [@code = 'news'] - код может поменяться), а просто все эти правила хранятся отдельно в разделе "Новости", если этот раздел попадает к контекст (в "хлебные крошки"), подгружаются и его правила.

    Откуда берутся "area" тут тоже не очевидно, это тоже отдельная тема, но думаю общий смысл понятен.

    Вот сейчас я все это хозяйство рефакторю, и есть мысль, не сменить ли формат записи. О чем и речь.
  • phpdude

    Сообщения: 26646 Репутация: N Группа: в ухо

    Spritz 27 июля 2010 г. 9:22, спустя 33 минуты 51 секунду

    иногда пытаясь сделать гибче мы делаем его жидким и тонем в гибкости как в …. )))))))


    идею понял, ты формируешь въюху на основании правил, которые составляешь при каждом запросе. идея интересная :)

    но не проще ли самим модулям проверять уровни доступа (либо другие настройки)?

    а в подобном описании хранить просто "сетку" сайта? ведь по сути ты ограничиваешь сам себя набором правил (если конечно эту хмку не генерит сам модуль, если генерит - непонимаю вообще этого всего, ибо безсмысленно делать сито, через которое потом пропускать муку придется) которые можно использовать, ведь у тебя по сути входные данные(контекст хмлка) не такие гибкие как пхп :)

    я бы сделал наверное сетку на хмлке, либо yml/ini файл, юмл возможно будет даже проще читаться и писаться.

    а проверял права в самих модулях, или у тебя это аля "ленивая загрузка модулей"? когда модули грузить а когда нет?

    эти параметр если сразу не знает, то узнать их 1 строчка кода name="[email protected]_id:{@id}", зачем это пихать в хмлку :) вижу ответ только в блочном кешировании, но читать такое да, неприятно :)
    Сапожник без сапог
  • Коля Дубр

    Сообщения: 45 Репутация: N Группа: Адекваты

    Spritz 27 июля 2010 г. 9:31, спустя 9 минут 3 секунды

    протрезвею отвечу ))))
  • phpdude

    Сообщения: 26646 Репутация: N Группа: в ухо

    Spritz 27 июля 2010 г. 9:31, спустя 43 секунды

    Коля Дубр, лол)))))))
    Сапожник без сапог
  • Абырвалг

    Сообщения: 6480 Репутация: N Группа: Джедаи

    Spritz 27 июля 2010 г. 10:59, спустя 1 час 27 минут 35 секунд

    ну и гавно этот ваш Битрикс
  • phpdude

    Сообщения: 26646 Репутация: N Группа: в ухо

    Spritz 27 июля 2010 г. 11:02, спустя 3 минуты 21 секунду

    Абырвалг, ты битрикс не видел)
    Сапожник без сапог
  • Абырвалг

    Сообщения: 6480 Репутация: N Группа: Джедаи

    Spritz 27 июля 2010 г. 11:09, спустя 6 минут 56 секунд

    видел маленький кусочек, этого хватило
    Спустя 12 сек.
    ну и на говнокод.ру выкладывали
  • phpdude

    Сообщения: 26646 Репутация: N Группа: в ухо

    Spritz 27 июля 2010 г. 11:10, спустя 52 секунды

    ну и на говнокод.ру выкладывали

    да там сам говнокод можно наговнокод выкладывать, видел я их исходники …
    Сапожник без сапог
  • md5

    Сообщения: 11960 Репутация: N Группа: в ухо

    Spritz 27 июля 2010 г. 11:12, спустя 1 минуту 38 секунд

    а кто видел "неговнокод"?
    все умрут, а я изумруд
  • phpdude

    Сообщения: 26646 Репутация: N Группа: в ухо

    Spritz 27 июля 2010 г. 11:14, спустя 1 минуту 52 секунды

    md5, фабиен :-)
    Спустя 28 сек.
    в вердане и тахоме пиздато этот смайлик смотрится изза жесткости стиля)
    Сапожник без сапог
  • Абырвалг

    Сообщения: 6480 Репутация: N Группа: Джедаи

    Spritz 27 июля 2010 г. 11:17, спустя 3 минуты 5 секунд

    гитхаб/симфони/симфони
    Спустя 15 сек.
    но Дуд опередил
  • phpdude

    Сообщения: 26646 Репутация: N Группа: в ухо

    Spritz 27 июля 2010 г. 11:20, спустя 3 минуты 29 секунд

    ух пошел тоже подрочу на фаба раз он так ахуенен)
    Спустя 44 сек.
    видел седня симфоню 1.4, нихуя интересного не увидел в ней, но я поверхностно смотрел. ничего нового в общем

    ага, я суа насрал в кормушку и хочу холивара :D
    Сапожник без сапог
  • Абырвалг

    Сообщения: 6480 Репутация: N Группа: Джедаи

    Spritz 27 июля 2010 г. 11:25, спустя 4 минуты 31 секунду

    дык ты смотри вторую а не 1.4
    Спустя 82 сек.
    вот это тоже самое, что и с Киберспортом. Сначала на него все пиздели-пиздели за ZF, включая NRG, и в итоге потом последний пошел в Вариен.
    Спустя 42 сек.
    ладно, я стебусь
  • phpdude

    Сообщения: 26646 Репутация: N Группа: в ухо

    Spritz 27 июля 2010 г. 11:31, спустя 6 минут 1 секунду

    Абырвалг, да однохуйно :)

    похуй ваще, все это гавно.
    Сапожник без сапог
  • Абырвалг

    Сообщения: 6480 Репутация: N Группа: Джедаи

    Spritz 27 июля 2010 г. 11:37, спустя 6 минут 48 секунд

    да, я устал от этого всего кода, в отпуск бы

Пожалуйста, авторизуйтесь, чтобы написать комментарий!