Как изменить пагинацию в Joomla 1.5

Как изменить пагинацию в Joomla 1.5, 4.6 из 5 основанный на 14 голосах.

Не знаю как Вам, но меня с первого знакомства с CMS Joomla удивляла убогость класса пагинации Joomla JPagination. Но не будем кидать упреков в адрес разработчиков этой замечательной системы управления контентом. Они нам предоставили замечательный конструктор, а что из него «свинтить» и как, дело нас самих. Тем более, разработчики сделали для нас «отмычку» в классе Joomla JPagination.



Что конкретно мне не нравится в пагинации Joomla и что я в нем хотел изменить

Словами описывать долго, лучше разок увидеть, покажу на примере. Взгляните как выглядит стандартная пагинация

Пагинация в joomla 1.5

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

Стилизованная пагинация в joomla 1.5

Недостатки найденных решений пагинации для Joomla

Как-то на досуге я поглядел, какие идеи на сей счет есть у других. Оказалось есть. Есть даже модуль и плагин пагинации для Joomla. Разобравшись в статьях подробнее, выяснились недостатки всех предложенных решений. Многие статей о пагинации Joomla предлагают какие-то хаки – залезьте в сырцы класса JPagination, исправьте и вставьте строки. Но что будет, если Вы вдруг решите заменить версию движка? Опять искать заветные строки? Не хочу плохо отзываться об авторах этих статей, тем более они дали пищу для размышлений. Пусть это будет их правильное решение. Что касается модулей и плагинов пагинации – каждый из них отъедает дополнительные ресурсы, ведь каждая Ваша статья проходит обработку этим плагином или модулем.


Что нам позволяет класс пагинации для Joomla JPagination

Класс пагинации Joomla находится в файле JOOMLA_ROOT/libraries/joomla/html/pagination.php. При его изучении выяснилось, что методы getPagesLinks() и getListFooter() могут работать с переопределенными обработчиками, которые переопределяются в директории используемого шаблона, а именно, JOOMLA_ROOT/templates/шаблон/html/pagination.php. Если в Вашем шаблоне этой директории с файлом нет, будьте добры, скопируйте их из шаблона rhuk_milkyway, он входит в стандартную поставку CMS Joomla. В этом файле находятся функции-обработчики:

  • pagination_list_footer - показ выпадающего списка числа материалов для метода getListFooter();
  • pagination_list_render – построение списка пагинатора для метода getPagesLinks();
  • pagination_item_active – представление активного пункта (ссылки на страницы, на которые может быть осуществлен переход);
  • pagination_item_inactive – представление неактивного пункта (номер просматриваемой страницы).
В последних версиях шаблонов вид пагинации может переопределяться и в файле JOOMLA_ROOT/templates/ВАШ_ШАБЛОН/warp/systems/joomla/layouts/pagination.php, учтите это обстоятельство.

Переопределение пагинации в Joomla

Сразу оговорюсь – я делал пагинацию для вполне определенного проекта, в нем использовался вывод только методом getPagesLinks(), все изменения производились соответственно только в функции pagination_list_render. Метод getListFooter() и функцию pagination_list_footer я оставил неизменными, Вы можете либо вернуть пустую строку при возврате из функции, если не хотите его видеть на страницах сайта, или изменить ее по своему желанию.

Функции pagination_item_active и pagination_item_inactive также были оставлены без изменений, хотя часть рутины можно было достигнуть их изменением.

Вот и добрались до функции построения списка пагинатора для метода getPagesLinks(), комментировать ее я не буду, кто знает PHP, тот поймет, кто не поймет – просто скопирует.

function pagination_list_render($list)
{
        $html  = "<span class=\"pagination\">";
        if ( strpos( $list['start']['data'], '<a' ) !== false ) {
                $begin  = strpos( $list['start']['data'], 'href="' );
                $begin += strlen( 'href="' );
                $end    = strpos( $list['start']['data'], '"', $begin );
                $link   = substr( $list['start']['data'], $begin, $end - $begin );
                $title  = 'В начало';
                $html .= '<a href="'.$link.'" title="'.$title.'"><img src="/files/pagination/page-start.png" /></a>';
                $begin  = strpos( $list['previous']['data'], 'href="' );
                $begin += strlen( 'href="' );
                $end    = strpos( $list['previous']['data'], '"', $begin );
                $link   = substr( $list['previous']['data'], $begin, $end - $begin );
                $title  = 'Предыдущая';
                $html .= '<a href="'.$link.'" title="'.$title.'"><img src="/files/pagination/page-previous.png" /></a>';
        } else {
                $html .= '<img src="/files/pagination/page-start.png" />';
                $html .= '<img src="/files/pagination/page-previous.png" />';
        }
        foreach( $list['pages'] as $page )
        {
                if($page['data']['active']) {
                        $html .= '<strong>';
                }

                $html .= $page['data'];

                if($page['data']['active']) {
                        $html .= '</strong>';
                }
        }

        if ( strpos( $list['end']['data'], '<a' ) !== false ) {
                $begin  = strpos( $list['next']['data'], 'href="' );
                $begin += strlen( 'href="' );
                $end    = strpos( $list['next']['data'], '"', $begin );
                $link   = substr( $list['next']['data'], $begin, $end - $begin );
                $title  = 'Следующая';
                $html .= '<a href="'.$link.'" title="'.$title.'"><img src="/files/pagination/page-next.png" /></a>';
                $begin  = strpos( $list['end']['data'], 'href="' );
                $begin += strlen( 'href="' );
                $end    = strpos( $list['end']['data'], '"', $begin );
                $link   = substr( $list['end']['data'], $begin, $end - $begin );
                $title  = 'В конец';
                $html .= '<a href="'.$link.'" title="'.$title.'"><img src="/files/pagination/page-last.png" /></a>';
        } else {
                $html .= '<img src="/files/pagination/page-next.png" />';
                $html .= '<img src="/files/pagination/page-last.png" />';
        }

        $html .= "</span>";

        return $html;
}

В заключении необходимо выложить еще и файлы с картинками «В начало», «Предыдущая» и т.д. Лично я их положил в директорию JOOMLA_ROOT/files/pagination, вы вправе изменить расположение этих файлов по своему усмотрению.


Как вывести ссылки более чем на 10 страниц

В файле JOOMLA_ROOT/libraries/joomla/html/pagination.php находите строку:
// Set the pagination iteration loop values
$displayedPages = 10;

Вставляете нужное вам значение.


Как вывести все записи без разбиения на страницы

Установить значение limit=0. Как пример: http://e-kzn.ru/index.php?limit=0&limitstart=0.


Пагинация с последней страницы

или ответ на вопрос портала г.Павловска
Посмотрите на этот файл JOOMLA_ROOT/libraries/joomla/html/pagination.php В функции function _buildDataObject() найдите строки
for ($i = $this->get('pages.start'); $i <= $stop; $i ++)
{
	$offset = ($i -1) * $this->limit;

	$offset = $offset == 0 ? '' : $offset;  //set the empty for removal from route

	$data->pages[$i] = new JPaginationObject($i);
	if ($i != $this->get('pages.current') || $this->_viewall)
	{
		$data->pages[$i]->base	= $offset;
		$data->pages[$i]->link	= JRoute::_("&limitstart=".$offset);
	}
}
Замените условие цикла на for ($i = $stop; $i >= $this->get('pages.start'); $i --)

Ссылки будут изменены ... 3 2 1 ..., но "В начало", "В конец", "Предыдущая", "Следующая" будут уже не в тех сторонах, а активной - первая.

JOOMLA_ROOT/libraries/joomla/html/pagination.php придется изменить, скорректируйте ссылки "В начало", "В конец", "Предыдущая", "Следующая".
function pagination_list_render( $list )
{
	$html  = "<span class=\"pagination\">";

	if ( strpos( $list['end']['data'], '<a' ) !== false ) {
		$begin  = strpos( $list['end']['data'], 'href="' );
		$begin += strlen( 'href="' );
		$end    = strpos( $list['end']['data'], '"', $begin );
		$link   = substr( $list['end']['data'], $begin, $end - $begin );
		$title  = 'В конец';
		$html .= '<a href="'.$link.'" title="'.$title.'"><img src="/files/pagination/page-start.png" /></a>';

		$begin  = strpos( $list['next']['data'], 'href="' );
		$begin += strlen( 'href="' );
		$end    = strpos( $list['next']['data'], '"', $begin );
		$link   = substr( $list['next']['data'], $begin, $end - $begin );
		$title  = 'Следующая';
		$html .= '<a href="'.$link.'" title="'.$title.'"><img src="/files/pagination/page-previous.png" /></a>';
	} else {
		$html .= '<img src="/files/pagination/page-start.png" />';
		$html .= '<img src="/files/pagination/page-previous.png" />';
	}


	foreach( $list['pages'] as $page )
	{
		if($page['data']['active']) {
			$html .= '<strong>';
		}

		$html .= $page['data'];

		if($page['data']['active']) {
			$html .= '</strong>';
		}
	}

	if ( strpos( $list['start']['data'], '<a' ) !== false ) {
		$begin  = strpos( $list['previous']['data'], 'href="' );
		$begin += strlen( 'href="' );
		$end    = strpos( $list['previous']['data'], '"', $begin );
		$link   = substr( $list['previous']['data'], $begin, $end - $begin );
		$title  = 'Предыдущая';
		$html .= '<a href="'.$link.'" title="'.$title.'"><img src="/files/pagination/page-next.png" /></a>';
		$begin  = strpos( $list['start']['data'], 'href="' );
		$begin += strlen( 'href="' );
		$end    = strpos( $list['start']['data'], '"', $begin );
		$link   = substr( $list['start']['data'], $begin, $end - $begin );
		$title  = 'В начало';
		$html .= '<a href="'.$link.'" title="'.$title.'"><img src="/files/pagination/page-last.png" /></a>';
	} else {
		$html .= '<img src="/files/pagination/page-next.png" />';
		$html .= '<img src="/files/pagination/page-last.png" />';
	}


	$html .= "</span>";

	return $html;
}
Но тут засада.
Ссылка на первую http://e-kzn.ru/index.php?option=com_mycomponent&controller=page
Ссылка на вторую http://e-kzn.ru/index.php?option=com_mycomponent&controller=page&limitstart=100

Как видно, в первом случае нет параметра limitstart, по умолчанию он равен 0.
Необходимо сделать реврайт http://e-kzn.ru/index.php на http://e-kzn.ru/index.php?start=1000000, таким может быть решение вашей задачи пагинации начиная с последней страницы.

Скачать файлы переопределения пагинации в Joomla

Все пути к директориям в статье даны относительно корневой папки сайта!

файлы пагинации

Если эта статья показалась вам полезной, пожалуйста, проголосуйте за нее. Это поможет другим быстрее найти эту статью из множества других менее полезных.
( 14 Голосов ) 

Комментарии   

 
# Сергей 04.04.2013 15:35
Здравствуйте!
Спасибо большое за полезный материал, очень пригодилась изложенная информация и прикрепленные файлы.
Ответить | Ответить с цитатой | Цитировать
 
 
# Ivan 19.04.2013 23:27
Очень полезная статья, спасибо!
Ответить | Ответить с цитатой | Цитировать
 
 
# Алексей 24.04.2013 18:52
А как узнать в шаблоне что идет пагинация?. Мне надо показывать текст только на начальной странице, когда пошла погинация - не показывать его
Ответить | Ответить с цитатой | Цитировать
 
 
# Ковенко В.Б. 25.04.2013 11:25
1 Вызвать экземпляр класса
2 Прочитать сколько всего страниц в $this->total и если более одной, то пагинация есть.
3 Прочитать $this->limitstart и если значение ноль, то это самая первая страница.
4 Если это первая страница, написать ваш текст.
5 Этот фрагмент кода вставить в макет страницы, блога или чего вам надо. Но если вы не знаете как реализовать предыдущие четыре пункта, то с этим разобраться будет намного сложнее.
Ответить | Ответить с цитатой | Цитировать
 
 
# Oleg 18.05.2013 05:09
В топку как можешь давать полуфабрикат? А где css файлы.
Ответить | Ответить с цитатой | Цитировать
 
 
# Ковенко В.Б. 24.05.2013 09:43
Это статья, в ней рассказано о том, как сделать, а не готовый модуль.
CSS - зачем? Папку files из архива в корневую директорию забросьте и все заработает. В коде явным образом написано где картинки искать src="/files/pagination/page-last.png". Не нравятся мои картинки, нарисуйте свои и замените ими мои. Не нравится путь указанный мною, положите куда сочтете нужным и подправьте приведенный код.
Ответить | Ответить с цитатой | Цитировать
 
 
# Владимир 05.06.2013 08:48
Спасибо за материал. Только есть один вопрос, сделал все как у вас описано и вроде бы заработало. Только вокруг номеров страниц нет рамки как в примере в начале страницы. Что нужно сделать, чтобы она появилась?
Ответить | Ответить с цитатой | Цитировать
 
 
# Ковенко В.Б. 05.06.2013 18:18
Изначально рамка была потому, что фон у картинок был непрозрачным. Кому-то это не понравилось (комментарий был на старой версии Joomla 1.5, я все комментарии удалил), меня просили сделать его прозрачным. По многочисленным просьбам я это сделал. Вы можете открыть нужные картинки в Paint и сохранить, он не умеет делать прозрачный фон. Вы как раз получите то, что у меня представлено на картинке в самом начале. А может дорисуете то, что сочтете нужным.
Ответить | Ответить с цитатой | Цитировать
 
 
# Коля 11.06.2013 16:03
Здравствуйте. У меня странная ситуация - нужно удалить лишь стрелки. Я их удаляю в pagenavigation.php, однако они на месте. Кеш чистил. Подскажите, что я не так делаю?
Ответить | Ответить с цитатой | Цитировать
 
 
# Ковенко В.Б. 12.06.2013 13:10
Пришлите файл вами измененный и путь до этого файла
Ответить | Ответить с цитатой | Цитировать
 
 
# Коля 12.06.2013 16:49
все, спасибо, разобрался сам. Править нужно не pagenavigation. php, а pagination.php. Вот так.
Ответить | Ответить с цитатой | Цитировать
 
 
# Anton 14.07.2013 18:45
Подскажите как поправить. Все страницы в одну строчку, если страниц много, они вылазят за рамки шаблона. Как сделать, чтобы страницы размещались в несколько строк?
Ответить | Ответить с цитатой | Цитировать
 
 
# Ковенко В.Б. 16.07.2013 12:14
В цикл foreach( $list['pages'] as $page ) вставить второй цикл с количеством элементов выводимых в строку.
Ответить | Ответить с цитатой | Цитировать
 
 
# Anton 20.07.2013 01:24
Простите, я не программист и не умею вставлять циклы.
Я думаю,многие, кто скачивает готовое решение далеки от того, чтобы что-то куда-то вставлять в программный код. Поэтому, если не трудно, объясните на пальцах.
Мне нужно, чтобы в строчке было по 15 страниц.
Я нахожу цикл foreach( $list['pages'] as $page )
Что нужно вставить после этой строчки? Или, другими словами, как написать второй цикл?
Ответить | Ответить с цитатой | Цитировать
 
 
# Ковенко В.Б. 22.07.2013 12:59
$i = 0;
foreach( $list['pages'] as $page )
{
$i++;
if (!($i%16)) $html .= '<br />'; /*16 - на единицу больше чем необходимо вывести*/
/*Все что тут уже есть до изменений*/
}
Ответить | Ответить с цитатой | Цитировать
 
 
# Anton 14.07.2013 18:47
И еще лог ошибок все время пишет [14-Jul-2013 17:14:31 Europe/Kiev] PHP Warning: Division by zero in .../public_html/libraries/joomla/html/pagination.php on line 97
Ответить | Ответить с цитатой | Цитировать
 
 
# Ковенко В.Б. 16.07.2013 12:06
Деление на ноль, в файл .htaccess добавьте строчку php_flag display_errors off, или проверяйте знаменатель перед делением, если ноль - не делите.
Ответить | Ответить с цитатой | Цитировать
 
 
# Дарья 07.08.2013 13:03
добрый день) у меня возникла проблема. нужно, чтобы все записи выводились без разбиения на страницы. выше написано, что нужно limit=0. подскажите пожалуйста, где это нужно поправить. у меня joomla 1.5.26. pagination.php вроде лежит, в libraries/joomla/html, но как бы я не правила этот файл получается следующее - пагинация для страниц не выводится, но результатов на странице остается все равно 20, даже если их 50. в админке же все нормально. если лимит поставить, например, равным общему количеству записей, то выводится только одна страница и на ней все записи, как мне и нужно.
Ответить | Ответить с цитатой | Цитировать
 
 
# Ковенко В.Б. 08.08.2013 20:12
Получается что используется переопределение в вашем шаблоне JOOMLA_ROOT/templates/шаблон/html/pagination.php
Ответить | Ответить с цитатой | Цитировать
 
 
# ilianna.ru 25.08.2013 19:37
хотелось бы изменить еще и формирование ссылок!
Ответить | Ответить с цитатой | Цитировать
 
 
# Ковенко В.Б. 26.08.2013 09:19
Не понял что это значит.
Ответить | Ответить с цитатой | Цитировать
 
 
# Lacmus 04.12.2013 18:33
Да хоть обос... ты, ни... не знаешь что такое регулярки.... вообще все решение через ж.... копипастер ср...
Ответить | Ответить с цитатой | Цитировать
 
 
# Ковенко В.Б. 10.12.2013 21:59
1 Здесь нет регулярок.
2 На отличное знание регулярок не претендую.
3 Решение именно то, что просили когда-то давно пользователи, значит оно востребовано.
4 Копипастер говоришь? Я лично видел копипаст именно этой статьи до буквы с обратной ссылкой на эту страницу. Можете погуглить фрагмент статьи, найдете.
5 Уж больно много брани и ни одного конкретного свидетельства.
6 По поводу левого мыла в комментарии - я не принуждаю заполнять поле e-mail в обязательном порядке, видимо вы по диагонали читаете.

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

Это сообщение, выраженное в виде матершины, было отправлено с IP адреса ООО "Аверт Медиа" _http://www.avertmedia.ru.
Москва, ул. Лесная, д. 30, 2-й этаж
Сфера деятельности компании: Контекстная реклама, продвижение сайта, SMO
Ответить | Ответить с цитатой | Цитировать
 

Добавить комментарий

Уважаемые посетители!
Комментарии модерируются, активные ссылки на сайты не публикуются. Пожалуйста, не тратьте понапрасну свое и мое время на попытку размещения спамерских ссылок.
Спасибо.


Защитный код
Обновить