Поиск по сайту

Погода в Казани

Погода на
Вс 20.05.2012

Погода на
утро

  • 87%
  • 20
    24
  • 763-765
  • Ю-З
    1-3 м/с
  • 50-52

Погода на
день

  • 90%
  • 25
    27
  • 762-764
  • Ю-З
    2-4 м/с
  • 37-39

Погода на
вечер

  • 88%
  • 19
    23
  • 761-763
  • Ю
    1-3 м/с
  • 64-66

Погода на
ночь

  • 91%
  • 14
    17
  • 761-763
  • Ю
    1-3 м/с
  • 74-76

Курс валют

USD
1
USD
31,392 0,450
EUR
1
EUR
39,752 0,360
Дата: 19.05.2012
Источник: ЦБ РФ

Регистрация



Как изменить пагинацию в joomla 1.5, 4.6 out of 5 based on 5 votes
Как изменить пагинацию в joomla 1.5
( 5 Голосов )
31.07.11 11:52


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

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



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

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

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

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

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


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

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



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

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

  • pagination_list_footer - показ выпадающего списка числа материалов для метода getListFooter();
  • pagination_list_render – построение списка пагинатора для метода getPagesLinks();
  • pagination_item_active – представление активного пункта (ссылки на страницы, на которые может быть осуществлен переход);
  • pagination_item_inactive – представление неактивного пункта (номер просматриваемой страницы).


Переопределение пагинации в 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;
}

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



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

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

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

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

или ответ на вопрос портала г.Павловска
Посмотрите на этто файл 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 ..., но "В начало", "В конец", "Предыдущая", "Следующая" будут уже не в тех сторонах, а активной - первая.

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. Аналогично и у вас start=0.
Если сделать реврайт ripp.ru/index.php на ripp.ru/index.php?start=1000000, это будет решением вашей задачи?

 

Комментарии  

 
# Павлово 26.10.2011 23:01
Хотел бы для своего городского сайта http://ripp.ru сделать обратную пагинацию, то есть 1 2 3 4 , а наоборот чтобы было: 4 3 2 1 , так ведь логичнее для seo? не правдали? есть ли решения?
Ответить | Ответить с цитатой | Цитировать
 
 
# Administrator 13.11.2011 20:19
Для новостных порталов и т.п. - соглашусь с доводами.
Но, скорее всего, это надо решать средствами порядка (ordering).
Как это предлагаете вы - надо лезть в движок, не в моих правилах, но все же я дополнил статью, прочтите.
Ответить | Ответить с цитатой | Цитировать
 
 
# Денис 09.01.2012 21:28
Подскажите,а как добавить кнопку "Все" которая будет отображать все материалы на странице
Ответить | Ответить с цитатой | Цитировать
 
 
# Administrator 10.01.2012 08:27
Цитирую Денис:
Подскажите,а как добавить кнопку "Все" которая будет отображать все материалы на странице

Вывод статей без разбиения на страницы
Установить limit=0. Как пример:
_http://e-kzn.ru/index.php?limit=0&limitstart=0
Ответить | Ответить с цитатой | Цитировать
 
 
# Александр 17.01.2012 18:05
В коде не прописали фон для ссылок 1 2 3
Ответить | Ответить с цитатой | Цитировать
 
 
# Administrator 19.01.2012 08:12
Цитирую Александр:
В коде не прописали фон для ссылок 1 2 3

Да, я не спец по части рисования. В паинтбраше прозрачный фон нет возможности сделать.
Ответить | Ответить с цитатой | Цитировать
 
 
# Александр 19.01.2012 14:39
Ну так в архиве есть же фон. И зачем прозрачный? Нужно было page.png подставить
Ответить | Ответить с цитатой | Цитировать
 
 
# Administrator 19.01.2012 20:06
Цитирую Александр:
Ну так в архиве есть же фон. И зачем прозрачный? Нужно было page.png подставить

Прозрачный - чтобы не на шаблон любого цвета натянуть и не править. Кто поможет, буду признателен.
Ответить | Ответить с цитатой | Цитировать
 
 
# Ivanovich 01.02.2012 00:33
Прекрастная статья, сразу видно автор разбирается очем пишет.
Уважаемый администратор, подскажите пожалуйста, если знаете, как сделать секретный раздел на Joomla 1.5.22 сайте.Чтобы в секретный раздел могли попадать только подписчики на рассылку по предоставленном у коду.Пытался сделать по уроку Е.Попова, но у него там пример приводиться на рнр сайте, а не на Joomla и обращение идет к БД в Mayadvin.А как это сделать на Joomlaи в каких файлах- пробовал ничего не вышло.Для меня файловая система Joomla-лес дремучий.Облазил почти весь рунет ничего подобного не нашел.Из-за этого вся работа встала. Люди добрые,кто знает помогите.
Ответить | Ответить с цитатой | Цитировать
 
 
# Administrator 01.02.2012 07:32
Цитирую Ivanovich:
Прекрастная статья, сразу видно автор разбирается очем пишет.
Уважаемый администратор, подскажите пожалуйста, если знаете, как сделать секретный раздел на Joomla 1.5.22 сайте.Чтобы в секретный раздел могли попадать только подписчики на рассылку по предоставленном у коду.Пытался сделать по уроку Е.Попова, но у него там пример приводиться на рнр сайте, а не на Joomla и обращение идет к БД в Mayadvin.А как это сделать на Joomlaи в каких файлах- пробовал ничего не вышло.Для меня файловая система Joomla-лес дремучий.Облазил почти весь рунет ничего подобного не нашел.Из-за этого вся работа встала. Люди добрые,кто знает помогите.


Где можно посмотреть этот урок?
Ответить | Ответить с цитатой | Цитировать
 
 
# Дмитрий 07.04.2012 22:27
подскажите как на джумле 1,1,15 сделать пагинацию от начала и до конца, не просто 1 2 3 4 а все полностью номера страниц от начала до последней. Хочу что бы было как на ДЛЕ
Ответить | Ответить с цитатой | Цитировать
 
 
# Administrator 09.04.2012 09:36
libraries/joomla/html/pagination.php
находите строку

// Set the pagination iteration loop values
$displayedPages = 10;

Вставляете нужное значение
Ответить | Ответить с цитатой | Цитировать
 

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


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