[NumberAbbreviation] - модификатор для сокращения больших чисел (1.2K)

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

Я сначала не совсем понимал принцип формирования подобного формата чисел. Но благодаря пользователю Neonich решение было найдено.

Итак, есть решение — почему бы не сделать его для всех?
Как следствие этого появился пакет NumberAbbreviation, который добавляет новый модификатор numabbr.

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

Что под капотом?


Дополнение использует плагин, который добавляет феном-модификатор в момент инициализации Fenom и одноимённый сниппет-модификатор, который используется если не установлен pdoTools или если используется обычный синтаксис MODX.
Преимущество использования феном-модификатора очевидно — это скорость и отсутствие дополнительных запросов для вызова сниппета.

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


{$views|numabbr} — вызываем через fenom-модификатор
[[+views:numabbr]] — вызываем через синтаксис MODX (используется сниппет-модификатор)

Другие примеры

{111|numabbr} — выведет 111
{1000|numabbr} — выведет 1K
{1229|numabbr} — выведет 1.2K
{1500|numabbr} — выведет 1.5K
{154000|numabbr} — выведет 154K
{1000000|numabbr} — выведет 1M
{1500000|numabbr} — выведет 1.5M

Установить пакет вы можете подключившись к репозиторию modstore.pro либо скачав сам транспортный пакет с страницы дополнения.

ДЕМОНСТРАЦИЯ И ДОКУМЕНТАЦИЯ =>

БЕСПЛАТНО В MODSTORE.PRO =>

UPD:
— (22.12.2017) — новый логотип дополнения, старый: file.modx.pro/files/e/f/1/ef13fa1285ae08a963024d964cbc225b.png
Василий Столейков
22 декабря 2017, 07:17
modx.pro
6
3 176
+13
Поблагодарить автора Отправить деньги

Комментарии: 37

Дмитрий
22 декабря 2017, 10:18
+2
Надеюсь, это-то хейтить не будут
    Василий Столейков
    22 декабря 2017, 10:19
    +2
    И я надеюсь. Это дополнение больше ориентировано на программистов.
      Николай Савин
      22 декабря 2017, 12:46
      +1
      А чего бесплатно то? Уж если снежинки стоят 290р — то тут не меньше 490 думаю надо брать.
        Василий Столейков
        22 декабря 2017, 12:49
        0
        Обсуждали уже это в телеграме…
        На свои дополнения ставь хоть миллион, я не буду против.
        У этого дополнения другая целевая аудитория. Програмисты != клиенты.
          Yar
          Yar
          22 декабря 2017, 14:56
          0
          можно ссылку на канал в телеге
          Николай Савин
          22 декабря 2017, 19:38
          0
          У этого дополнения другая целевая аудитория. Програмисты != клиенты.
          Ты же ранее написал
          Это дополнение больше ориентировано на программистов.
            Василий Столейков
            22 декабря 2017, 20:02
            0
            Может я неверно выразился: предыдущее дополнение ориентировано на клиентов-заказчиков. Это дополнение — инструмент для разработчиков. Следовательно Программисты-разработчики != (не равно) клиенты-заказчики. Поэтому и ценовая политика другая.
            Надеюсь ясно объяснил, как-то так.
        Василий Наумкин
        22 декабря 2017, 13:28
        +6
        Давайте обойдёмся без токсичных комментариев.

        Новый год на носу, будьте добрее.
Василий Наумкин
22 декабря 2017, 12:31
+3
Дополнение использует плагин, который добавляет феном-модификатор в момент инициализации Fenom и одноимённый сниппет-модификатор
На всякий случай — Fenom отлично вызывает модификаторами обычные сниппеты. Добавление модификатора в него напрямую нужно только если ты используешь файловые сниппеты.

Модешь прямо сейчас отключить свой плагин и у Fenom всё равно всё будет работать.
    Василий Столейков
    22 декабря 2017, 12:36
    +1
    Я руководствовался твоим советом отсюда: modx.pro/development/10910/
    Вызов сниппета, это всё-таки дополнительная нагрузка

    Понятно что у Fenom и через сниппет будет работать, но если вызывается именно fenom-модификатор, то работать будет быстрее, ты сам обратил на это внимание:
    Так как этот модификатор является внутренним методом Fenom и загружается один раз при его инициализации — работает он быстрее любого сниппета.
      Василий Наумкин
      22 декабря 2017, 13:27
      0
      По идее — да (хотя разницу я не тестировал).

      Но если у тебя 2 раза прописан один код в сниппете и плагине, то лучше бы оставить его в одном месте. А если и там, и там вызывается один метод из общего класса — то спасибо, что позаботился о пользователях Fenom!
        Василий Столейков
        22 декабря 2017, 13:33
        +1
        Я тестировал, перед тем как писать пакет — если используется феном, то вызывается модификатор фенома, а не сниппет и скорость на больших количествах разительно отличается. Могу попробовать собрать тест.

        Но если у тебя 2 раза прописан один код в сниппете и плагине, то лучше бы оставить его в одном месте.
        У меня сейчас дубляж кода, типа если не сработает у пользователя плагин, то сниппет его страхует повторяя тот же код.
        Спасибо за идею затолкнуть это в общий класс — так и сделаю!
          Василий Наумкин
          22 декабря 2017, 13:35
          0
          Могу попробовать собрать тест.
          Только если есть свободное время — в теории оно так и должно быть, но интересно же, как на практике.
            Василий Столейков
            22 декабря 2017, 14:04
            +1
            Запустил тест на modhost взяв за основу твой тест скорости.

            На чистом MODX:
            $tpl = '@INLINE <p>[[+val1:numabbr]] - [[+val2:numabbr]] - [[+val3:numabbr]]</p>';
            
            0.0003231: Created inline "modChunk" with name "9ac2f45dface999372b73c0e849b6e2b"
            6.4335611: Total time
            2 097 152: Memory usage

            Ну и на Fenom:
            $tpl = '@INLINE <p>{$val1|numabbr} - {$val2|numabbr} - {$val3|numabbr}</p>';
            
            0.0003171: Created inline "modChunk" with name "1eb147a25d4f0c2e1d98d1677831e5a7"
            0.0079300: Compiled Fenom chunk with name "modchunk/1eb147a25d4f0c2e1d98d1677831e5a7"
            0.0751421: Total time
            4 194 304: Memory usage

            Тут даже и говорить ничего не надо, с феном-модификатором страница грузится моментально.

            Fenom FOREVER... )))
              Василий Наумкин
              22 декабря 2017, 14:55
              +1
              Не совсем корректный тест. Должен быть всегда
              $tpl = '@INLINE <p>{$val1|numabbr} - {$val2|numabbr} - {$val3|numabbr}</p>';
              но в одном случае плагин для встраивания модификатора включен, а в другом — нет, и тогда будет запускаться сниппет, но тоже через Fenom.

              Таким образом будет видна разница между сниппетом и встраиванием напрямую.
                Василий Столейков
                22 декабря 2017, 15:02
                +6
                Разница тоже потрясающая!

                С плагином для феном-модификатора:
                0.0004969: Created inline "modChunk" with name "1eb147a25d4f0c2e1d98d1677831e5a7"
                0.0092301: Compiled Fenom chunk with name "modchunk/1eb147a25d4f0c2e1d98d1677831e5a7"
                0.0684869: Total time
                4 194 304: Memory usage

                Без плагина (на основе сниппета-модификатора):
                0.0001199: Created inline "modChunk" with name "1eb147a25d4f0c2e1d98d1677831e5a7"
                0.0011730: Compiled Fenom chunk with name "modchunk/1eb147a25d4f0c2e1d98d1677831e5a7"
                0.0009501: Loaded "modSnippet" with name "numabbr"
                2.6079650: Total time
                10 485 760: Memory usage
                  Василий Наумкин
                  22 декабря 2017, 15:10
                  +4
                  Ого!

                  Настолько разницы я не ожидал, круто.
                  Pavel Zarubin
                  22 декабря 2017, 22:46
                  +1
                  А вот за тесты тебе респект, не знал что такая большая разница!
                  Сергей Шлоков
                  23 декабря 2017, 08:52
                  +1
                  Что-то тут явно не так. На модхосте тестовая полупустая страница рендериться за 2.6 секунды?

                  Да ещё видимо это данные только одного прогона на чистом кэше. Такой тест малоинформативен. Прогони 10 раз и дай средний результат.

                  П.С. Ради интереса проверил на том же модхосте. Страница со сниппетом грузится за 0.04 сек. с пустым кэшем. Второй запрос за 0.02 сек. Видимо твой сниппет так грузит сайт.
                    Василий Столейков
                    23 декабря 2017, 09:07
                    +1
                    Логично, прогнал каждый тест по 10 раз и вывел среднее значение Total time:

                    С плагином для феном-модификатора: 0.07425782
                    Без плагина (на основе сниппета-модификатора): 3.01222153

                    Код в сниппете и в плагине идентичный. Проверял на тестовом тарифе модхоста.
                      Сергей Шлоков
                      23 декабря 2017, 09:13
                      0
                      Да быть такого не может. Ну как страница с одним сниппетом может столько грузиться?
                      А какие цифры чистой страницы без модификатора и плагина?
                      Василий Столейков
                      23 декабря 2017, 09:24
                      +1
                      Вот усреднённое значение из 10 прогонов страницы без модификатора: 0.05295319
                      Скрипт один в один как в оригинале. Тестовый тариф модхост, PHP 7.0
                      Сергей Шлоков
                      23 декабря 2017, 09:31
                      0
                      Ну и какой вывод напрашивается? :)
                      Василий Столейков
                      23 декабря 2017, 09:45
                      +1
                      Вывод:
                      №1. Если нужен этот (или любой другой) модификатор, то лучше всегда использовать феном-модификаторы, а не сниппеты.
                      №2. Если есть модификаторы на сниппетах, переписать их все на феном.
                      №3. Если есть возможность, не использовать ни то ни другое. Вообще не стоит разрабатывать сайты, тогда никаких проблем не будет.
                      Сергей Шлоков
                      23 декабря 2017, 09:57
                      +2
                      Аж целых 3! А третий я бы с небольшой правкой отправил нашей футбольной сборной. )

                      А я выскажу свой вывод, который ты можешь легко проигнорировать. Если пустая страница грузится за 0.05 сек, а со сниппетом за 3 сек, то проблема или в тесте или в сниппете.
                      Василий Столейков
                      23 декабря 2017, 10:10
                      +1
                      А как тебе такой тест?
                      Используем самый простой сниппет-модификатор, который просто возвращает $input:
                      <?php
                      return $input;

                      Среднее значение с сниппетом: 2.59597648
                      Такой же упрощённый плагин для феном: 0.0543768

                      Не забывай, что тест проходит 10000 итераций.

                      Вывод: модификаторы — необходимое зло, но из двух зол лучше выбрать меньшее...
                      Василий Столейков
                      23 декабря 2017, 10:15
                      1
                      +1
                      Как я и говорил, проверял на PHP 7.0. Когда переключил на 7.2 значения сильно поменялись в лучшую сторону, но пропорции остались:
                      Сниппет — 2.0118967666667
                      Плагин — 0.0478010
                      Сергей Шлоков
                      23 декабря 2017, 10:49
                      +2
                      Не забывай, что тест проходит 10000 итераций.
                      Вот и причина. Теперь понятно, откуда такая разница. Кстати, Василий в свое время предложил решение для оптимизации именно такого случая — замена фильтров на функции.

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

                      П.С. Это я к тому, что твоим сниппетом можно пользоваться и с феномом и без. Всё будет хорошо. )
                      Василий Столейков
                      23 декабря 2017, 15:10
                      +2
                      Честно говоря, я не понимаю, что показывает твой тест. Никто не будет вызывать на странице 10 тыс. раз этот сниппет-фильтр. Поэтому твой тест показывает непонятно что.
                      Ну, мне показалось что на больших объёмах разница лучше видна невооружённым взглядом.

                      Это я к тому, что твоим сниппетом можно пользоваться и с феномом и без. Всё будет хорошо.
                      Поэтому я и вшил в пакет оба варианта, кто не пользуется одним, воспользуется другим. А кому важна скорость работы — тот уже и так использует феном везде.

                      А третий я бы с небольшой правкой отправил нашей футбольной сборной. )
                      Посмеялся от души, спасибо за юмор! :D
                      Сергей Шлоков
                      24 декабря 2017, 08:59
                      +2
                      Ну, мне показалось что на больших объёмах разница лучше видна невооружённым взглядом.
                      Думаю, разница исчисляется сотыми секунды. Но если увеличить в 10 тыс. раз, то впечатлительные будут потом мучаться бессонницей. )

                      А можешь сделать тест для более реального случая — 10 циклов?
                      Василий Столейков
                      24 декабря 2017, 15:29
                      1
                      0
                      10 циклов:
                      • плагин: 0.0012100
                      • сниппет: 0.0076529
          Василий Столейков
          23 января 2018, 19:33
          1
          0
          Как правильно загрузить свой класс из плагина на pdoToolsOnFenomInit?
          loadClass и getService не срабатывают — ломают Fenom на странице. В логах сервера появляется что-то типа этого:
          Uncaught Error: Call to a member function loadClass() on null in путь_к_плагину

          В модификаторе-сниппете с этим проблем нету.
            Василий Столейков
            23 января 2018, 20:00
            1
            0
            Нашел решение, просто нужно было подключить в функцию переменную $modx:
            function ($input) use ($modx)
      Василий Столейков
      22 декабря 2017, 12:37
      +4
      Кстати, спасибо большое за возможность добавлять свои fenom-модификаторы — это очень крутая вещь!
    Sergey Leleko
    23 декабря 2017, 18:24
    +1
    Спасибо за вашу работу!
Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
37