- Главная
- Документация
- ListChild
- 17930
- Июль 2014
Основная задача сниппета 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-параметрами
Значение по умолчанию: текущий документ
Примечание:
Пример:
&docid=`10,11,12`
Значение по умолчанию: 1
Примечание:
Пример:
&depth=`2`
Значение по умолчанию: 1
Примечание:
Пример:
&published=`0`
Значение по умолчанию: 0
Примечание:
Пример:
&deleted=`1`
Значение по умолчанию: нет
Примечание: Соответствует where в MySQL Во фронтенде необходимо заменять все "=" на "@eq".
Пример:
&where=`isfolder @eq 1 and hidemenu @eq 0`
Значение по умолчанию: pagetitle
Примечание: Любое поле документа, кроме TV-параметров
Пример:
¶m=`longtitle`
Значение по умолчанию: id
Примечание: Любое поле документа, кроме TV-параметров
Пример:
&value=`pagetitle`
Значение по умолчанию: ¶m
Примечание: Значение по умолчанию - ¶m (параметр для выборки)
Пример:
&sort=`menuindex`
Значение по умолчанию: ASC
Примечание:
Пример:
&dir=`DESC`
Значение по умолчанию: без ограничения
Примечание:
Пример:
&limit=`10`
Значение по умолчанию: нет
Примечание: Только для вызова во frontend. Используется для запоминания выбранных значений.
Пример:
&name=`country`
Значение по умолчанию: 1
Примечание:
Пример:
&emptyfield=`0`
Значение по умолчанию: selected="selected"
Примечание: Только для вызова во frontend.
Пример:
&selectedValue=`checked`
Значение по умолчанию: нет
Примечание: Только для вызова во frontend.
Доступные плейсхолдеры:
[+param+] - название параметра для выборки (см. ¶m);
[+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
Примечание:
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>