Довольно часто новичкам, которые начинают работать с MODX, приходится сталкиваться с тем, что для решения какой-нибудь элементарной задачи приходится долго искать готовые решения. Сейчас мы разберем, как писать свои сниппеты?
Разберем на небольшом примере.
Часто приходится иметь дело со следующей ситуацией: есть сайт-каталог, товары в каталоге имеют численную характеристику, будь то вес, или чаще всего цена. В том случае, если цена используется для фильтрации товаров, тогда TV параметр должен иметь формата числа, но для пользователей числа надо форматировать. Вот этим мы как раз и займемся.
Есть MODX Revolution, есть TV-параметр price
, в нем есть значение 5000000 (пять миллионов). Согласитесь, понять 5 миллионов или 500 тысяч — понять довольно сложно, но так как оно численное, с ним удобно работать для сравнения и фильтрации.
Для форматирования числа будем использовать PHP функцию number_format()
. Вызов сниппета будет примерно выглядеть следующим образом:
[[num_format? &num=`[[*price]]` &dec=`2` &sep=`,` &tho=` `]]
Наш сниппет принимает следующие параметры:
num
— TV параметр, или число, которое нужно отформатировать;dec
— количество символов после запятой;sep
— разделитель между целой и дробной частью;tho
— разделитель между тысячными разрядами.
Все эти параметры ни что иное, как названия переменных, которые мы можем использовать в сниппете.
Заходим в раздел «Сниппеты» и создаем новый с названием num_format
.
Вставляем в него следующий код:
if ($num == '') // Значение из TV параметра
$num = 0;
if ($dec == '') // число знаков после запятой
$dec = 2;
if ($sep == '') // разделитель дробной части
$sep = ',';
if ($tho == '') // разделитель тысячого разряда
$tho = ' ';
$output = number_format( $num, $dec, $sep, $tho);
return $output;
Как вы уже наверно заметили, в коде сниппета можно использовать те переменные, которые были определены при его вызове как параметры.
В сниппете можно использовать переменные, которые были определены при его вызове как параметры.
В первых строчках сниппета определяем значения по-умолчанию. Сделано это прежде всего для того, чтобы максимально универсально использовать PHP функцию.
Давайте взглянем на то, что за результат мы получим, если будем вызывать наш сниппет при различных параметрах:
// [[num_format]]
0,00
// [[num_format? &num=`[[*price]]` &dec=`2`]]
5 000 000,00
// [[num_format? &num=`8888` &dec=`3` &sep=`/`]]
8 888/000
При этом очередность перечисления параметров во время вызова сниппета значения не имеет. в отличии от параметров в PHP функции.
Таким образов в написании своих сниппетов для MODX нет абсолютно никаких сложностей. Все работает очень просто и понятно. По такому же принципу работает и Evolution, различаться будет только синтаксис при вызове сниппета, статья с различиями между Evo и Revo также есть на сайте.
7 комментариев
Orange
Автор, спасибо. Думаю данный сниппет тут выступает только в качестве примера, но именно разделение разрядов в числах я и искал. ) Так, как немного знаком с PHP, данный урок дал понятие о том, как PHP скрипты внедряются и используются в Modx (в котором только начинаю работу). Благодаря Вашему уроку двух зайцев одним выстрелом. Спасибо.
Дмитрий Ильичев
Спасибо за отзыв! Буду стараться больше писать про MODX!
Сереня
а сколько вообще кода можно запихивать в сниппет? нигде не нашел , существуют ли лимиты и что делать если например сниппет выходит на 700 строк и под 40000 символов?
Дмитрий Ильичев
Если кода много, то лучше всего запихнуть его в отдельный файл, закинуть на сайт, а в коде сниппета просто подключить этот файл через include_once например. И редактировать удобно, и код аккуратный.
Роман
Спасибо, Димон!
Твой простой сниппет решил мой сложный вопрос)
Владимир
Добрый день!
Тут приведен самый наипростейший пример, конечно такой не сложно делать. Хотя тоже интересно. А я вот хочу работать с БД, точнее с пользователями, где найти и как обращаться к базе и какие переменные использовать? Вот в чем трудность.
Дмитрий Ильичев
Привет!
В этом случае нужно обратиться к API. Документация находится на https://docs.modx.com
Например, чтобы получить имя пользователя, достаточно просто: