Как показывает практика разработки веб-проектов на платформе XS2, при выборке данных для показа на странице разработчику чаще всего приходится иметь дело не с одним конкретным узлом, а с множеством. Попробуем усложнить и одновременно приблизить к реальности задачу, приведенную в предыдущей главе. На этот раз выведем на главной странице сайта не одну конкретную новость, а пять последних новостей. При этом каждую новость мы представим только датой и заголовоком. HTML-код страницы будет выглядеть примерно так:
Для того, чтобы приступить в выполнению поставленной задачи, сначала создадим необходимое количество узлов типа "Новость". Нам нужно будет убедиться, что наш код выбирает именно пять последних по дате новостей, поэтому для чистоты эксперимента добавим еще 5-6 новостей с разными значениями поля "Дата публикации". Добавив узлы, перейдем к коду шаблона:
В строке №6, в отличии от Листинга 2, мы выбираем теперь уже не конкретный узел, а все узлы типа "news_post", имеющиеся в модуле "news". Сделаем небольшое теоретическое отступление.
Что такое xs2GetNode и xs2GetNodes, встретившиеся в Листингах 2 и 4? Это функции из XS2 API. XS2 API (Application Programming Interface) – это список функций (команд), с помощью которых можно манипулировать узлами XS2 в коде методов. С помощью них можно производить с узлами все те же действия, которые с ними может производить оператор через интерфейс XS2. А именно: выбирать (искать), добавлять, изменять, удалять, копировать, перемещать узлы. Набор функций в XS2 API очень компактен, он включает всего 18 основных функций и 12 вспомогательных. Основные 18 функций деляться на 3 группы:
Функцие, возвращающие один узел
Функции, возвращающие множество узлов
Функции, изменяющие узлы
Функция xs2GetNode относится к первой группе, xs2GetNodes ко второй.
Каждая функция имеет набор параметров, с помощью которых разработчик уточняет выполняемое действие (выборку или изменение). Давайте подробнее рассмотрим вызов функции xs2GetNodes в Листинге 4. В данном случае в функции указаны следующие параметры:
mod – модуль, узлы которого необходимо искать. В нашем случае это модуль "Новости" ("news").
NType – указание типа узлов, которые следует выбирать. В нашем случае нам нужны узлы типа "news_post". Если не указать данный параметр, функция будет производить поиск среди узлов всех типов, описанных в данном модуле.
limit – количество узлов, которым следует ограничить результаты выборки. Важно понимать, что это максимальное число узлов в выборке. Таким образом, функция возратит меньшее количество узлов, если условию выборки удовлетворило число узлов, меньшее limit. В нашем случае функция вернет не более 5 узлов.
sort - сортировка результатов выборки. Данный параметр указывает, по какому полю или полям и в каком порядке (по возрастанию или по убыванию) следуют отсортировать узлы. Здесь можно указать несколько полей для сортировки. Например, если указать в параметре "sort" значение "Date desc, NName asc", то все узлы отсортируются по убыванию даты публикации, а те узлы, у которых даты публикации совпадают, разместятся в выборке в порядке возрастания заголовка.
var – название переменной, в которую необходимо поместить результаты выборки. Этот параметр доступен только при вызове функции XS2 API внутри шаблона Smarty, поскольку является специфическим для данного шаблонизирующего языка. Забегая вперед, скажем, что при вызове функция XS2 API в PHP данный параметр не используется, поскольку в PHP команды XS2 являются обычными функциями, возвращающими результаты в переменную присвоения: $a = xs2GetNodes(…).
Это неполный список параметров функции xs2GetNodes. Полный список всех параметров для всех функций XS2 API можно посмотреть в справочнике XS2 API.
Из перечисленных здесь параметров только "mod" является обязательным. Все остальные параметры могут быть опущены. Нетрудно догадаться, что если вызвать функцию xs2GetNodes только с параметром mod="news", то она выберет все узлы из модуля "news" и вернет их в неотсортированном виде.
xs2GetNode возвращает один узел. К его полям можно обращаться в шаблоне Smarty через точку по системному названию поля: $a.NName. Функция же xs2GetNodes возвращает, как мы уже говорили, набор узлов. Поэтому результат ее работы – это массив, каждый элемент которого это узел. Таким образом, чтобы вывести заголовок, например, третьего узла из массива $my_news_posts, необходимо явно указать индекс узла в массиве: $my_news_posts[2].NName. Нумерация элементов в массиве, естественно, начинается с 0. Однако разработчику редко приходится напрямую обращатся к определеннуму элементу из массива выбранных узлов. Гораздо чаще необходимо вывести подряд все выбранные узлы. Именно для этого мы используем в нашем примере конструкцию языка Smarty "foreach". Эта конструкция организует цикл по массиву, указанному в ее параметре "from", и помещает очередной элемент в переменную с названием, указанным в параметре "item". Таким образом, внутри этой конструкции мы можем обращаться к очередному узлу без индекса, через именованную переменную. Снова забежим вперед: в PHP набор узлов также возвращается как обычный массив со всеми вытекающими из этого приятными последствиями.
В строке №9 Листинга 4 вы, наверняка, обратили внимание на конструкцию {$my_news_post.Date|date_format:"%d.%m.%Y"}. "date_format" – это так называемый модификатор Smarty. Назначение модификатора – изменять внешний вид выводимого значения. В данном случае мы выводим дату новости не в формате "гггг-мм-дд чч:мм:сс", принятом по умолчанию, а в формате, традиционном для России – "дд.мм.гггг". Модификаторы – это очень мощный и удобный инструмент, подробнее о них можно прочитать в руководстве Smarty.
Итак, мы разабрали код Листинга 4. Теперь можно посмотреть, что он выводит. Если вы все сделали правильно, на главной странице вашего сайта должны появится пять новостей из модуля "Новости", отсортированных по дате публикации.