pdoTools — это набор удобных инструментов (сниппетов) для повседневной работы. Дополнительно включает небольшую библиотеку, которая увеличивает скорость работы сниппета.
Cистема построена на собственной ORM под названием xPDO. Она очень упрощает работу, позволяет писать один универсальный код для разных БД, и еще много чего.
Особенности:
- Быстрая работа с БД (запросы составляются на xPDO, а выбираются без объектов — на PDO).
- Предварительная обработка простых плейсхолдеров в чанках (парсер MODX задействован только при работе со сложными вызовами.
- Код чанков можно указывать прямо при вызове сниппета, загружать обычным образом или из статичных файлов.
- Предусмотрена сортировка, подготовка, обработка и вывод ТВ параметров.
- Ведение подробного журнала работы сниппета с отметками времени, для отладки.
- Возможность загрузки классов и множество функций, которые можно применять в своих разработках.
- Встроенный шаблонизатор Fenom в версии 2.0
- В настоящее время в комплект входит 10 универсальных сниппетов (со временем появляются новые инструменты)
Набор универсальных сниппетов:
MODX tv (дополнительные поля / переменные)
- pdoResources — инструмент для выборки ресурсов (очень быстрая замена для getResources, совместимая по параметрам). Он поддерживает почти все его возможности, и бладает особенностями:
— подключение других таблиц через разные JOIN
— можно указывать, что именно выбирать из колонок таблиц
— гибкие условия выборки, вплоть до указания чистого SQL - pdoMenu — инструмент для постоения различных меню (замена для Wayfinder)
- pdoUsers — выборка и вывод пользователей сайта, с фильтрацией по ролям и группам.
- pdoCrumbs — генерация хлебных крошек (замена BreadCrumb).
- pdoSitemap — генерация карты сайта (очень быстрая замена GoogleSiteMap
- pdoNeighbors — инстумент вывода ссылок на соседние документы.
- pdoField — инструмент получающий любое поле ресурса или его родителя, включая ТВ параметр. Имеет возможность вывода по умолчанияю. Отличная замена getResourcesField и UltimateParent.
- pdoPage — постраничный вывод результатов (замена getPage).
- pdoTitle — выводит оформленный тег title на страницу сайта, который состоит из имени страницы, имён родителей этой страницы и, других параметров. Предназначен для визульного различия документов с постраничной навигацией.
- pdoArchive — предназначен для вывода архива документов сайта с разбивкой на годы, месяцы и дни.
Классы pdoTools
Ядро компонента разделено на 3 класса: общий pdoTools, работа с БД — pdoFetch и работа с оформлением, то есть pdoParser.
При установке в систему для быстрого запуска они регистрируются таким образом:
$pdoTools = $modx->getService(‘pdoTools’); $pdoFetch = $modx->getService(‘pdoFetch’); $pdoParser = $modx->getService(‘pdoParser’);
pdoFetch наследует pdoTools, так что не нужно вызывать эти два класса вместе. Если вы хотите работать с БД, вызывайте один Fetch, а если нет — Tools.
Дополнительные поля (TV) в MODX Revolution
Парсер вызывать вообще не нужно, он или включен в настройках MODX, или нет. pdoTools использует его для оформления чанков в любом случае.
Установка pdoTools осуществляется стандартным образом из официального репозитория modx.com или c modstore.pro
Общие параметры для сниппетов, основанных на pdoTools/pdoFetch.
Параметры выборки ресурсов
Эти параметры определяют, какие объекты будут получены.
parents | Текущий ресурс | Список родителей, через запятую, для поиска результатов. Если поставить 0 — выборка не ограничивается. Если id родителя начинается с дефиса, он и его потомки исключаются из выборки. | |||
resources | Список ресурсов, через запятую, для вывода в результатах. Если id ресурса начинается с дефиса, этот ресурс исключается из выборки. | ||||
context | Ограничение выборки по контексту ресурсов. | ||||
showHidden | 0 | Показывать ресурсы, скрытые в меню. | |||
showDeleted | 0 | Показывать удалённые ресурсы. | |||
hideUnsearchable | Отключает вывод спрятанных от поиска ресурсов. | ||||
modResource»:»id,pagetitle,content»}. | |||||
rightJoin | Аналог SQL оператора right join | ||||
joinSequence | innerJoin,leftJoin,rightJoin | Порядок подключения таблиц, через зяпятую. | |||
includeTVs. Можно указывать JSON строку с массивом нескольких полей. Для случайно сортировки укажите «RAND()» | |||||
groupby | Указывает поле, по которому группируются результаты | ||||
groupby | |||||
offset | 0 | Пропуск результатов от начала. | |||
last | Автоматически, по формуле (total + first — 1) | Номер последней итерации вывода результатов. | |||
loadModels=`ms2gallery,msearch2`. | |||||
tvFiltersOrDelimiter представляет логическое условие OR и по нему условия группируются в первую очередь. Внутри каждой группы вы можете задать список значений, разделив их tvFilters=`filter2==one,filter1==bar%||filter1==foo`. Обратите внимание: фильтрация использует оператор LIKE и знак «%» является метасимволом. И еще: Поиск идёт по значениям, которые физически находятся в БД, то есть, сюда не подставляются значения по умолчанию из настроек ТВ. | |||||
,» | Разделитель для условий AND в параметре tvFiltersOrDelimiter | «||» | Разделитель для условий OR в параметре sortbyTV | Дополнительное поле, по которому нужно сортировать результаты. Может быть указано напрямую в параметре sortdirTV | Направление сортировки по дополнительному полю, указанному в sortby |
checkPermissions | Укажите, какие разрешения нужно проверять у пользователя при выводе объектов. | ||||
fenomModifiers | список сниппетов-модификаторов через запятую, для подключения в Fenom. |
Параметры шаблонов
Эти параметры устанавливают чанки, которые содержат шаблоны для генерации вывода, то есть отвечают за внешний вид.
tplFirst | Имя чанка для первого ресурса в результатах. | |||||
tplOdd | Имя чанка для каждого чётного ресурса (хоть «odd» значит «нечётный», работает для чётных ресурсов). | |||||
tpl_4=`tpl4th` установит шаблон для 4-го ресурса. | ||||||
tpl_n4=`tplEvery4th` будет применено к каждому 4-му ресурсу. | ||||||
conditionalTpls. | ||||||
tplCondition с массивом значений и чанков в conditionalTpls | JSON строка с массивом, у которого в ключах указано то, с чем будет сравниваться tplOperator. Для операторов типа isempty можно использовать массив без ключей. | |||||
return | chunks | Определяет способ вывода результатов. См. ниже. | ||||
nestedChunkPrefix | pdotools_ | Префикс для «быстрых плейсхолдеров», включаемых параметром idx | Вы можете указать стартовый номер итерации вывода результатов. | |||
includeContent | 0 | Включаем поле «content» в выборку. | ||||
includeTVList | Псевдоним prepareTVs | 1 | Список ТВ параметров, с файлами из источников медиа, для которых нужно сгенерировать полные пути. Если установить в «1», будут подготовлены все ТВ, указанные в processTVs | Список ТВ параметров, которые нужно обработать и вывести согласно их настроек в менеджере системы. Если установить в «1», будут обработаны все ТВ, указанные в tvPrefix | tv. у pdoResources и пусто у других сниппетов | Префикс для ТВ параметров. |
decodeJSON | Разбирает поля типа JSON вместо вывода в виде строки | |||||
useWeblinkUrl | Генерировать ссылку с учетом класса ресурса. | |||||
additionalPlaceholders | Устанавливает дополнительные плейсхолдеры | |||||
cache_handler | Значение системной настройки cache_resource_handler или xPDOFileCache | Обработчик кеша | ||||
return . В основном это используют сами сниппеты для внутренних нужд, но вы можете указывать parents=`0` Array».
Modx вывести tv в шаблонеЗаказчик хочет получить сайт на MODx. Изучаю его по русским обучалкам, параллельно превращая верстку заказчика в живой сайт. В целом, MODx — это отличный конструктор, нацеленный на обычного юзера с нормальной тягой к саморазвитию. Я понял его идеологию «с разбега», но с таким трудом до меня доходил смысл TV, что скрип мыслей слышали соседи 😀 Читал несколько разных источников с объяснениями, и все равно не понимал. В итоге осенило 🙂 А когда написал эту заметку, вернулся на сайт разработчиков MODx и без проблем нашел следующее определение: «Переменные шаблона (template variable, TV) — настраиваемое поле ресурса в MODx. TV используется для расширения заданных по умолчанию атрибутов ресурса. Нормальный ресурс MODx обладает определенным количеством дефолтных полей: pagetitle, content, description и т.д.» (перевод официального RTFM) Это все, что нужно знать о TV, когда видишь их в первые. Но проблема в том, что дальше в том же RTFM (как и в русских источниках) начинается сдвиг понятий 🙁 «Если вам нужно добавить несколько полей на ваши страницы, например второе поле контента или выпадающий список месяцев или еще что-угодно, вы делаете это добавлением Переменной Шаблона (TV) в ваш шаблон.» Так вот не надо так это объяснять. Подходим к переменным шаблона (TV). На самом деле — это поля ресурса! Как раз когда под хотелки разраба не хватает предусмотренных по умолчанию полей, он заводит TV и связывает ее с ресурсом. Но черт возьми, какого ж фига это делается через шаблон!? Вот это долго сбивало с толку. Вообщем логика простая: нужно в вашей записи блога/магазина/еще-чего-то новое поле для каких-то данных — заведите TV и свяжите ее с ресурсом. Но делается это через указание шаблонов, имеющих доступ к TV. Шаблоны в свою очередь назначены для отображения записей (ресурсов). Вообще смысл видимо следующий: записей блога/магазина будет много, но выводиться они все будут через один шаблон элемента. Чтобы каждому однотипному ресурсу (читай записи) не привязывать новое поле, это сделано через связь . Следует помнить, что ресурс в MODx необязательно соответствует конечной записи блога/товару в магазине. Это может быть каталог, содержащий другие ресурсы. Это все конечно хранится в записях таблиц, но разработчик этого не видит. IMHO, зря создатели MODx отошли от общепринятых понятий и создали свой словарь. К примеру «атрибуты» — это на самом деле «поля». И раз уж ресурс — это запись в таблице, то можно было его так и называть. И логичнее было бы «переменные шаблона» называть «полями ресурса». Но это мое мнение. Понравилась статья? Расскажите о ней друзьям: Источник: waredom.ru MODx Revo API (xpdo)Небольшое описание, о том как пользоваться modx revo api8359 23 August 2016 1 документация, modx revo, xPDO Текущий ресурс / Текущий пользователь$currentResource = $modx->resource; $currentUser = $modx->user; Если пользователь не залогинен в контексте, имя пользователя будет ‘(anonymous)’. Поля для каждого объекта доступны через метод get(). getContent() для содержания (контента) ресурса. $intro = $modx->resource->get(‘introtext’); $UserID = $modx->user->get(‘id’); $content = $modx->resource->getContent(); Ищем другие объекты.$resource = $modx->getObject(‘modResource’, $id); Ссылки на все объекты MODx можно получить с помощью метода $modx->getObject(). $object = $modx->getObject(‘object-class-name’, array(‘name’ => ‘object-name’ )); Получить ссылку на чанк по имени. $chunk = $modx->getObject(‘modChunk’,array(‘name’ => ‘chunkName’ )); Получить ссылку на чанк по id. $chunk = $modx->getObject(‘modChunk’,$chunkId); Получить опубликованный ресурс по имени (pagetitle). $document = $modx->getObject(‘modResource’,array( ‘published’ => 1, ‘pagetitle’ => ‘Джузеппе’ )); Для получения массива документов, отвечающих вашим критериям, вы можете использовать getCollection() вместо getObject(). Такой пример выведет все опубликованные и доступные для поиска ресурсы. $docArray = $modx->getCollection(‘modResource’,array( ‘published’ => 1, ‘searchable’ => 1 )); Еще getCollection() не возвращает массив PHP а возвращяет массив объектов. Получить массив PHP, можно с помощью метода объекта toArray(). $phpArray = $object->toArray(); Если вы хотите получить несколько соответствующих объектов, связанных с одним объектом, вы можете использовать метод объекта getMany(). Предполагая, что вы использовали getObject(), чтобы получить ссылку на ресурс или шаблона, вы можете получить связанные с ними TV как показано здесь: $tvs = $template->resource->getMany(‘TemplateVars’); Чтобы получить дочерние ресурсы: $children = $resource->getMany(‘Children’); getObject() и getOne() возвращают ноль, если запрашиваемый объект не найден, а getMany() и getCollection() возвращает пустой массив, если нет результатов приведенным критериям. Все отдельные ресурсы (документ, гиперссылки, символические ссылки и статические ресурсы) могут быть получены с помощью: $modx->getObject(‘modResource’,$criteria); И по отдельности. $modx->getObject(‘modDocument’,$criteria); $modx->getObject(‘modWeblink’,$criteria); $modx->getObject(‘modSymlink’,$criteria); $modx->getObject(‘modStaticResource’,$criteria); Отдельные элементы (чанки, сниппеты, плагины, шаблоны, TV переменные и категории) с использованием ключа объекта желаемого класса. $modx->getObject(‘modChunk’,$criteria); $modx->getObject(‘modSnippet’,$criteria); $modx->getObject(‘modPlugin’,$criteria); $modx->getObject(‘modTemplate’,$criteria); $modx->getObject(‘modTemplateVar’,$criteria); $modx->getObject(‘modCategory’,$criteria); Системные настройки$modx->getOption(‘site_name’); Получение поля объекта с помощью $object->get()После того как вы получили объект с помощью getObject(), getCollection(), или getMany(), вы можете использовать с $object->get() для получения любого поля объекта по названию. $resource = $modx->getObject(‘modResource’,1); $pagetitle = $resource->get(‘pagetitle’); $longtitle = $resource->get(‘longtitle’); $id = $resource->get(‘id’); . Связи $object->getOne() и $object->getMany() с объектами.Чтобы получить родительский ресурс как объект MODx. $parentRes = $resource->getOne(‘Parent’); Получения пользователем объекта пользователя, который создал ресурс. $user = $resource->getOne(‘CreatedBy’); Объект пользователя содержит только ID, имя пользователя и хэш пароля пользователя. Чтобы получить больше, вам нужно получить объект modUserProfile, связанный с этим пользователем. $user->getOne(‘Profile’); Выпихнуть поля можно так. $profile->get(‘fullname’); $profile->get(‘website’); . ТВшки (Template Variables)Получение обработанного значение TV текущего документа. $modx->resource->getTVValue(‘image’); Или получить значение TV по pagetitle нужного нам ресурса. Такой код выведет значение image ресурса со значением pagetitle = Джузеппе. $resource = $modx->getObject(‘modResource’,array( ‘pagetitle’=>’Джузеппе’ )); $val = $resource->getTVValue(‘image’); Изменение объектовПосле получения ссылки на объект с помощью $modx->getObject(), вы можете изменить значение ее поля. $resource = $modx->getObject(‘modResource’, ‘1’); $resource->set(‘pagetitle’, ‘Джузеппе’); $resource->save(); // теперь у ресурса с id 1 значение поля pagetitle = Джузеппе Создание нового объекта $object = $modx->newObject(‘modChunk’); $object->set(‘name’, ‘juzeppe’); $object->setContent(‘Тут у нас Джузеппе.’); $object->set(‘description’, ‘Эт я’); $object->save(); // теперь у нас есть чанк «juzeppe» с контентом «Тут у нас Джузеппе.» и описанием «Эт я» Общие объекты и некоторые их свойства.Вот список наиболее часто используемых объектов с их имена классов и имена некоторых из своих полей и типов. Связанных объектов, доступных с getOne() и getMany() приведены ниже поля для каждого объекта. modResource
Связанные объекты доступны getOne()Связанные объекты доступны в getMany()
modChunk
Связанные объекты доступны getOne()
Связанные объекты доступны в getMany()
modSnippet
Связанные объекты доступны getOne()
Связанные объекты доступны в getMany()
modPlugin
Связанные объекты доступны getOne()
Связанные объекты доступны в getMany()
modTemplate
Связанные объекты доступны getOne()
Связанные объекты доступны в getMany()
modTemplateVar
Связанные объекты доступны getOne()
Связанные объекты доступны в getMany()
modUser
Связанные объекты доступны getOne()
Связанные объекты доступны в getMany()modUserProfile
Связанные объекты доступны getOne()
Источник: pitrooo.ru |