Понадобилось мне навесегда избавиться от дублей (заказчику это очень не нравилось и Яндексы всякие с ним были солидарны), в общем погуглил-погуглил, нашел решение, но для Revolution.
По сути, получается очень удобный выбор категорий, в которых товар может содержаться. Выбирать можно как галочками, так и списком с множественным выбором (с помощью Ctrl+click). Красота да и только.
Сама идея отсюда — мной (не без помощи комментариев) допилена для Evolution и вот что получилось.
Ну, начнем, пожалуй. Все создаем по очереди.
Чанк >
Чанк я сделал для более красивого и информативного вывода чекбоксов. Показывает окошко чекбокса, имя категории и серым ее ID (иногда чтобы не искать полезно делжать перед глазами — заказчика не парит и мне в помощь)
[+pagetitle+] (id: [+id+])==:[+id+]:||
Параметр (TV) [*catMultiCheck*]
Тип ввода: CheckBox (можно поставить и «Множественный выбор» — это уж кому как больше нравится)
Возможные значения:
Доступ шаблонов: products
modx tv
После сохранения — в админке появятся категории. Теперь подробно разжую зачем это нужно (новичкам пригодится):
Теперь про то, что мы суем в массив.
- ‘startID’=>0, — откуда ничинаем. У меня все категории в корне лежат, так что стоит ноль.
- ‘depth’=>2, — глубина. Как много в этом слове. Если поставить 1 — будем копаться только в текушем уровне, т.е. подкатегории не найдутся. Поэтому два. Если есть под-подкатегории — ставьте три.
- ‘where’=>’isfolder=1’, — проверяем на категорию (контейнер). Мне нужны только контейнеры, поэтому 1. Если нужны НЕ контейнеры — ставим ноль. Вообще, where здесь (кстати, регистр следует соблюдать) указывает на то, что дальше будет реальный WHERE SQL-запроса на тот случай, если нужно руками выбрать что-то как в нашем случае.
- ‘sortBy’=>’’, — сортировка. Тут особо даже сказать нечего.
- ‘tpl’=>’tplCatMultiCheck’ — показываем пальцем на шаблон (тут указан чанк, но можно и имя файла указать).
Все это добро должно быть одной строкой.
Сниппет [[getIDLikeByTV]]
Отдельное спасибо комментатору Сергей со страницы автора решения для [Revo]- часть кода предложена им, допилена мной.
else < $this_all_url = $like; >$ids_arr = array(); $query = $modx->db->query(» SELECT `id`, `contentid` FROM `».$modx->db->config[‘table_prefix’].»site_tmplvar_contentvalues` WHERE tmplvarid=».intval($tmplvarid).» AND value LIKE ‘%:$like:%’ «); $result = $modx->db->makeArray($query); foreach ($result as $ar) < array_push($ids_arr,$ar[‘contentid’]); >$ids_str = implode(‘,’,$ids_arr); $res = $modx->runSnippet(‘Ditto’, array( ‘parents’ => $like, ‘tpl’ => ‘shopStuff’, ‘paginate’ => ‘1’, ‘sortBy’ => ‘menuindex’, ‘sortDir’ => ‘ASC’, ‘documents’ => $ids_str )); return $res.$item.$all_prod; ?>
Шаблоны (вызов сниппета для вывода товаров)
Шаблоны main, category (опять же, у меня).
Создание корпоративного сайта на MODX Revolution 4 урок Управление контентом на MODX Revo TV ТВ поля
Здесь вот что стоит отметить — tmplvarid=`23` — это ID TV-параметра catMultiCheck. Какой у вас показывает — тот и ставьте вместо 23.
Источник: merinovkv.ru
pdoTools для MODx
pdoTools — это набор удобных инструментов (сниппетов) для повседневной работы. Дополнительно включает небольшую библиотеку, которая увеличивает скорость работы сниппета.
Cистема построена на собственной ORM под названием xPDO. Она очень упрощает работу, позволяет писать один универсальный код для разных БД, и еще много чего.
Особенности:
- Быстрая работа с БД (запросы составляются на xPDO, а выбираются без объектов — на PDO).
- Предварительная обработка простых плейсхолдеров в чанках (парсер MODX задействован только при работе со сложными вызовами.
- Код чанков можно указывать прямо при вызове сниппета, загружать обычным образом или из статичных файлов.
- Предусмотрена сортировка, подготовка, обработка и вывод ТВ параметров.
- Ведение подробного журнала работы сниппета с отметками времени, для отладки.
- Возможность загрузки классов и множество функций, которые можно применять в своих разработках.
- Встроенный шаблонизатор Fenom в версии 2.0
- В настоящее время в комплект входит 10 универсальных сниппетов (со временем появляются новые инструменты)
Набор универсальных сниппетов:
- 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.
Парсер вызывать вообще не нужно, он или включен в настройках 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 Revolution — принципы работы, создание, вызов, передача параметровСниппеты — один из элементов MODX, благодаря которому можно разработать любой функционал. В этой статье рассмотрим технические детали использования сниппетов в CMF MODX Revolution.
Олег Толочко , 30 Апреля 2023 В CMF MODX Revolution сниппет (snippet) — это фрагмент PHP-кода, который может быть вызван в полях ресурса, чанке, шаблоне или другом сниппете для выполнения определенной функции. Они используются для добавления динамического контента, манипулирования данными в базе данных или выполнения сложных операций. Создание сниппетаВызовите контекстное меню в дереве элементов во вкладке «Сниппеты». Можно воспользоваться кнопкой «Новый» — тогда откроется новая страницы. «Быстро создать» — появится форма во всплывающем окне. Также можно использовать кнопки в дереве ресурсов. При установленном пакете tagElementPlugin можно создавать сниппеты при вызове окна быстрого редактирования — если элемент с таким именем не будет найден, система предложит создать новый. Чтобы не путаться в нейминге, можно использовать php в начале названия — так сразу будет понятно, что вызываете именно сниппет. Еще упрощает жизнь создание структуры, наподобие объектной модели, например: php.Article.GetTags php.Article.UpdateHitsCount php.Article.GetRating php.Article.Articles.GetPopular php.Tags.GetList php.Author.GetRating Тогда элементы и в дереве элементов сортируются понятно, и при вызове больше понимания, что делает скрипт. ИспользованиеСниппет всегда должен возвращать какое-то значение в return. Если фактически он возвращает пустое значение — можно вернуть true. Например, вы создали сниппет php.snippetName и написали код, который отображает текущую дату и время. return date(«F j, Y, g:i a»); Когда страница будет отображена, результат будет вставлен в место расположения тега, если скрипт возвращает результат. Бывают случаи, когда скрипт не возвращает результат сам по себе, а записывает его в плейсхолдеры — тогда сначала нужно вызвать сниппет, а затем указать плейсхолдер в месте, где нужно вывести результат. Зададим плейсхолдер date: $modx->setPlaceholder(‘date’, date(«F j, Y, g:i a»)); Текущая дата: [[+date]] КешированиеСниппеты могут вызываться в кешированном и некешированном виде. [[php.snippetName]] [[!php.snippetName]] Кешируемый при первой генерации сохраняется в статичный файл, и при последующих обращениях будет браться именно из файла, чтобы сократить время на выполнения скриптов и нагрузку на базу данных. До тех пор, пока не будет очищен кеш — при сохранении сниппета или чисте кеша сайта, например. Некешируемый будет выполняться каждый раз при загрузке страницы. Правило простое — используем кешируемые везде, где можно. Некешируемые вызываем только когда постоянно нужны актуальные данные или выполнение действия в момент загрузки страницы (получить get параметры; увеличить счетчик просмотров страницы и тд). Также некешируемый вызов можно использовать на этапе разработки сайта, чтобы не пропускать ошибки, но не забудьте потом везде включить кеш. МодификаторыСниппет можно использовать как модификатор вывода. Если кратко — мы можем добавить модификатор к тегу (чанку или полю ресурса, например), и этот модификатор поменяет значение этого тега при выводе. В MODX есть встроенные модификаторы и фильтры, но если мы хотим создать свой — используем сниппеты. Например, создадим скрипт phpH1 , который выведет pagetitle страницы в теге h1 : $input = $modx->getOption(‘input’, $scriptProperties, »); $output = $input; if ($output != ») { $output = ‘ ‘ . $output . ‘‘; } return $output; xPDO и MODX APIС помощью MODX API можно получать поля и TV поля текущего ресурса:
Или другого ресурса по его ID: Также мы можем строить продвинутые запросы xPDO. К примеру, получить ресурсы с шаблоном и вывести их заголовки на странице: $q = $modx->newQuery(‘modResource’); $q->where(array( ‘template’ => ‘2’ )); $q->select(array( ‘id’, ‘pagetitle’ )); $res = $modx->getCollection(‘modResource’, $q); foreach ($res as $r) { echo $r->get(‘pagetitle’); } Но обычно нам нужно не просто вывести заголовки на странице, а использовать какой-то шаблон. Обычно для шаблонизации элементов используют чанки. Вызов чанкаОсновной грамотной разработки на PHP и в MODX в частности является разделение логики и представления. Проще говоря — надо разделять PHP код и верстку. Как Вы наверное уже знаете, для верстки в MODX используются чанки. Получить чанк в сниппете можно таким образом: $html = $modx->getChunk(‘tplSomeChunk’, array( ‘placeholderName’ => ‘Oleg’, ‘placeholderAge’ => 23 ) ); В 1 параметре указывается название чанка, во втором — массив данных, которые могут быть использованы как плейсхолдеры в самом чанке, условно: Привет, я [[+placeholderName]], мне [[+placeholderAge]] года Когда мы получаем какие-то данные из базы данных, как правило каждая строка (если получаем ресурсы — то строка равна ресурсу), представлена как раз в виде массива данных: [ 0 => [ ‘id’ => 1, ‘pagetitle’ => ‘value’, . ], 1 => [ ‘id’ => 2, ‘pagetitle’ => ‘value2’, . ] ] Поэтому мы можем передавать в вызов чанка прямо этот массив данных. В этом примере мы получаем ресурсы методом getCollection: $output = »; $q = $modx->newQuery(‘modResource’); $q->select(array( ‘id’, ‘pagetitle’ )); $resources = $modx->getCollection(‘modResource’, $q); if ($resources) { foreach ($resources as $res) { $resArr = $resources->toArray(); // Приводим объект в обычный массив $output .= $modx->getChunk(‘tplSomeChunk’, $resArr); } } return $output; Как видите, чтобы передать ресурс в качестве аргумента, сначала нужно привести его из объекта в массив. Если же получать не объекты, а сразу массив данных — такая манипуляция не нужна: $output = »; $q = $modx->newQuery(‘modResource’); $q->select(array( ‘id’, ‘pagetitle’ )); $q->prepare(); $q->stmt->execute(); $resources = $q->stmt->fetchAll(PDO::FETCH_ASSOC); if ($resources) { foreach ($resources as $resource) { $output = $modx->getChunk(‘tplSomeChunk’, $resource); } } return $output; Передача параметровСниппеты также могут принимать входные параметры. Это позволяет настроить различные сценарии поведения скрипта. Чтобы передать параметры, используйте следующий синтаксис: [[snippetName? parameter2=`[[*pagetitle]]` parameter4=`[[+placeholder]]` getOption() . При этом можно задать значение по умолчанию. Например: $parameter1 = $modx->getOption(‘parameter1’, $scriptProperties); // Задать значение по умолчанию $parameter2 = $modx->getOption(‘parameter2’, $scriptProperties, ‘Привет’); Вроде разобрали все основные нюансы. Сниппеты помогают вывести свои сайты MODX Revolution на новый уровень и не испытывать ограничений при разработке, поэтому советую погрузиться в тему и изучить их. Источник: digitalsfera.ru |