Прежде чем перейти к статье, хочу вам представить, экономическую онлайн игру Brave Knights, в которой вы можете играть и зарабатывать. Регистируйтесь, играйте и зарабатывайте!
Это информация о возможном сломе обратной совместимости в классе 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
Полезные ресурсы
Ресурсы сообщества:
форум русской поддержки Joomla.
интернет-портал Joomla-сообщества.
https://vc.ru/s/1146097-joomla - Сообщество Joomla на VC.
Telegram:
Чат сообщества «Joomla! по-русски».
Joomla для профессионалов, разработчики Joomla.
Новости о Joomla! и веб-разработке по-русски.
Англоязычный чат сообщества.
Новости Joomla! по-английски