Основная задача сниппета ListChild для MODX Evolution - формирование динамического списка дочерних документов в TV-параметре с типом ввода DropDown List Menu, Listbox, Check Box или Radio Options. Хотя, его возможности этим не ограничиваются. Мне уже не раз встречались подобные сниппеты, выполняющие эту же задачу, но в них не хватало гибкости и дополнительных настроек. К тому же, не будем забывать, что подобные задачи легко реализуются с помощью несложного MySQL запроса, примерно так:

@SELECT pagetitle, id FROM modx_site_content WHERE parent=10 and published=1 and deleted=0

Поэтому, написание еще одного подобного сниппета напоминает изобретение велосипеда. Но сниппет ListChild имеет ряд преимуществ:

  • работает не только в backend, но и во frontend
  • большое количество дополнительных настроек, учтены практически все возможные варианты выборки
  • возможность задавать глубину сканирования
  • может вызываться несколько раз на одной странице (для frontend)
  • может запоминать выбранные значения (для frontend)
  • подключение собственного шаблона, что позволяет выводить не только раскрывающийся список, но и переключатели (для frontend)
  • может выводить количество найденных документов или список их идентификаторов
  • вывод подменю или анонсов статей

Не работает с TV-параметрами

Параметры

Формат: ID документов, разделенных запятой
Значение по умолчанию: текущий документ
Примечание:
Пример:
&docid=`10,11,12`
Формат: число
Значение по умолчанию: 1
Примечание:
Пример:
&depth=`2`
Формат: 0 | 1
Значение по умолчанию: 1
Примечание:
Пример:
&published=`0`
Формат: 0 | 1
Значение по умолчанию: 0
Примечание:
Пример:
&deleted=`1`
Формат:
Значение по умолчанию: нет
Примечание: Соответствует where в MySQL Во фронтенде необходимо заменять все "=" на "@eq".
Пример:
&where=`isfolder @eq 1 and hidemenu @eq 0`
Формат: поле документа
Значение по умолчанию: pagetitle
Примечание: Любое поле документа, кроме TV-параметров
Пример:
&param=`longtitle`
Формат: поле документа
Значение по умолчанию: id
Примечание: Любое поле документа, кроме TV-параметров
Пример:
&value=`pagetitle`
Формат: поле документа
Значение по умолчанию: &param
Примечание: Значение по умолчанию - &param (параметр для выборки)
Пример:
&sort=`menuindex`
Формат: ASC | DESC
Значение по умолчанию: ASC
Примечание:
Пример:
&dir=`DESC`
Формат: число
Значение по умолчанию: без ограничения
Примечание:
Пример:
&limit=`10`
Формат:
Значение по умолчанию: нет
Примечание: Только для вызова во frontend. Используется для запоминания выбранных значений.
Пример:
&name=`country`
Формат: 0 | 1
Значение по умолчанию: 1
Примечание:
Пример:
&emptyfield=`0`
Формат: selected | selected="selected" | checked | checked="checked"
Значение по умолчанию: selected="selected"
Примечание: Только для вызова во frontend.
Пример:
&selectedValue=`checked`
Формат: имя чанка
Значение по умолчанию: нет
Примечание: Только для вызова во frontend.
Доступные плейсхолдеры:
[+param+] - название параметра для выборки (см. &param);
[+value+] - значение параметра для выборки (см. &value);
[+desc+] - краткое описание (см. &desc);
[+selected+] - место для вывода атрибута selected для запоминания выбранных значений (см. &selectedValue);
Шаблон, используемый по умолчанию:
<option value="[+value+]" [+selected+]>[+param+]</option>
Пример шаблона для переключателей:
<input type="radio" name="country" value="[+value+]" [+selected+]> [+param+]
Пример:
&tpl=`countryTpl`
Формат: 0 | 1
Значение по умолчанию: 0
Примечание:
0 - работа в обычном режиме. По умолчанию.
1 - вывод количества найденных документов
При использовании параметра count со значением 1, параметры tpl, name, selectedValue, value и param не используются.
Пример:
&count=`1`
Формат: строка
Значение по умолчанию: нет
Примечание:
Пример:
&separator=`, `
Формат: поле документа
Значение по умолчанию: introtext
Примечание: Любое поле документа, кроме TV-параметров.
Пример:
&desc=`description`

Примеры

Динамический список дочерних документов

Пример использования в backend (административной панели)

Сниппет сформирует список в виде: параметр1==значение1||параметр2==значение2

Создайте TV-параметр с типом ввода DropDown List Menu.

В возможных значениях укажите:

@EVAL return $modx->runSnippet('ListChild', array('docid' => 10, 'where' => 'isfolder = 1 and hidemenu = 0'));

Отобразит все опубликованные и неудаленные дочерние контейнеры папки 10, которые отмечены для показа в меню.

Или так:

@EVAL return $modx->runSnippet('ListChild', array('docid' => '10,11,12', 'depth' => 2));

Отобразит все опубликованные и неудаленные дочерние документы, в том числе и контейнеры, папок 10, 11 и 12 до второго уровня вложенности.

Выпадающий список (frontend)

Пример использования во frontend (пользовательской части)

Сниппет сформирует список в виде: <option value="значение">параметр</option>

Разместите в шаблоне следующий код:

<form action="[~[*id*]~]"><select onchange="this.form.submit();">[[ListChild? &docid=`4` &depth=`2` &where=`isfolder = 0`]]</select></form>

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

Обратите внимание, что в данном примере после выбора из списка любого пункта, форма перегружается и выбранное значение сбрасывается.

Пример использования во frontend с запоминанием выбранных значений

Тегу select добавьте атрибут name. Значение атрибута укажите в соответствующем параметре сниппета.

Важно! Не используйте для разных списков одинаковые значения атрибута name.

<form action="[~[*id*]~]"><select onchange="this.form.submit();" name="dropdown">[!ListChild? &docid=`4` &name=`dropdown`!]</select></form>

Теперь после выбора из списка любого пункта, форма перегружается но выбранное значение сохраняется.

Событие onchange="this.form.submit();" автоматически отправляет данные формы после каждого изменения элемента формы.

Переключатели radio (frontend)

Пример c использованием шаблона в frontend

1. Задача - вывести в виде переключателей, с запоминанием выбранного значения.

<form action="[~[*id*]~]">[!ListChild? &docid=`4` &name=`radio` &tpl=`tplRadio` &selectedValue=`checked="checked"` &emptyfield=`0`!]</form>

Шаблон tplRadio:

<input type="radio" name="radio" value="[+value+]" [+selected+] onchange="this.form.submit();"> [+param+]

Отобразит в виде переключателей все опубликованные и неудаленные дочерние документы папки 4, без пустого поля в начале списка. Запомнит выбранное значение.

Флажки checkbox (frontend)

Пример c использованием шаблона в frontend

Задача - вывести в виде переключателей.

[[ListChild? &docid=`4` &tpl=`tplCheckbox` &emptyfield=`0`]]

Шаблон tplCheckbox:

<input type="checkbox" value="[+value+]"> [+param+]

Отобразит в виде переключателей все опубликованные и неудаленные дочерние документы папки 4, без пустого поля в начале списка.

Количество найденных документов

Вывод количества найденных документов

[[ListChild? &docid=`4` &count=`1`]]

Отобразит количество опубликованных и неудаленных дочерних документов папки 4.

Вывод id найденных документов

Вывод идентификаторов найденных документов

[[ListChild? &docid=`4` &tpl=`idTpl` &emptyfield=`0` &separator=`,`]]

Чанк idTpl:

[+value+]

Отобразит список id всех опубликованных и неудаленных дочерних документов папки 4, разделенных запятой. 

Вывод заголовков найденных документов

По аналогии с id документа, можно вывести любую переменную шаблона (кроме TV-параметров). Например, если нужно вывести заголовки:

[[ListChild? &docid=`4` &tpl=`idTpl` &emptyfield=`0` &separator=`, ` &value=`pagetitle`]]

Отобразит заголовки всех опубликованных и неудаленных дочерних документов папки 4, разделенных запятой с пробелом.

Использование параметра where

При использовании параметра where необходимо заменять все = на @eq. Например, для того, чтобы вывести идентификаторы всех документов с шаблоном 5 и menuindex равным 0, размещаем такой вызов:

[[ListChild? &docid=`0` &depth=`10` &tpl=`tplId` &emptyfield=`0` &separator=`, ` &where=`template @eq 5 and menuindex @eq 0`]]

Чанк tplId:

[+value+]

Анонс статей или подменю

Выводим анонс статей

<ul>[[ListChild? &docid=`4` &emptyfield=`0` &tpl=`tplNews` &limit=`3` &sort=`menuindex` &dir=`DESC`]]</ul>

Чанк tplNews:

<li><a href="[~[+value+]~]">[+param+]</a><p>[+desc+]</p></li>

Отобразит анонсы трех статей с кратким описанием.

Выводим подменю

<ul>[[ListChild? &docid=`4` &emptyfield=`0` &tpl=`tplSubmenu` &limit=`3` &sort=`menuindex` &dir=`DESC`]]</ul>

Чанк tplSubmenu:

<li><a href="[~[+value+]~]">[+param+]</a></li>

Поделитесь ссылкой

Статистика

Яндекс цитирования
© 2011 - 2023 Школа MODX
Напишите нам в Telegram