[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
4 324
+13
Поблагодарить автора Отправить деньги

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

Дмитрий
22 декабря 2017, 10:18
+2
Надеюсь, это-то хейтить не будут
    Василий Столейков
    22 декабря 2017, 10:19
    +2
    И я надеюсь. Это дополнение больше ориентировано на программистов.
      Николай Савин
      22 декабря 2017, 12:46
      +1
      А чего бесплатно то? Уж если снежинки стоят 290р — то тут не меньше 490 думаю надо брать.
        Василий Столейков
        22 декабря 2017, 12:49
        0
        Обсуждали уже это в телеграме…
        На свои дополнения ставь хоть миллион, я не буду против.
        У этого дополнения другая целевая аудитория. Програмисты != клиенты.
          brioni
          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