Довольно часто новичкам, которые начинают работать с 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
также есть на сайте.