Наверх

Units — правильно указываем окончания для количественных обозначений

Доделываю портал, где пользователи могут добавлять свои статьи и нужно вывести общее количество статей пользователя на его странице. Нужно было правильно указать окончание у слова "статей" — ведь когда статья всего одна, будет некрасиво показывать "У вас 1 статей".



Нашел в интернете решение этой проблемы и оформил его в пакет Units для MODX. Использовать его можно как фильтр вывода. Начнем с примера цены, ведь при отображении цен тоже надо правильно просклонять слово "рубль". Рубли в пакете используются по умолчанию, поэтому, чтобы получить правильное обозначение пишем так:
Цена: [[+price]] [[+price:units]]

Этот код выведет правильно слово "рубль" в зависимости от значения плейсхолдера [[+price]]. В итоге мы получим:
Цена: 121 рубль
Цена: 53 рубля
Цена: 318 рублей

Если вам нужны не рубли, а, например, штуки, указываем правильные формы в параметре options:
[[+quantity:units=`Заказана|Заказаны|Заказано`]]
[[+quantity]]
[[+quantity:units=`штука|штуки|штук`]]
Заказана 21 штука
Заказаны 164 штуки
Заказано 14 штук


Для примера, можете посмотреть работу дополнения на этом сайте — количество комментариев указывается после каждой статьи, и слово "комментариев" автоматически склоняется в зависимости от количества.

Скачать дополнение можно в репозитории: Units


9 комментариев

  1. Виталий Греков 24 февраля 2014, 16:31(Комментарий был изменён) # 0
    ни как не могу разобраться почему не выводит (вырезает)
    создал tv quantity вывожу вот так
    [[+quantity]]
    [[+quantity:units=`штука|штуки|штук`]]
    выводит только штук
    если выводить вот так
    [[*quantity]]
    [[*quantity:units=`штука|штуки|штук`]]
    то выводит как надо
    использую PdoTools
    пробовал на test.modx.pro
    1. Илья Уткин 25 февраля 2014, 09:31(Комментарий был изменён) # +1
      Скорее всего, не стоит параметр &ilcludeTVs=`1` в вызове pdoTools
    2. Guest 10 апреля 2015, 18:28 # 0
      А можно исходный код на php?
      1. Илья Уткин 11 апреля 2015, 08:08 # 0
        <?php
        $output = array();
        $input = isset($input) ? (float) str_replace(',','.',$input) : 0;
        $options = isset($options)
            ? explode("|", $options)
            : explode("|", "рубль|рубля|рублей");
        $options[1] = isset($options[1]) ? $options[1] : $options[0];
        $options[2] = isset($options[2]) ? $options[2] : $options[1];
        if ($input - round($input) != 0) {
            $output = $options[1];
        } else {
            if ($input % 10 == 1 && $input % 100 != 11) {
                $output = $options[0];
            } elseif ($input % 10 >= 2 && $input % 10 <= 4
                 && ($input % 100 >= 20 || $input % 100 < 10)) {
                $output = $options[1];
            } else {
                $output = $options[2];
            }
        }
        
        return $output;
      2. Виталий 09 января 2016, 02:13 # 0
        Здравствуйте. Использую mSearch.
        В результатах вызываю
        По запросу: "[[+mse.query]]" найдено [[+mse.total]] [[+mse.total:units=`результат|результата|результатов`]]
        Получаю: По запросу: «Сахалин» найдено 3 результатов
        В чём может быть ошибка?
        1. Илья Уткин 11 января 2016, 12:56 # 0
          Возможно, не передается число… Попробуйте так
          [[!units? &input=`[[!+mse.total]]` &options=`результат|результата|результатов`]]
          1. Виталий 11 января 2016, 13:50 # 0
            Спасибо за ответ. К сожалению, лучше не стало. Некэшируемым тоже вызывал.
            Проблема, я думаю здесь:
            $input = isset($input) ? (float) str_replace(',','.',$input) : 0;
            Вывожу через print_r переменную input и вижу выводит 0. Хотя mse.total = 4
            1. Виталий 11 января 2016, 14:01 # 0
              На входе пусто, вывел input до проверки. Ничего не вывелось.
              1. Илья Уткин 11 января 2016, 15:38 # 0
                Дам-с, это из-за механизма фильтрации… Ну, можно попробовать написать такой же скрипт на JavaScript — он-то точно должен уж отработать)

          Авторизация

          через сервис Loginza:

          Подписка или RSS

          Буду присылать новые статьи — никакого спама



          Шаблоны MODX

          1 2 Дальше »

          Объектная
          модель
          MODX