Modx revo если TV пусто

В этой статье Я бы хотел рассказать Вам о фильтрах (модификаторах) в MODx .

В принципе, можно жить и без них, но, зная как и где они применяются, разработчик получает мощный инструмент, с помощью которого можно добавлять небольшую, но, порой, очень полезную логику на Ваш сайт.

В этой статье Я буду говорить про MODx Revolution . Возможность применять фильтры существует благодаря сниппету PHx, который по умолчанию уже встроен в ядро MODx Revolution, в ядре же Evolution PHx отсутствует, поэтому на Evo его необходимо устанавливать отдельно.

Итак, фильтры позволяют манипулировать с данными, которые получаются в результате парсинга плейсхолдеров и тэгов. Они дают возможность модифицировать данные прямо в Ваших шаблонах.

Синтаксис фильтров выглядит следующим образом:

Очень удобно то, что их можно выстраивать в цепочки:

При этом, передавать параметры в сниппеты также возможно. Главное, чтобы фильтр прописывался между названием сниппета и вопросительным знаком:

MIGX TV Gallery in MODX Revolution

В следующей таблице перечислены некоторые фильтры и на примере показано их применение . Хоть в примерах и использован плейсхолдер, но фильтры могут применяться к любому тэгу MODx»а. Убедитесь в том, что плейсхолдер действительно что-либо возвращает.

Условные модификаторы

Сравнивает вывод с заданным значением и в случае если вывод больше либо равен переданному значению продолжает парсинг тэга. Используется совместно с «then» и «else»

Сравнивает вывод с заданным значением. Если вывод больше -продолжает парсинг. Используется с «then» и «else»

Строковые модификаторы

Идентично функции PHP htmlentities . Использует текущее значение системного параметра «modx_charset» с флагом ENT_QUOTES

Создание пользовательский модификаторов

Сниппеты могут использоваться в качестве модификаторов. Для этого просто вместо название фильтра следует вписать имя сниппета. Например, у нас есть сниппет с названием «makeDownloadLink»

Этот вызов передаст в сниппет следующие параметры:

Результатом будет являться то, что будет возвращать сниппет .

Примеры использования

Здесь приведен пример, когда фильтры вызываются друг за другом. Данный пример форматирует дату из строки в другой формат:

Прямой доступ к таблице modx_user_attributes из базы данных из сниппета может быть заменен на простое использование модификатора userinfo. Для получения нужного поля, необходимо в параметры модификатора передать название столбца из БД.

Внутренний ключ: [[!+modx.user.id:userinfo=`internalKey`]]

Имя пользователя: [[!+modx.user.id:userinfo=`username`]]

Полное имя: [[!+modx.user.id:userinfo=`fullname`]]

Дата рождения: [[!+modx.user.id:userinfo=`dob`:date=`%Y-%m-%d`]]

Почтовый индекс: [[+modx.user.id:userinfo=`zip`]]

Фильтры в революции позволяют управлять способом представления данных. Они позволяют изменять значения внутри шаблонов.

Организация структуры MODx Revo, работа с чанками и TV полями

В революции выходной фильтр применяется один или более раз из серии выходных модификаторов, которые ведут себя подобно PHx вызывам в MODx Evolution — за исключением, что они встроены в ядро. Синтаксис выглядит следующим образом:

Они также могут быть соединены (выполняется слева направо):

Вы также можете использовать их, чтобы изменить выход сниппета; внимание, модификатор идет после имени сниппета и перед вопросительным знаком, например,

В следующей таблице перечислены некоторые из существующих модификаторов и приведены примеры их использования. Хотя приведенные ниже примеры являются для некоторых тегов, выходные модификаторы могут быть использованы с любым тегом MODx. Убедитесь, что модификатор получает данные.

Модификатор

[ [+numbooks:is=`5`:or:is=`6`:then=`There are 5 or 6 books!`:else=`Not sure how many books`] ]

isequalto, isequal, equalto, equals, is, eq

[ [+numbooks:isequalto=`5`:then=`There are 5 books!`:else=`Not sure how many books`] ]

notequalto, notequals, isnt, isnot, neq, ne

Еще по теме:  Ростелеком и винк для тех кто дома

[ [+numbooks:notequalto=`5`:then=`Not sure how many books`:else=`There are 5 books!`] ]

greaterthanorequalto, equalorgreaterthen, ge, eg, isgte, gte

Больше или равно

[ [+numbooks:gte=`5`:then=`There are 5 books or more than 5 books`:else=`There are less than 5 books`] ]

isgreaterthan, greaterthan, isgt, gt

[ [+numbooks:gt=`5`:then=`There are more than 5 books`:else=`There are less than 5 books`] ]

equaltoorlessthan, lessthanorequalto, el, le, islte, lte

Меньше или равно

[ [+numbooks:lte=`5`:then=`There are 5 or less than 5 books`:else=`There are more than 5 books`] ]

islowerthan, islessthan, lowerthan, lessthan, islt, lt

[ [+numbooks:lt=`5`:then=`There are less than 5 books`:else=`There are more than 5 books`] ]

[ [+numbooks:gt=`0`:then=`Now available!`:else=`Sorry, currently sold out.`] ]

memberof, ismember, mo

Модификатор

lcase, lowercase, strtolower

Транформация в малые буквы

ucase, uppercase, strtoupper

Трансформация в большие буквы

Первая буква слова заглавная

Первая буква заглавная

htmlent, htmlentities

Замена тегов HTML

Безопасно убирает символы

Замена перевода каретки, табуляции и множества пробелов на один пробел

stripString

Удаляет значение из строки

striptags, stripTags,notags,strip_tags

Убирает HTML теги

len,length, strlen

reverse, strrev

Новая строка после указанного количества символов

wordwrapcut

Вставляет символ новой строки после определенного количества символов.

Выводимое кол-во символов

Обрезание строки после указанного кол-ва символов

Отображает сырой элемент без: тега. Полезно для документации.

Если значение может изменяться динамически, то его следует сделать некэшированным. Например:

[ [+placeholder:default=`A default value!`] ]

Это означает, что значение может иногда быть пустым, а иногда нет. Зачем его хранить в кэше? Это может исключить то, что значение может появиться.

Если вы не уверены будет ли результат при выполнении сниппета, то логично сделать значение по умолчанию:

[ [!getResources:default=`Sorry — nothing matched your search.`? parents=`2,3,4,8` includeTVs=`1`] ]

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

Например у нас есть сниппет MainSlide (он выводит из таблицы MySql изображения в слайдер):

Для вывода слайдера на главной странице нужно сделать простое условие с помощью модификатора MODX, данный модификатор notempty делает проверку содержится ли в плейсхолдоре строка или нет:

В данном примере мы данные положили в плейсхолдер и после делаем проверку через модификатор, так-же можно проверять поля MODX и создынные дополнительные поля:

Если у вас есть более длинный код в операторе a: then = «: else = «, и вы хотите сделать его более читаемым, поставив его на несколько строк, это нужно сделать следующим образом:

В следующей списке перечислены самые нужные условные из существующих модификаторов и приведены примеры их использования. Выходные модификаторы могут использоваться с любыми тегами MODx.

Модификатор or,and

Проверка на несколько значений.

[[+slide:is=`5`:or:is=`6`:then=`В слайдере есть контент`:else=`В слайдере пусто`]]
[[+slide:is=`5`:and:is=`6`:then=`В слайдере есть контент`:else=`В слайдере пусто`]]

Модификатор is

Если тег равен модификатору.

[[*slide:is=`5`:then=`В слайдере есть контент`]]
[[*slide:is=`5`:then=`В слайдере есть контент`:else=`В слайдере пусто`]]

Модификатор ne

Если тег не равен модификатору.

[[*id:ne=`1`:then=`Не главная страница`:else=`Главная страница`]]

Модификатор notempty

Вернет, указанный модификатор, если значение не пусто.

Модификатор hide, show

Скрывает элемент, если условие выполняется или показывает.

Модификатор then, else

Условие, если тег соответствует модификатору, выводим сообщение.
Условие, если тег не соответствует модификатору, выводим сообщение. Используется только в связке с «then»

[[*id:is=`1`:then=`Выводим слайдер`:else=`Слайдер только на главной`]]

И так, фильтр который вы сможете себе сделать на сайт очень универсальный!
Его можно будет применить к любому проекту и при этом сэкономив много времени

Для начала необходимо установить пакет pdoResources, который входит в состав пакета pdoTools. Вы можете установить или весь набор пакетов pdo (pdoTools) или только pdoResources отдельным пакетом для создания фильтра на MODx Revolution.

После установки пакетов, давайте подключим сниппет, который вы скачали с GitHub в ваш проект. Если вы разрабатываете каталог сейчас с нуля, то советую придерживаться использования определенных классов для Ajax фильтрации.

Еще по теме:  Как подключить интернет через Триколор ТВ тарифы

Однако если у вас уже готовый каталог, вы можете определить классы элементов Ajax фиьтра в JS файле (см. ниже).

Обратите внимание, что.ajax-item должен быть непосредственным потомком.ajax-container. Если вы используете сетку Bootstrap для разметки колонок, можете определить класс контейнера как «row ajax-container», а колонки айтема как «col-md-4 ajax-item».

Подключение JS скрипта Ajax фильтра

Подключим скрипт JS к проекту. Вы можете подключить его как отдельным файлом, так и непосредственно в файл кастомных скриптов проекта. Для работы скрипта требуется jQuery.

  • Строки 5-13: определение переменных для CSS селекторов Ajax фильтра. Не меняем, если используем стандартные значения, как на рисунке выше;
  • Строки 15-22: скрипт счетчика ресурсов в результатах фильтрации;
  • Строки 24-35: основная функция Ajax фильтрации;
  • Строки 37-49: обработчик события по клику на кнопку «Загрузить еще»;
  • Строки 51-54: обработчик события по клику на кнопке «фильтровать». Данная кнопка может отсутствовать, так как фильтрация происходит автоматически.
  • Автоматическая фильтрация может быть отключена путем удаления строк 68-70;
  • Строки 56-66: обработчик события очистки формы и сброса фильтра. Строки 59-63 отвечают за сброс параметров сортировки;
  • Строки 68-70: функция автоматической сортировки при изменении полей формы фильтра;
  • Строки 72-82: универсальная функция сортировки по tv параметру.

Подключение PHP сниппета в MODx Revolution

«; > return $modx->runSnippet(«pdoResources»,$params).$button;

Между комментариями //Filter Fields Settings и //End Settings находятся параметры, которые вам необходимо отредактировать под свой проект. Тут ни чего сложного, просто прописываете name полей input и проверяете их условием if. Для полей типа Radio, Select и Text используем пример из строк 5-8. Для определения промежуточного значения от и до можно воспользоваться примером из строк 11-16. Для чекбоксов подойдет пример из строк 19-21.

В строке 74 сниппета вы можете задать свои классы, но не удаляйте текущюю разметку, так как она учавствует в скриптах для подгрузки контента.

Пример возможных значений в панели управления MODx для радиокнопок: Первый==1||Второй==2||Третий==3

Пример вывода радиокнопок во фронтенд:

Здесь именование name=«floor» соответствует строкам 6-8 нашего сниппета catalogFilter. Аналогично реализована обработка других полей формы. Я думаю, это понятно и создание своих собственных полей не будет для вас проблемой.

Вывод сниппета осуществляется в шаблоне каталога следующим образом:

[[!catalogFilter? limit=`3` fields=`image,area,floor,garage,price` ]]

  • tpl=`tplCatItem` — чанк айтема в списке каталога;
  • limit=`3` — Сколько записей выводить и по сколько записей подгружать при клике на кнопке «Загрузить еще»;
  • parents=`5` — указываем id роительского документа для каталога ресурсов;
  • fields=`image,area,floor,garage,price` — перечисляем TV»s, которые необходимо показать в чанке tplCatItem и которые необходимо обрабатывать при фильтрации.

[[+pagetitle]]

[[+tv.area:isnot=«:then=`

`]]

Этаж [[+tv.floor]]
Площадь [[+tv.area]] кв.м.
Гараж [[+tv.garage:is=`1`:then=`Есть`:else=`Нет`]]
Цена: [[+tv.price]]

Ajax сортировка по TV
В нашем скрипте имеется готовое решение для сортировки результатов фильтрации по любому TV полю. В форму фильтра вставьте следующие скрытые поля и не меняйте их значение, они просто должны быть в форме фильтра:

В любом месте вашего HTML шаблона сделайте вывод кнопки и в data атрибуте укажите поле, по которому хотите фильтровать выдачу:

Сортировать по цене: По возрастанию

При клике тогглится класс button-sort-asc, который можете использовать для оформления кнопки при смене направления сортировки, добавления стрелочек и т. д. в атрибут data-sort-by можно писать любой TV, учавствующий в фильтрации. С сортировкой все.

Итак, мы рассмотрели создание несложного Ajax фильтра ресурсов в MODx с выводом результатов в сниппет pdoResources.

Всем доброго здравия. В этой статье я расскажу как сделать фильтр документов по tv-параметрам на сайте под управлением Modx Revolution. Мы будем использовать сниппет tagManager2 от Аndchir . Этот сниппет умеет работать сразу с несколькими tv, а также с числовыми данными (в виде цены) и множественным списком. Каждый этот пример мы разберем далее.

Еще по теме:  Правильное подключение ТВ кабеля

1. Для начала нужно установить tagManager2

Для этого идем в Приложения/Установщик/

жмем кнопку «Загрузить дополнение» и в строке поиска вбиваем tagManager2

Также еще нужно установить сниппет getPage и getProducts . Таким образом раздел «Управление пакетами» должен выглядеть так (сниппет translit, кстати, отвечает за транслитерацию псевдонимов на латиницу)

Загружаем, устанавливаем пакеты и идем в «Настройки системы»

2. Настраиваем сниппет tagManager2

В Системных настройках выбираем раздел tag_manager2

MODx Revolution решение практических задач

Чтобы программным путем присвоить значение TV параметру ресурса используется метод setTVValue, следующим образом:

setTVValue ([имя TV параметра или его ID], [строка — значение параметра])

Пример:
$page = $modx->getObject(‘modResource’, 100);

if (!$page->setTVValue(‘mytv’, ‘значение tv параметра’)) $modx->log(xPDO::LOG_LEVEL_ERROR, ‘Произошла ошибка при сохранении ТВ’);
>

В официально документации MODx Revo почему-то пропустили некоторые операторы, которые также можно использовать в запросе к базе данных.

Иногда при выборке требуется использовать оператор MySQL — NOT IN, рассмотрим простой пример использования NOT IN, по сути он такой же как и IN:

$q=$modx->newQuery(‘modResource’);
$q->select(array(
‘id as docID’,
‘parent’,
‘pagetitle’));
$q->where(array(
‘published’ => ‘1’,
‘cacheable’ => ‘1’,
‘class_key’ => ‘modDocument’,
‘parent:!NOT IN’ => array(‘1′,’4′,’5’)
));
$result = $modx->getCollection(‘modResource’, $q); Читать →

Для создания пользователей в MODx программным путем необходимо обратиться к объекту modUser и modUserProfile.

PHP код создания пользователя:

  • Mac Программы
  • HTML, CSS примеры
  • Action Script 3.0

Источник: maker.su

Упрощаем работу с TV

Продолжая тему, начатую Василием, предлагаю решение для упрощения работы с TV. Оно поможет тем, у кого логика сайта завязана на TV — запросы, фильтры и т.п. Решается эта задача созданием полей в таблице ресурсов и копированием в них значений TV.

Покажу на своем примере.

  1. Создаем TV «tv.action», которая будет признаком, что ресурс акционный. Это нужно для выборки только тех ресурсов, которые участвуют в акции. 1 — участвует, 0 — нет. Обратите внимание на префикс.
  2. В таблице modx_site_content создаем поле «action». Удобнее всего через phpMyAdmin.

Тип: tinyint Длина: 1 Значение по-умолчанию: 0 Атрибуты: UNSIGNED
event->name) { case ‘OnMODXInit’: // Загружаем наше поле в модель ресурса $modx->loadClass(‘modResource’); $modx->map[‘modResource’][‘fields’][‘action’] = 0; $modx->map[‘modResource’][‘fieldMeta’][‘action’] = array( ‘dbtype’ => ‘tinyint’, ‘precision’ => 1, ‘attributes’ => ‘unsigned’, ‘phptype’ => ‘integer’, ‘null’ => false, ‘default’ => 0, ); break; case ‘OnDocFormSave’: // Сохраняем ТВ в поле таблицы ресурса $resource->set(‘action’, $resource->getTVValue(‘tv.action’)); $resource->save(); break; }

Не забываем отметить нужные события.

[[!pdoResources? where=`{«action»:»1″}` depth=`0` ]]

и получаем все ресурсы, для которых установлен признак акции. И никакой мороки с значениями по умолчанию, джойнами и т.п. Сложные типы TV-шек не тестировал, но думаю должно работать. Для тех, у кого много TV, скорость запросов должна заметно вырасти.

Было бы интересно узнать результаты до и после.

В результате ТВ-шки работают как обычно, а вот запросы значительно упростились, так как они теперь работают только с одной таблицей. И на странице можно указывать тег с именем добавленного поля ( [[*action]] ), парсер обработает его быстрее, так как он не будет делать дополнительный запрос к таблице ТВ-шек. Вот такой велосипед получился.

Важно!

Имя ТВ и поля должны отличаться! В противном случае, при использовании TV на странице сайта значение поля будет некорректным. Можно добавить префикс «tv» к имени ТВ-шки.

Причина в том, что в классе modRequest в 247 строчке подгружаются ТВ-шки и затирают значение поля. Выход нашел пока только один — ТВ-шкам давать префикс. Например, создаем ТВ «tv.action», а поле для нее создаем «action».

Тогда в плагине нужно писать так

$resource->set(‘action’, $resource->getTVValue(‘tv.action’));

Рекомендация!

Оцените статью
Добавить комментарий