Разработчикам
Контроллеры
Имя класса расположенного в файле php файле должно заканчиваться на DocLister, а сам класс должен быть унаследован от абстрактного класса DocLister.
В параметре dir можно указать пусть от корня сайта к папке с контроллером.
Экстендеры
Экстендеры могут загружаться из контроллера или с помощью параметра extenders, в котором перечислены имена файлов *.extender.inc из папки /core/extender/
Загружаемый экстендер должен быть классом имя которого должно начинаться с имени экстендера и заканчиваться на _DL_Extender. Помимо этого, загружаемый экстендер должен быть унаследован от абстрактного класса extDocLister.
Фильтры
Правила фильтрации можно найти в файле *.filter.php по имени фильтра из папки /core/filter/. Класс в файле должен быть унаследован от абстрактного гласса filterDocLister, а само имя должно заканчиваться на _DL_filter.
Приведение типов TV-параметров
Пример в контроллере site_content:
Сохранение объекта DocLister
Это может быть удобно, когда один и тот же список необходимо шаблонизировать 2 раза.
Или, например, нужно получить массив ID документов, которые задействованы в выводе
Использование шаблонизатора DocLister в своих сниппетах
Подключив класс DLTemplate вы уже можете пользоваться шаблонизатором, который:
Обычная шаблонизация
Подмена шаблона у документа
Для упрощения восприятия, весь процесс настройки ТВ параметров будет упущен. Поэтому представим, что у нас имеется:
Создаем плагин для событий OnLoadWebDocument и OnLoadWebPageCache
Использовать подмену шаблонов может быть удобно, если вы редактируете сайт на горячую (без разворачивания девелоперских версий).
DocLister: Параметры выборки
DocLister: Параметры выборки
&controller
Задает класс для выборки данных. Базовые классы (расположены в папке DocLister/core/controller/):
&idType
Тип выборки документов.
Список документов подставляемых в запрос будет выбран из параметра, имя которого совпадает со значением данного параметра.
Во избежание недоразумений рекомендуется всегда явно определять этот параметр. Особенно актуально, когда одновременно используются параметры parents и documents.
&parents
Выборка документов на основании списка родительских документов.
&documents
Выборка произвольных документов.
Если используется параметр parents__, то документы перечисленные в этом параметре будут просто подмешаны в результат и подвержены последующим правилам выборки (фильтрация, сортировка).
&ignoreEmpty
Позволяет сделать выборку всех записей из таблицы, если параметр documents не задан. Параметр idType в этом случае должен быть documents.
&display
Максимальное число документов при выборке.
Может быть переопределено значением параметра queryLimit.
&queryLimit
Максимальное число документов при выборке.
&depth
Глубина выборки с использованием параметра parents.
&offset
Число пропускаемых документов с начала списка. Переопределяется при использовании пагинации. Если же требуется всегда пропускать N документов, то необходимо использовать параметр start.
&start
Число документов пропускаемых с начала выборки. Складывается со значением offset автоматически устанавливаемым при пагинации.
&total
Максимальное число документов отображаемое на 1 странице в выборке.
&addWhereList
Дополнительные условия выборки документов. Любая строка удовлетворяющая требованиями строки для подстановки в WHERE блок SQL запроса.
&showParent
Исключение документов из которых делалась выборка с использованием параметра parents.
&selectFields
Имена полей, включаемых в выборку.
&groupBy
Группировка результатов по какому-нибудь полю.
Параметры выборки для произвольных таблиц (контроллер onetable)
&table
Имя таблицы по которой будет производиться выборка. Если в таблице PrimaryKey отличается от id, то необходимо дополнительно задать имя этого поля в параметре idField.
&idField
Имя поля PrimaryKey. Документы, указанные через параметр documents, будут выбираться по этому полю.
&parentField
Имя поля в котором хранятся значения idField родительских документов. Используется при выборке документов из параметра parents.
Выборка с TV-параметрами
&tvPrefix
Префикс для плейсхолдеров создаваемых из имен TV-параметров.
&tvList
Список TV-параметров, которые должны быть в выборке.
&renderTV
TV-параметры, значение которых необходимо подготовить к отображению в соответствии с установленными виджетами. TV параметры которых нет в значении параметра tvList будут проигнорированы.
Сортировка
&sortType
Значение none определяет автоматическую сортировку правилами MySQL (как правило по primary key).
&orderBy
Единая строка сортировки (как минимум совокупность параметров sortBy и sortDir, но имеет больший приоритет).
Для сортировки в случайном порядке значение параметра orderBy будет «RAND()».
&sortBy
Критерий сортировки без направления сортировки.
&order
&sortDir
Синоним параметра order, но имеет больший приоритет. Если установлены 2 параметра order и sortDir, то будет использоваться значение параметра sortDir.
Сортировка по TV-параметрам
&tvSortType
Правила приведения типов TV-параметров при сортировке.
Возможные значения (перечисляются через запятую в том порядке, в котором указаны имена TV в параметре orderBy):
&tvSortWithDefault
Фильтрация
&showNoPublish
Вывод удаленных или не опубликованных ресурсов (используется только в контроллерах на базе site_content)
&filters
Правила для фильтрации документов.
&filter_delimiter
Разделитель фильтров для режима containsOne.
Выборка по тэгам
&tagsData
Строка определяющая источник тэгов.
Дополнительные данные
&urlScheme
Схема генерации URL
&dateSource
Поле документа в котором располагается дата.
&dateFormat
Правила форматирования даты (format) для PHP функции strftime.
В качестве источника даты используется параметр dateSource. Помимо этого учитывается смещение даты на сервере (смотрите системный параметр server_offset_time). Таким образом, можно использовать персонализованную подстановку времени в зависимости от часового пояса пользователя.
&summary
Правила обработки текстов для формирования краткого описания. Загружает экстендер summary. В контроллере site_content есть дополнительное правило для обрабатываемого текста: по умолчанию на обработку отправляется поле content. Но если поле introtext не пустое, то текст именно из этого поля будет передан в дополнение summary. Аналогичным образом себе ведет и контроллер onetable.
&introField
Имя поля для источника краткого описания текста из contentField. Используется только если загружен экстендер summary.
&contentField
Имя поля в котором хранится основной текст документа. Используется только если загружен экстендер summary
Экранирование значений полей. Имена полей доступны в шаблонах через плейсхолдеры с префиксом e: [+e.pagetitle+], [+e.longtitle+].
&jotcount
Добавляет в выборку количество комментариев JotX с помощью экстендера jotcount.
Параметры выборки
Основные параметры
controller
Задает класс для выборки данных. Базовые классы (расположены в папке DocLister/core/controller/ ):
idType
Список документов подставляемых в запрос будет выбран из параметра, имя которого совпадает со значением данного параметра.
parents
Выборка документов на основании списка родительских документов.
documents
Выборка произвольных документов.
ignoreEmpty
display
Максимальное число документов при выборке.
queryLimit
Максимальное число документов при выборке.
depth
Глубина выборки с использованием параметра parents.
offset
start
Число документов пропускаемых с начала выборки. Складывается со значением offset автоматически устанавливаемым при пагинации.
total
Максимальное число документов отображаемое на одной странице в выборке.
addWhereList
Дополнительные условия выборки документов. Любая строка удовлетворяющая требованиями строки для подстановки в WHERE блок SQL запроса.
showParent
selectFields
Имена полей, включаемых в выборку.
groupBy
Группировка результатов по какому-нибудь полю.
Параметры выборки для произвольных таблиц (контроллер onetable )
table
idField
parentField
Выборка с TV-параметрами
tvPrefix
Префикс для плейсхолдеров создаваемых из имен TV-параметров.
tvList
Список TV-параметров, которые должны быть в выборке.
renderTV
TV-параметры, значение которых необходимо подготовить к отображению в соответствии с установленными виджетами. TV параметры которых нет в значении параметра tvList будут проигнорированы.
Сортировка
sortType
Значение sortType определяет режим сортировки. Если не задано, то производится сортировка по критериям, указанным в параметрах orderBy или sortBy и sortDir
orderBy
sortBy
Критерий сортировки без направления сортировки.
order
sortDir
Сортировка по TV-параметрам
tvSortType
Правила приведения типов TV-параметров при сортировке.
Возможные значения (перечисляются через запятую в том порядке, в котором указаны имена TV в параметре orderBy ):
tvSortWithDefault
В силу особенностей движка (TV-параметры значения которых совпадают со значениями по умолчанию не сохраняются в отдельную таблицу), сортировка записей может быть не корректа, если значение по умолчанию отличается от пустой стрки. Поэтому рекомендуется дополнительно указывать ТВ параметры у которых принудительно указано значение по умолчанию.
Фильтрация
showNoPublish
Вывод удаленных или не опубликованных ресурсов (используется только в контроллерах на базе site_content )
filters
Правила для фильтрации документов.
Пример строки
filter_delimiter
Выборка по тэгам
tagsData
Строка определяющая источник тэгов.
Дополнительные данные
urlScheme
Схема генерации URL
dateSource
Поле документа в котором располагается дата.
dateFormat
summary
Правила обработки текстов для формирования краткого описания.
introField
contentField
Имя поля в котором хранится основной текст документа. Используется только если загружен экстендер summary
jotcount
DocLister: Разработчикам
DocLister: Разработчикам
Контроллеры
Имя класса расположенного в файле php файле должно заканчиваться на DocLister, а сам класс должен быть унаследован от абстрактного класса DocLister.
В параметре dir можно указать пусть от корня сайта к папке с контроллером.
Экстендеры
Экстендеры могут загружаться из контроллера или с помощью параметра extenders, в котором перечислены имена файлов *.extender.inc из папки /core/extender/
Загружаемый экстендер должен быть классом имя которого должно начинаться с имени экстендера и заканчиваться на _DL_Extender. Помимо этого, загружаемый экстендер должен быть унаследован от абстрактного класса extDocLister.
Фильтры
Правила фильтрации можно найти в файле *.filter.php по имени фильтра из папки /core/filter/. Класс в файле должен быть унаследован от абстрактного гласса filterDocLister, а само имя должно заканчиваться на _DL_filter.
Приведение типов TV-параметров
Пример в контроллере site_content:
Сохранение объекта DocLister
Это может быть удобно, когда один и тот же список необходимо шаблонизировать 2 раза.
Или, например, нужно получить массив ID документов, которые задействованы в выводе
Использование шаблонизатора DocLister в своих сниппетах
Подключив класс DLTemplate вы уже можете пользоваться шаблонизатором, который:
Обычная шаблонизация
Подмена шаблона у документа
Для упрощения восприятия, весь процесс настройки ТВ параметров будет упущен. Поэтому представим, что у нас имеется:
Создаем плагин для событий OnLoadWebDocument и OnLoadWebPageCache
Использовать подмену шаблонов может быть удобно, если вы редактируете сайт на горячую (без разворачивания девелоперских версий).
Обработка данных перед выводом
Чаще всего полученные данные выводятся не в чистом виде. Например, требуется выполнение при выводе каких-либо условий или обработок (вывод превью для картинки, пересчет цены, форматирование значений).
Традиционным способом в MODX является вызов сниппетов в шаблонах вывода или использование модификаторов (phx). Такой подход часто используется новичками в силу простоты, но при этом увеличивается нагрузка на парсер и базу данных.
В DocLister предусмотрена возможность предварительной обработки данных средствами PHP с помощью параметра prepare.
Значением параметра prepare может быть:
Можно задавать несколько значений для последовательных обработок.
Использование сниппетов
Для того, чтоб получить значение параметров из вызова сниппета используйте конструкцию:
Данная конструкция позволяет получить значения параметра ‘parameter_name’ из вызова сниппета.
Использование методов класса
Значение параметра в этом случае: DLprepare::prepare
Аналогичным образом можно использовать анонимные функции.
Примеры из блога Agel Nash
Пример 1
Итак, представим, что у нас есть некий вызов DocLister’a:
Где tplChunk это ни что иное, как:
Внутри чанка tplChunk имеется вложенный вызов if (допустим тот, что был указан в начале топика). Что мы делаем?
Добавляем к вызову DocLister параметр &prepare= test (можно и не тест, а любое другое значение).
Создаем сниппет с именем test (ну или с тем именем, которое было указано в параметре prepare)
В сниппете пишем такой код:
Вы конечно можете вместо runSnippet написать и:
Но еще раз вспомним почему это плохо: pagetitle может содержать символы об которые запнется парсер modx. Так можно написать только в том случае, если pagetitle может содержать вызов сниппета (но это оооочень редкий случай + есть другие способы для обработки вложенных modx тегов)! Но вернемся к нашим баранам.
Избавившись от вложенного сниппета теперь можно спокойно избавиться от чанка tplChunk и вынести шаблон прямо в вызов DocLister’a:
Пример №2
Этот пример будет сложнее для понимания. Но он еще более наглядно демонстрирует преимущество параметра prepare.
На сайте имеются несколько групп товаров (телефоны, телевизоры, магнитофоны). В каждой группе соответственно свои позиции, которые пользователь добавляет в корзину. На странице оформления заказа все выбранные позиции должны еще иметь подпись (к какой группе товаров они принадлежат). Помимо каждый товар в корзине имеет такие характеристики, как кол-во заказываемого товара, стоимость товара и общая стоимость с учетом количества. Так же нужно посчитать общее ИТОГО в виде полной суммы заказа.
Упростим немного эту задачку переместив в TV-параметр count заказываемое количество позиций. А саму корзину выведем точным перечислением ID документов. Таким образом вызов принимает следующий вид:
А чанк ListShop содержит такой код:
Если сниппет DocInfo всем знаком, то сниппет FullPrice это ни что иное, как банальное перемножение двух чисел:
Чтобы стало понятнее, вот так выглядит дерево ресурсов:
Т.к. это корзина, то все вызовы сниппетов делаем не кешированными и смотрим на результат (меня интересует общее число запросов): 12 SQL запросов для решения такой плевой задачи.
Пробуем теперь сделать тоже самое при помощи prepare сниппета.
fullPrice это ни что иное, как банальное перемножение 2 числе (цены и количества). Согласитесь, нет необходимости для такой банальной операции создавать/вызывать еще 1 сниппет, когда можно произвести расчет прямо как говорится «не отходя от кассы».
category запускает тот же самый DocInfo при помощи runSnippet (т.е. ничего не поменялось).
Давайте опять подведем итог: Благодаря prepare сниппету получилось избавиться от необходимости повторной обработки тех же самых данных, которые нужны для получения и вывода какой-то другой информации в произвольном месте этой же страницы.
Пример №3
Этот пример еще сложнее, но одновременно с этим еще более полезней и интересней.
Именно для этой цели в DocLister, а если быть точнее в экстендере prepare есть 2 метода: getStore и setStore. Один сохраняет, а второй соответственно извлекает данные из памяти. Как только DocLister завершил свою работу, сохраненные блоки удаляются из памяти (массив автоматически очищается) и все работает дальше без каких-либо глюков, как это могло бы быть, если бы мы сохраняли временные данные в глобальный массив плейсхолдеров. Более того, при таком подходе и больших объемах потребовалось бы очень много памяти.
Ладно, хватит лирики. Давайте посмотрим как можно переписать сниппет prepare с учетом getStore и setStore:
Я не стал копипастить весь исходник, а только процитировал измененную часть. Но думаю тут и так понятно, что мы «обернули» вызов сниппета DocInfo в эти 2 функции. А в качестве уникального ключа указали currentParents[+parent+]. Таким образом, для формирований этой же страницы MODX-у потребовалось всего 7 SQL запросов.
Таким образом: сниппет prepare позволяет не только обрабатывать данные, но и исключить бесполезное повторное выполнение кода.
Обработка шаблона обертки
После того, как каждый документ обработан, DocLister пытается применить обертку ownerTPL. Порой бывает необходимо эту обертку дополнительно обработать и возможно подменить в зависимости от различных условий (кол-во выводимых документов, даты и т.п.).