Вход для клиентов и партнеров
в начало сайта
Партнерская программаОнлайн демоСкачатьКарта сайта
 

Регламент
Документация
Часто задаваемые вопросы (FAQ)
Решения типовых вопросов
Форум поддержки
Библиотека разработчика

Посмотрите демо-ролики и убедитесь в том, что "Twilight CMS" очень удобна в управлении, понятна и проста.

Бесплатно скачайте "Twilight.Basic", установите на своем компьютере и изучите систему более детально.

Если вам нужно установить "Twilight CMS" на существующий сайт или разработать новый - обращайтесь в отдел интеграции.

 

Ваше имя
Ваш Email
Вопрос
Twilight.basic
  • Узнайте больше
  • Сравните версии
  • Twilight.selection
  • Узнайте больше
  • Сравните версии
  • Twilight.evolution
  • Узнайте больше
  • Сравните версии
  •  
    Главная // Библиотека разработчика // Справочники // Книга рецептов (Cookbook) // Стандартные решения типовых задач //

    Вложенные справочники (поля "один ко многим")


    Часто простого линейного справочника (одной таблицы) недостаточно, чтобы решить задачу. При возникновении отношений "один ко многим" требуется организовать вложенные, или подчиненные таблицы. Например, такая схема применяется в сервисе "Голосования", когда главная таблица это перечень вопросов, а варианты ответов на каждый из них хранятся как подчиненный справочник.

    Чтобы организовать такую схему хранения данных в entities.xml организуется связка из двух (или более, в зависимости от задачи) справочников. Выглядит это так:

    <entity id="poll" name="Голосование">
      <field id="question" type="text" name="Вопрос"/>
      <field id="answers" type="list" table="polls_answers" entity="poll_answer" name="Ответы"/>
    </entity>


    <entity id="poll_answer" name="Ответ в голосовании">
      <field id="question" type="parent" table="polls" name="Голосование"/>
      <field id="answer" type="text" name="Содержание"/>
      <field id="votes" type="string" name="Количество голосов"/>
    </entity>

    В сущности poll задано поле answers, тип которого list. Это означает, что данное поле не имеет одного значения, это поле-список значений, которые хранятся во внешней таблице. Имя таблицы и сущность для описания формата каждого из этих значений указаны в атрибутах table и entity.

    В сущности poll_answer определяется формат записей подчиненного справочника с ответами. Жирным шрифтом выделено фиктивное поле question, которого в таблице на самом деле нет. Но при переходе к редактированию какого-то ответа в редакторе для удобства навигации будет отрисовано поле question из вышестоящей записи (об этом говорит тип parent). Это сделано только для удобства работы редактора, на самом деле это фиктивное поле сущности можно и не указывать, никакой другой роли оно не выполняет.

    Как вы заметили, в подчиненной сущности, по сути, никаких упоминаний о вышестоящей таблице нет, в то время как в вышестоящей сущности есть четкое указание где и в каком формате хранить подчиненные данные. Но в таблицах все хранится совершенно наоборот: в основной таблице просто нет поля answers, в то время как в подчиненной таблице есть поле parentid, которое автоматически формируется системой и содержит поле id вышестоящей записи.

    То есть примерно так:

    в таблице с сущностью poll будут записи
    id::1::question::Почему?
    id::2::question::Как?
    id::3::question::Зачем?

    а в таблице polls_answers записи
    parentid::1::id::1::answer::Да нипочему!::votes::15
    parentid::1::id::2::answer::Да потому!::votes::18
    parentid::2::id::3::answer::Никак::votes::10
    parentid::2::id::4::answer::А вот так!::votes::10
    parentid::3::id::5::answer::Совершенно незачем::votes::0
    ...

    И так далее. Не забывайте, что поля id и parentid являются системными и их задавать вручную нигде не нужно.

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

    Теперь несложно увидеть, что вывести подчиненные записи на фронт-зоне сайта достаточно просто - нужно воспользоваться выборкой данных через макросы $News[]$, $DataField[]$ и т.п. с фильтрацией по полю parentid.

    То есть, если нам нужно вывести все возможные ответы для вопроса "Как?" с id=2 необходимо написать конструкцию следующего вида:

    $News[source: polls_answers; filter: parentid=2; design=...]$

    А если мы проходим макросом $News[]$ основной справочник, перебирая все вопросы, то вызов макроса для отрисовки списка возможных ответов для текущего вопроса из секции <item> дизайна новости (файл news_design.xml) будет примерно таким:

    $News[source: polls_answers; filter: parentid=$Attribute:id$; design=...]$

    « к списку

    версия для печати

     
    © 2003-19 Страта Технологии (создание сайтов, разработка cms), Twilight CMS in english.
    Наш адрес: Москва, пр. Маршала Жукова д.51
    Тел.: (495) 222-6436, E-mail: , карта сайта, условия использования информации о CMS
    Звоните через Skype:  

    Реклама: