Solution Technologies
Управление сайтом без ограничений

Руководство разработчика XS2

Скачать pdf-версию.

Часть 2. Решения на платформе XS2

Глава 15. Тип поля lnk: связывание и поиск.

В Главе 7 мы уже рассказывали о том, как с помощью типа поля "lnk" организовать ссылки между различными узлами в XS2. Однако, поскольку тип "lnk" является одним из основных способов организации сложных структур данных, мы решили еще раз вернуться к этой теме во второй части и рассмотреть ее немного подробнее на новых примерах.

Итак, вам уже известно, что в поле типа "lnk" контент-менеджер может указать узел или даже несколько узлов строго определенного типа. Список типов, узлы которых допустимо указывать в конкретном поле, настраивает разработчик по своему усмотрению. Так, например, для того, чтобы связать узел "Книга" с узлом "Писатель", достаточно в типе "Книга" добавить поле типа "lnk" с произвольным названием и указать, что в этом поле могут быть выбраны узлы только типа "Писатель". В Главе 7 мы уже решали подобную задачу: мы связывали узлы-новости с авторами новостей и выводили имена авторов в ленте. Теперь же решим более сложную задачу. Попробуем сделать страницу, на которой для определенного автора выводится список всех новостей, в которых он указан в поле "Автор". Фактически, нам необходимо произвести обратный поиск по ссылке. Если поиск от новости к автору происходит совершенно незаметно для разработчика (при выборке для каждой новости в поле "Автор" система сразу же возвращает список связанных с ней узлов-авторов), то поиск от автора к новости необходимо производить намеренно, вызывая специальную функцию XS2 API в первой версии или указывая условия поиска в параметре "condition" во второй версии.

В Листинге 41 представлена шаблон, содержащий выборку новостей по автору с помощью функции xs2GetLinks.

Листинг 41
1.  {xs2GetNode mod="news" NodId=$_THE.PARAMS[0] var="author"}
2.  
3.  <h1>Новости автора {$author.NName}</h1>
4.  
5.  {xs2GetLinks mod="news" NType="news" NodId=$author.NodId ¶
                 lnkField="Author" var="news"}
6.  
7.  {foreach from=$news item="news_item"}
8.  ...
9.  {/foreach}

В строке №5 производится выборка новостей по автору. Рассмотрим параметры функции xs2GetLinks, которая используется в этой строке:

  • mod - модуль, содержащий узел, ссылки на который мы ищем. В нашем случае мы ищем ссылки на узел типа "Автор", находящийся в модуле "news".
  • NType - тип узлов, которые мы ищем. В нашем случае мы ищем узлы типа "news". В этом параметре можно указать сразу несколько типов через запятую. Не будем забывать, что ссылки на один и тот же узел могут идти не только от разных узлов, но и от разных типов узлов, иногда находящихся даже в разных модулях.
  • NodId - идентификатор узла, ссылки на который мы ищем. В нашем случае это идентификатор автора.
  • lnkField - название поля, в котором находится ссылка. В нашем случае ссылка должна стоять в поле "Author".
  • var - название переменной Smarty, в которую следует вернуть результат.

Функция xs2GetLinks несколько громоздка и в ее параметрах легко запутаться. Многие разработчики, имевшие дело с первой версией XS2, часто недоумевали, почему поиск по ссылкам нельзя производить через параметр "condition" точно так же, как поиск по полям всех остальных типов. И, действительно, куда проще было бы найти все новости, связанные с данным автором, просто задав следующее условие в вызове xs2GetNodes: condition="Author.NodId=`$author.NodId`". К сожалению, технические ограничения не позволяли сделать этого в первой версии XS2, но во второй версии была полностью реализована поддержка этой возможности. За счет этого необходимость в функции xs2GetLinks полностью отпала и она получила статус "нерекомендуемой для использования". В Листинге 42 приведен модифицированный код Листинга 41 без использования функции xs2GetLinks. Обратите внимание, что это работает только во второй версии XS2.

Листинг 42
1.  {xs2GetNode mod="news" NodId=$_THE.PARAMS[0] var="author"}
2.  
3.  <h1>Новости автора {$author.NName}</h1>
4.  
5.  {xs2GetNodes mod="news" NType="news" ¶
                 condition="Author.NodId=`$author.NodId`" ¶
                 var="news"}
6.  
7.  {foreach from=$news item="news_item"}
8.  ...
9.  {/foreach}

Поддержка условий на ссылочные поля в XS2 позволяет делать даже вложенные запросы. Этой возможности функция xs2GetLinks не предоставляла. В Листинге 43 мы ищем все новости, авторы которых живут в Москве.

Листинг 43 ::
1.  {xs2GetNodes mod="news" NType="news" ¶
                 condition="Author.City.NName='Москва'"}

Кроме того условия на ссылочные поля сочетаются с обычными условиям и могут использовать стандартные SQL-операторы. В Листинге 44 мы ищем все новости, авторы которых живут в Москве или Петербурге, и у которых дата публикации находится между 5 и 8 июля 2008 года.

Листинг 44
1.  {xs2GetNodes mod="news" NType="news"
2.         condition="(Author.City.NName IN ¶
                 ('Москва','Петербург')) AND
3.          (Date>='2008-07-05' AND Date<='2008-07-08')"}

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

В XS2 узлы совершенно разных типов могут содержать ссылки на один и тот же узел. Рассмотрим задачу, когда необходимо производить поиск ссылок с учетом их типа.

Представим, что на нашем сайте имеется модуль "Баннеры", в котором среди прочих типов узлов имеются типы "Рекламное место", "Графический баннер", "Flash-баннер", "Текстовый баннер". Таким образом в баннерной системы сайта возможно три вида баннеров, каждый из которых имеет поле "Рекламное место" ("Position"), в котором указана позиция на сайте, где этот баннер может показываться. К одному рекламному месту может быть привязано несколько баннеров, которые выбираются случайным образом. По условиям технического задания наш сайт имеет два варианта интерфейса: полноценный и упрощенный с отключенной графикой. Если пользователь выбрал первый вариант интерфейса, то на рекламных местах ему будут показываться только графические и флэш-баннеры, если же он выбрал второй вариант - то только текстовые баннеры. В Листинге 45 представлен код включенного метода, отвечающего за показ одного рекламного места. В параметре $_THE.FETCH.PARAMS[0] передается флаг режима: 1 - графический интерфейс, 0 - облегченный интерфейс. В параметре $_THE.FETCH.PARAMS[1] передается идентификатор рекламного места.

Листинг 45
1.  {if $_THE.FETCH.PARAMS[0]=='1'}
2.      {assign var="ntype" value="img_banner,flash_banner"}
3.  {else}
4.      {assign var="ntype" value="txt_banner"}
5.  {/if}
6.  
7.  {xs2GetNode mod="banners" NodId=$_THE.FETCH.PARAMS[1] ¶
                 var="pos"}
8.  
9.  {xs2GetNodes mod="banners" NType=$ntype ¶
                 condition="Position.NodId=`$pos.NodId`"}

Нередко при работе со ссылками у разработчика возникает необходимость доступа к узлам, которые находятся так сказать "через ссылку" от текущего узла. Вернемся к нашему примеру с новостями и авторами. Допустим, что в ленте новостей, нам необходимо выводить не только имя автора новости и название города, в котором он живет. При этом в типе "Автор" имеется ссылочное поле "City", в котором контент-менеджер может указать объект типа "Город". Как мы уже убедились в Главе 7, мы легко можем получить доступ к названию узлов, находящихся внутри ссылочного поля - эти узлы выбираются сразу же вместе с основной выборкой. Однако в данном случае нам нужно получить досту к названию города, который привязан к автору, который в свою очередь привязан к новости из выборки. Механизм разворачивания ссылочных полей XS2 работает лишь на один шаг в глубину, иначе любой запрос приводил бы к неконтролированной нагрузке на сервер. Как же развернуть ссылки глубже одного шага? Ответ очевиден - с помощью дополнительного вызова xs2GetNode.  В Листинге 46 показано, как дозапросить информацию о городе автора и вывести ее в ленте новостей.

Листинг 46
1.  ...
2.  {foreach from=$news_posts item="post"}
3.    <h2>{$post.NName}</h2>
4.    {xs2GetNode mod="news" ¶
                 NodId=$post.Author[0].City['NodId'] ¶
                 var="city"}
5.    {$my_news_post.Author[0].NName}, {$city.NName}
6.    <div>{$post.Date|date_format:"%d.%m.%Y"}</div>
7.  {/foreach}
8.  ...

Механизм ссылок в XS2 является мощным инструментом создания сложных структур данных. Однако его использование должно быть разумным. Не следует забывать, что поля типа "lnk" по сравнению с полями других типов, создают более ощутимую нагрузку на сервер при выборке. Это ни в коем случае не значит, что полей данного типа следует избегать - часто как раз их неиспользование в конечном итоге ведет к увеличению нагрузки - тем не менее, в некоторых случаях вместо типа "lnk" можно весьма эффективно использовать тип "enum" (жестко заданное перечисление текстовых значений).

Введение

Основные характеристики системы XS2
Требование к хостинг-площадке, на которой устанавливается XS2.
Инструкции по установке XS2 на хостинг-площадке.

Часть 1. XS2 шаг за шагом

Модель данных в XS2: модуль, тип, узел, метод.
Как организовать простейшую структуру данных в XS2 и вывести узлы на главной странице сайта.
Множественный выборки узлов и их вывод на странице в цикле.
Создание второстепенной страницы и организация ссылок на нее.
Структура метода в XS2. Что такое процессор и как он взаимодействует в шаблоном внутри одного метода.
Дерево как универсальный способ организации узлов в XS2. Как настраивать вложенность узлов друг в друга.
Ссылки между узлами как основное средство построения альтернативных структур узлов.
Использование функция XS2 API для выполнения редакторских операций в коде методов.
Функция xs2Fetch и ее возможности при организации повторного использования методов.
Подробнее о взаимодействии процессора и шаблона в одном методе: передача данных между процессором и шаблоном.

Часть 2. Решения на платформе XS2

О чем пойдет речь во второй части, для кого она предназначена.
Как производить дополнительные манипуляции с узломпри его вставка, редактировании, удалении, копировании или перемещении.
Постраничный вывод как способ показа больших массивов данных в одном шаблоне.
Как с помощью XS2 быстро сделать сайт с поддержкой множества языковых версий.
Быстрое развертывание удобных пользовательских интерфейсов с технологией AJAX на платформе XS2.
Подробнее о том, как организовать сложные структуры данных в XS2 и производить в них поиск.
В следующих главах, которые будут публиковаться здесь по мере их написания, мы планируем рассказать о:
Copyright ©1998-2008 Солютекс. Все права защищены.
Этот сайт сделан в designLab | Работает на технологии XS2
Условия использования | О защите конфиденциальности