Это информация о возможном сломе обратной совместимости в классе Pagination Joomla 5.1.3+. Релиз 5.1.3 был связан с закрытием уязвимостей (см. Joomla 5.1.3 and 4.4.7 Security and Bug Fix Release), в нём был изменён подход к генерации ссылок для страниц пагинации. Из‑за этого могут перестать работать ссылки страниц пагинации в сторонних компонентах Joomla. В компонентах ядра ошибки работы пагинации были исправлены в релизе 5.1.4.

Как было?

До сих пор ссылки на отдельные страницы, а также ссылки на страницы «В начало», «В конец», «Вперед» и «Назад» автоматически включали все параметры запроса, которые присутствуют в текущем запросе ($app->getInput()). Такое поведение создает возможность вектора атаки злоумышленников на заражение кэша.

Как стало?

Чтобы смягчить этот фактор, пришлось внести изменения в поведение класса Pagination. Класс разбивки на страницы по умолчанию будет включать только следующие параметры запроса в процесс генерации URL-адреса:

<?php
// @see \Joomla\CMS\Pagination\Pagination::_buildDataObject

$defaultUrlParams = [
            'format'        => 'CMD',
            'option'        => 'CMD',
            'controller'    => 'CMD',
            'view'          => 'CMD',
            'layout'        => 'STRING',
            'task'          => 'CMD',
            'template'      => 'CMD',
            'templateStyle' => 'INT',
            'tmpl'          => 'CMD',
            'tpl'           => 'CMD',
            'id'            => 'STRING',
            'Itemid'        => 'INT',
        ];

Если этих параметров достаточно для формирования корректного URL с помощью Route::_(), то можно ничего не менять. Если вам нужны нетипичные параметры (например, project_id, cat_id, product_id и т.д.), то их следует добавить в объект пагинации в методе display() вашего View.

<?php
use Joomla\CMS\Factory;

\defined('_JEXEC') or die;

public function display($tpl = null)
{

     $app = Factory::getApplication();
     $this->pagination = $this->get('Pagination');

     // Flag indicates to not add limitstart=0 to URL
     $this->pagination->hideEmptyLimitstart = true;

     // Add additional parameters to pagination url
     $queryParameterList = [
               'catid'      => 'int',
               'project_id' => 'int',
               'language'   => 'string',
     ];

     foreach ($queryParameterList as $parameter => $filter)
     {
          $value = $app->getInput()->get($parameter, null, $filter);

          if (is_null($value))
               {
                    continue;
               }

          $this->pagination->setAdditionalUrlParam($parameter, $value);
     }
  
   // Остальное содержимое метода
}

Обратите внимание, что для каждого параметра нужно указать тип фильтра (официальная документация Joomla Input — Introduction): int, string, cmd, word и т.д.

Также примеры для com_finder и com_content на GitHub

Полезные ресурсы

Ресурсы сообщества:

Telegram:

Комментарии (17)


  1. proneta
    18.09.2024 10:45

    Как можно разбираться в IT, и полностью игнорировать школьное обучение ? G перед Е, I, Y читается как Ж. Все с ума посходили с этой пагинацией. Даже у Ламбы там стоит Н , т.е. Ферруччо подсказывает как правильно читать даже тем, у кого ее никогда не будет :)

    При этом "пагинаторы" признаются в том, не слышали сразу 2 языка, и французский тоже


    1. sergeytolkachyov Автор
      18.09.2024 10:45

      Боюсь, если я буду писать о "паджинации" или "пейджинации" - это будет резать ухо абсолютно всем.


      1. proneta
        18.09.2024 10:45

        Резать ухо это будет только тем, кто уже деформирован этим общим заблуждением. В русском таких коверканий англицизмов еще много, очень. Вы все их знаете :). Даже с русского на русский , и то сложно (обезбАлы, растамАжи, ....) . И тут не работают правила по корневым гласным. Это такой самодельный Новояз, для ушей в трубочку. Чего уже тут про другие языки.

        Но так извращать несчастные 4 буквы "page", даже стыдно этих людей относить к образованным русским. Вот и моя цитата:

        Есть несколько правил чтения буквы «g»:

        Как [г] перед гласными a, o, u – gas, gold, gun;

        Как [г] перед любой согласной – green, glass;

        Как [г] в конце слова – big, strong;

        Как [дж] перед e, i, y – page, giant, gym;

        В словах французского происхождения как [ж] – garage, massage, genre;


        1. FanatPHP
          18.09.2024 10:45
          +1

          Можно я задам вам один вопрос? С чего вы взяли, что конкретно это - англицизм? И "новое слово" с форумов программистов?


          1. proneta
            18.09.2024 10:45

            расслабьтесь, я уже нашел первую ссылку в гугле на латынь. Оказывается, это оттуда, о первопечатника Федорова.

            Т.е. все языки программирования берут за источник английский. Но русские усмотрели здесь не "пейджинация", и не "пейджинг", а именно латынь. Эти 2 варианта тоже можно встретить, их ставят рядом с "пагинацией".
            @FanatPHP , еще знаете примеры латыни или еще каких языков , кроме английского ? Блесните. Интересно.


            1. FanatPHP
              18.09.2024 10:45
              +1

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


              1. proneta
                18.09.2024 10:45

                Нет, не сливайтесь. Я задал вопрос лично Вам. 99,9999% терминов в программировании основаны на английском. Также есть 2 равнозначных английских термина про эти страницы. Автор в своём коде использует английскую "page" , И тут оба ! Единственный случай латыни. "Пейджинг" , который тоже существует, нам не подходит, "solum Latin" !

                И конечно, вы перед своим 1 постом гугл не трогали, верю. Вот и расскажите о своих познаниях латыни: как часто вы ее используете в работе ? Теперь вы в роли учителя. Начинайте ваш латинский трактат.


                1. FanatPHP
                  18.09.2024 10:45

                  Как и положено резонёру, вы очень узко мыслите. А как все невежды, используете вместо фактов свою фантазию. Например, воображаете, будто пагинация имеет какое-то отношение к программированию. Или что термин появился в языке "из форумов программистов". Но это, увы, не совсем так. Пагинация - это прикладная задача, которую решают программисты. Такая же, как например совершение покупки в магазине. Магазины и совершение покупок существовали задолго до появления компьютеров. Не программисты придумали эти понятия. Они просто используют готовые, n'est-ce pa? То же самое и с пагинацией. Это не алгоритм, не синтаксическая конструкция, не парадигма разработки. Сама по себе она программистам не нужна, им нет до неё никакого дела. Пагинация существовала задолго до их рождения. Поэтому выдумывать термин для неё программистам совершенно без надобности.

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


                  1. proneta
                    18.09.2024 10:45

                    я уже устал тут анализировать ваши отклонения : то вы мне указываете не переходить на личности, но мне уже навешали и резонера, и узколобого

                    Придется поверить, что мне, с базовым школьным образованием французского, видны ваши древние воспоминания о нем -- n'est-ce pa -- пишется не так :). Ошибка. Похоже , это Вы не сдали домашку много лет назад :). Ну понятно, вы же больше по латыни.

                    Что за свалка в ваших текстах ? Разделение на страницы и покупки в магазине ???

                    А вот последний абзац, подробнее. Здесь зумеров не много. Какое современное политическое значение имеет для пейджинга имеет выбор автора ? Никак вы про импортозамещение :) ? Уверяю вас, Президент говорил у другом, Россию латынью вы не поднимете.

                    Вы заставляете меня повторятся. Хорошо.

                    "Page" английский , "Pagination" (транскрипция Гугл для русских -- с английского). Но "Pagination" для русских -- с латыни !

                    Я привел достаточно примеров, что это , мягко говоря, необдуманное следование моде -- использовать ОДИН термин из мертвого языка, а все остальное из другого. Сергей, автор, и не отрицает, что латынь -- не его тема, так же и не этой статьи.

                    Вы так старательно обходите мое приглашение продолжить ваши лекции, что даже стыдно за вас -- начали вы как инструктор Ватикана, и тут же и закончили парадигмой разработки ... Так мы о парадигме или о магазине ? Или простом разделении на страницы ?

                    Мне действительно интересно, где еще можно встретить латынь. Я сам нашел первоисточник , но Вы меня перебили.

                    Вы сами назвали себя инструктором, продолжите. Еще латынь в тему статьи.


                    1. proneta
                      18.09.2024 10:45

                      Сергей, как автор статьи, сам привел в пример первоисточник. Я просто обязан ориентироваться на его.  "Pagination"  -- это НЕ ЛАТЫНЬ. Автор взял английский, не перевел , а просто привязал другой термин. А теперь обиды по всему Хабру. И инструкторы подплыли в ожидании легкой добычи.

                      Коллеги, разберитесь сначала у себя в голове.


                    1. sergeytolkachyov Автор
                      18.09.2024 10:45

                      По Вашей же ссылке...

                      Сергей как автор статьи старается использовать лексику, которую поймут его коллеги. А откуда есть пошëл термин "пагинация" в контексте данной статьи, да и, думаю, Хабра в целом - не важно. Предлагаю закончить на этом обсуждение не по теме статьи.


      1. proneta
        18.09.2024 10:45

        Отличный пример извращения русского слова, которое должно быть максимально близко к оригиналу. Нижняя транскрипция это и показывает.

        Очевидно, что это новое слово. Изначально переводчик гугла сформирован на основе древних словарей из 80-х. А дальше гугл обучался сам. И эту "пагинацию" он нашел на форумах программистов, которые просто забыли школу, вычеркнули ее из своей оперативы.

        Не думаю, что кто-то ручками вносил ее в словарь.

        Это еще отличный пример, когда скоро нейросети начнут собирать мусор и продвигать его как первоисточник.

        И вторая "а" доказывает, что это скорее относится к анекдотичному извращению слова. Кто-то прикололся, и понеслась пагинация по словорям....