Выборка данных из БД

Все уроки ранее мы рассматривали информацию как статическую. Однако чаше всего информация хранится в Базе Данных. Рассмотрим Урок 4 с той позиции, что данные лежать в БД. Как нам их получить? Вот тут и открываются основные возможности Mozart. Напомню, что Mozart пропагандирует идею, что разработкой сайтов может заниматься HTML-верстальщик, т.е. человек, знающий HTML/CSS/JavaScript. Посмотрим ниже, почему это возможно.

Пусть вся информация о новостях хранится в таблице базы данных news, в которой имеются поля title, date, announce, description. Здесь мы не будем углубляться в особенности Баз Данных, с которыми может работать Mozart.

Выбирать данные из БД можно с помощью элемента API системы Mozart, называемом newt:base. API Mozart строится на основе XML-формата:

<newt:base>
  <request>
    <get object="news"/>
  </request>
</newt:base>

Такой запрос выведет нам все данные из таблицы news. Инструкция get отвечает за выборку данных из БД. Формат полученного XML будет несколько отличаться от того, что мы упоминали в Уроке 4, но он останется таким же простым и очевидным, чтобы с легкостью преобразовать его к нужному виду с помощью XSLT. Отличие от Урока 4 в том, что там данные лежали статично в файле на диске, а здесь динамически выбираются из базы при каждом обращении пользователей сайта (безусловно, есть вспомогательные системы кэширования и оптимизации запросов, чтобы снизить нагрузку на сервер).

Конечно, в таблице скорее всего будет не одна новости, а множество. Если нам необходимо вывести одну? Представим, что мы знаем дату новости (пользователю кликнул на календарик на сайте, чтобы увидеть новость за выбранный день). Тогда нам просто надо немного дополнить наш запрос, добавив инструкцию set: выставляет какие-то значения для параметров таблицы, выбираемой уровнем ниже.

<newt:base>
 <request>
  <set object="news" attr="date" value="25.01.2010">
   <get object="news"/>
  </set>
 </request>
</newt:base>

Этот запрос выведет нам только "вторую" новость с id=456. Все основано на иерархии, т.е. инструкция set влияет только на вложенные в нее инструкции, в данном случае get.

Но в жизни все немного сложнее. Например, у новости есть автор и мы хотим вывести новости только одного автора. В таблице news базы данных добавим еще одно поле, которое будет "ссылкой" (одна из возможностей Mozart) на таблицу user. Назовем это поле author. Интерфейс администрирования (CMS) Mozart устроен таким образом, что при добавлении информации в такое поле он автоматически покажет список пользователей из таблицы user, вам останется лишь выбрать нужного и он автоматически свяжется с новостью (конечно возможно реализовать так, чтобы автор подставлялся автоматически в зависимости от авторизованного в системе пользователя, которую новость добавляет). Теперь немного поправим запрос:

<newt:base>
  <request>
    <set object="user" attr="login" value="ivanov_vasiliy">
      <get object="user">
        <get object="news"/>
      </get>
    </set>
  </request>
</newt:base>

Все, что мы сделали, это добавили блок <get object="user"/> , в который вложили инструкцию get, которая выбирает новости. Установку дату новости мы заменили на установку атрибута login пользователя в таблице user, чью новости мы хотим вывести (безусловно, условие может быть любое, можно выбирать новости текущего авторизованного пользователя, например). Как и в случае с set, описанном выше, вложенность инструкций get так же указывает, на какие условиях этот get делает запрос к БД. Mozart автоматически вычислит зависимость и выберет только те новости, автором которых является(связан) указанный нами пользователь.

<user login="ivanov_vasiliy" name="Иванов Василий Петрович">
  <news id="456" title="Вторая новость">
    <date>25.01.2010</date>
    <announce>Анонсирующий текст второй новости</announce>
    <description>Полный текст второй новости</description>
  </news>
</user>

Безусловно, API более обширный и запросы можно усложнять и детализировать, добиваясь нужного результата. Можно указывать, какие именно поля выбирать инструкцией get, как именно строить связь между выборкой двух объектов (вложенными друг в друга инструкциями get) и т.д. При помощи специального элемента API даже можно преобразовать полученный XML  в другой XML. Это бывает полезно, например, когда у вас уже есть готовая сложная система  и необходимо немного изменить структуру данных, переименовать поля в таблицах, но при этом вы не хотите менять множество XSL-шаблонов по всему сайту, которые эти данные преобразуют в конечный XML.

* This source code was highlighted with Source Code Highlighter.

 

  Документ со списком      |      Наполнение сайта данными