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

Разберем на небольшом примере.

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

Есть MODX Revolution, есть TV-параметр price, в нем есть значение 5000000 (пять миллионов). Согласитесь, понять 5 миллионов или 500 тысяч — понять довольно сложно, но так как оно численное, с ним удобно работать для сравнения и фильтрации.

Для форматирования числа будем использовать PHP функцию number_format(). Вызов сниппета будет примерно выглядеть следующим образом:

[[num_format? &num=`[[*price]]` &dec=`2` &sep=`,` &tho=` `]]

Наш сниппет принимает следующие параметры:

  1. num — TV параметр, или число, которое нужно отформатировать;
  2. dec — количество символов после запятой;
  3. sep — разделитель между целой и дробной частью;
  4. 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
      Например, чтобы получить имя пользователя, достаточно просто:

      $user = $modx->getUser();
      echo $user->get('username');
      

Добавить комментарий для Дмитрий Ильичев Отменить ответ

Ваш адрес email не будет опубликован. Обязательные поля помечены *

*

*

*