Главная  |  О продукте  |  Пользователям  |  Community

Поиск

 

Оператор foreach

Оператор foreach предназначен для получения множества документов из базы, удовлетворяющих заданным пользователем условиям. Оператор является оператором цикла, причем при каждой итерации обращение внутри оператора происходит к текущему элементу выборки. С его помощью, например, можно построить карту сайта или вывести список последних новостей. Для вывода списка последних новостей необходимо перебрать все новости, опубликованные за какой-либо промежуток времени или просто какое-то количество последних новостей. При этом для каждой новости нужно вывести дату ее публикации, заголовок и текст анонса (см. пример в конце настоящего раздела).

Этот оператор удобно использовать, когда необходимо работать с множеством документов.

Синтаксис:

<foreach name=identifier path=expr [where=expr] [sort=expr]

         [limit=expr] [type=documents|folders|content]>

   djemscript

</foreach>

или

<foreach name=identifier data=expr [limit=expr]>

   djemscript

</foreach>

Для доступа к полям документа используется конструкция типа:

<foreach[identifier].полe>

К любому полю или результату foreach выборки можно применить какой-либо метод (см. п. Методы):

<foreach[identifier].field.method>

Помимо простого доступа к полям документа существует возможность изменять данные в обрабатываемом документе. Для этого используется следующая конструкция:

<foreach[identifier].field=expr>

Данный оператор изменяет значение поля field обрабатываемого документа на значение expr, где expr – корректное выражение DJEM-скрипта.

 

Параметр name

Параметр name – задает идентификатор, который будет использоваться для обращения к результатам работы оператора foreach. Обязательный параметр.

 

Параметр type

Параметр type – тип возвращаемых документов. Если параметр не указан, то объектами выборки становятся разделы и документы. Можно указать желаемый тип возвращаемого документа ключевыми словами:

documents

folders

content

Тип content используется для последовательного перебора полей документа, определенных в контент-шаблоне. Тип content может быть использован для автоматического построения web-формы на сайте, исходя из структуры документа. При использовании оператора foreach с типом content можно обращаться к следующим служебным полям:

_type – числовой код, описывающий тип поля.(1 – текстовое поле, 2 – поле со списком множественного выбора, 3 – поле с выпадающим списком, 4 –переключатель («галочка»), 5 – поле с файлом);

_code – имя поля;

_description – описание поля;

_count – порядковый номер поля;

_total – общее количество полей в документе.

 

Пример:

<foreach name=x path="main.news.$" type=folders> вернет все подразделы, которые находятся в разделе main.news. Например, можно использовать, если в main.news находятся не только подразделы, но и документы. В данном случае документы нас не интересуют.

Если нас интересуют только документы (новости), то можно выбрать документы из раздела news и всех подразделов, пропуская сами разделы:

<foreach name=x path="main.news.*" type=documents>

 
Параметр path

Параметр path определяет путь в иерархии документов DJEM. Путь строится из кодовых имен разделов (поле _code – см. п. Поля документа) разделенных точкой. В пути справа налево перечисляются кодовые имена родительских разделов. Код главного раздела (раздела верхнего уровня) всегда main.

Например, в системе есть раздел «Новости» (с кодом news), в нем есть раздел «Финансы» (finances), где, в свою очередь, находится раздел «2005 год» (year2005), содержащий новости. Путь для раздела «2005 год» будет следующим: «main.news.finances.year2005».

Вместо пути можно использовать число –  идентификатор раздела или документа.

В большинстве случаев, path – обязательный параметр (кроме случаев использования data).

Для обозначения множества документов существует два шаблона подстановки:

Шаблон «*» – обозначает все документы вниз по иерархии. Например, <foreach path="main.news.*"> выберет подразделы и документы из раздела «Новости», включая документы, находящиеся в разделах «Финансы» и «2005 год»;

Шаблон «$» – обозначает все непосредственные «дети» раздела. Например, <foreach path=" main.news.$"> выберет все подразделы и документы, содержащиеся в разделе «Новости», но не будет выбирать документы, находящиеся в разделе «Финансы».

Пример:

Вывод всех новостей из раздела «2005 год».

<foreach name="last_news" path="main.news.finances.year2005.$">

            <foreach[last_news].date>: <foreach[last_news].title>

            <p><foreach[last_news].anons></p>

</foreach>

 

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

Пример:

Вывод материалов из разделов статьи, новости и заметки с единой сортировкой по имени.

<foreach name="alphabet" path="main.news.$, main.articles.$, main.notes.$" sort="_name">

            <foreach[alphabet]._name><br />

</foreach>

Параметр where

Параметр where – это логическое выражение, задающее условие отбора документов. Необязательный параметр.

В качестве условия в where можно использовать:

  • Логические операции (см. Выражения);
  • Операторы для работы с множествами. Строковое значение, содержащие данные через запятую считается множеством. Например, строка "a,b,c,d” означает множество состоящее из элементов a,b,c,d. Для работы с множествами существуют специальные операторы:

in – означает, что значение поля входит в множество. Пример, выражение: card in “Visa,MasterCard,Maestro” – примет значение «истина», если в поле card содержится строка «Visa», «MasterCard» или «Maestro», и «ложь» во всех остальных случаях.

has – означает, что поле выборки представляет собой множество, в котором должно присутствовать значение. Например, выражение – list has «Red» – примет значение «истина», если в значение поля list присутствует слово «Red», выделенное запятыми («White,Red,Green,Blue»).

x - означает, что существует значение в множестве значений поля, которое входит в множество. Пример, выражение: card x “Visa,MasterCard,Maestro” – примет значение «истина», если в поле card содержится строка «Card,Visa,GoldCard», «MasterCard» и «ложь» если в поле нет строк "Visa", "MasterCard" или "Maestro".

Пример:

Вывод материалов, имеющих как минимум одно совпадающее ключевое слово.

<if <#keywords#>>
<foreach name=x path="main.rus.journals.*" where="keywords x '<#keywords#>'" type=documents>
     <foreach[x]._name>
</foreach>
</if>

 

Выражения (см. гл. Выражения);

оператор like – выбор полей содержащих подстроку значение.

Допускается использование исключающих конструкций: not in, not like.

Можно использовать множественные критерии, комбинируя их с помощью логических операторов || (или) и && (и).

Примечание:

– Если в where требуется написать символ «\», то символ дублируется «\\».

– Если в строку, заключенную в кавычки, необходимо включить символ кавычка (") – перед этим символом необходимо поставить знак (\). Например, " Компания \" DJEM Solutions \" представляет:"

Пример:

1. Выбрать все документы, помеченные, как «видимые», т.е. содержащие в поле visible значение 1. Например, этот прием можно использовать для отображения только отмеченных новостей на сайте:

where="visible=1"

2. Множественные критерии. Требуется выбрать документы, в которых source равен "djem" и время публикации больше времени установленного в поле с именем «fromtime» в документе с идентификатором 22:

where="source='djem' and _publish_time gt <[22].fromtime>"

Примечание:

–    gt – логический оператор «больше чем».

3. Пример работы с множествами. Выбор документов, имеющих заданный тип, т.е. поле type содержит “cat”, “dog” или “fish”:

where="type in 'cat,dog,fish'"

4. Поле theme может содержать: news,sport,business. Требуется выбрать все новости спорта (т.е. у которых в поле theme есть news и sport):

where="theme has 'news' && theme has 'sport'"

5. Выбрать все документы, в которых встречается подстрока port:

where="theme like 'port'" будет верным, если поле theme содержит "sport" или “port Arthur”.


Параметр sort

Параметр sort указывает, как сортировать документы в выборке (сортировка по значению). Необязательный параметр. Представляет собой список имен полей документов разделенных запятой, по которым ведется сортировка. Для сортировки в обратном порядке используется перед именем поля знак «–» (минус).

Обычно сортировка ведется по строковому значению поля. При сортировке по строковому значению, значение «10» окажется меньшим, чем «9», так как символ «1» меньше, чем символ «9». Для сортировки по числовому значению перед именем поля поставьте знак «#».

Пример:

Отсортировать все новости типу (по полю type), а среди документов одного типа (где поле type совпадает)  по убыванию даты (date):

sort="type,-date"

Отсортировать новости по убыванию числового значения поля-счётчика count

sort="-#count"

 

Параметр limit

Параметр limit – ограничивает количество выбираемых документов. Необязательный параметр, используется:

с одним параметром – ограничивается общее количество документов с начала выборки – "не более чем, заданное количество документов";

с двумя параметрами – первый параметр определяет, с какого документа начинать выводить (нумерация от нуля), второй – сколько документов выводить.

Удобно использовать для организации постраничного вывода информации.

Пример:

Использование limit с одним параметром: limit="5" означает, что выборка захватит первые пять документов.

Использование limit с двумя параметрами:

limit="5,2" означает выборку двух документов, начиная с пятого:

Если на выборку "2 3 5 18 29 23 33 31" наложить limit="5,2", то в результате будет возвращено 23 33.

Выбрать 10 последних опубликованных документов из раздела news:

<foreach name=x path="main.news.*" sort="-_publish_time" limit=10>

 

Параметр data

Параметр data используется для выборки по разделенным запятыми спискам значений. Обычно foreach с этим параметром используется для обработки значений полей-списков. Использование параметра data исключает использование параметра path.

Пример:

<foreach name=x data="1,3,5">

  <foreach[x]._value>

</foreach>

Результат:

 

1

3

5

 

Дополнительные поля

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

<foreach[identifier].полe>

Дополнительные поля:

_count счетчик выборки. Каждый новый документ увеличивает счетчик на 1. Начальное значение счетчика равно 1.

_total общее количество документов в выборке.

Поле _total доступно и ПОСЛЕ завершения цикла.

Пример:

Для каждого выбранного документа выводится его номер в выборке и общее количество выбранных документов. В конце выводится общество количество:

<foreach name=x path="main.news.*" limit="3">

  <foreach[x]._count> - <foreach[x]._total>

</foreach>

Всего документов: <foreach[x]._total>

Результат:

1 – 3

2 – 3

3 – 3

Всего документов: 3

 

Значения этих полей можно использовать в различных случаях, например:

Для вывода нумерованных списков;

Для подсчета среднего значения (используется total);

Для различной обработки первого и последнего элемента – _count первого элемента равняется единице, а для последнего – _count равняется _total. Таким образом, можно открыть html-таблицу при выводе первого элемента и закрыть ее при выводе последнего.