Постраничность в убывающем порядке

Всем привет.

Кто ни будь задавался вопросом, как реализовать постраничность в убывающем порядке? Чтобы страницы шли не по возрастанию (1, 2, 3, 4,...,500), а по убыванию (500, 499, 498, 497,...,1).

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

Также интересует, если получится это реализовать, как внедрить новый тип пагинации в отдельный плагин, либо сделать её отдельными плагином, чтобы при помощи него, пагинацию можно было наследовать в других плагинах, не внося изменений в файл движка Viewer.class.php, дабы не усложнять себе жизнь при будущем обновлении.

Вот код из \engine\modules\viewer\Viewer.class.php:
	/**
	 * Формирует постраничный вывод
	 *
	 * @param int $iCount	Общее количество элементов
	 * @param int $iCurrentPage	Текущая страница
	 * @param int $iCountPerPage	Количество элементов на одну страницу
	 * @param int $iCountPageLine	Количество ссылок на другие страницы
	 * @param string $sBaseUrl	Базовый URL, к нему будет добавлять постикс /pageN/  и GET параметры
	 * @param array $aGetParamsList	Список GET параметров, которые необходимо передавать при постраничном переходе
	 * @return array
	 */
	public function MakePaging($iCount,$iCurrentPage,$iCountPerPage,$iCountPageLine,$sBaseUrl,$aGetParamsList=array()) {
		if ($iCount==0) {
			return false;
		}

		$iCountPage=ceil($iCount/$iCountPerPage);
		if (!preg_match("/^[1-9]\d*$/i",$iCurrentPage)) {
			$iCurrentPage=1;
		}
		if ($iCurrentPage>$iCountPage) {
			$iCurrentPage=$iCountPage;
		}

		$aPagesLeft=array();
		$iTemp=$iCurrentPage-$iCountPageLine;
		$iTemp = $iTemp<1 ? 1 : $iTemp;
		for ($i=$iTemp;$i<$iCurrentPage;$i++) {
			$aPagesLeft[]=$i;
		}

		$aPagesRight=array();
		for ($i=$iCurrentPage+1;$i<=$iCurrentPage+$iCountPageLine and $i<=$iCountPage;$i++) {
			$aPagesRight[]=$i;
		}

		$iNextPage = $iCurrentPage<$iCountPage ? $iCurrentPage+1 : false;
		$iPrevPage = $iCurrentPage>1 ? $iCurrentPage-1 : false;

		$sGetParams='';
		if (is_string($aGetParamsList) or count($aGetParamsList)){
			$sGetParams='?'.(is_array($aGetParamsList) ? http_build_query($aGetParamsList,'','&') : $aGetParamsList);
		}
		$aPaging=array(
			'aPagesLeft' => $aPagesLeft,
			'aPagesRight' => $aPagesRight,
			'iCount' => $iCount,
			'iCountPage' => $iCountPage,
			'iCurrentPage' => $iCurrentPage,
			'iNextPage' => $iNextPage,
			'iPrevPage' => $iPrevPage,
			'sBaseUrl' => rtrim($this->Tools_Urlspecialchars($sBaseUrl),'/'),
			'sGetParams' => $sGetParams,
		);
		/**
		 * Избавляемся от дублирования страниц с page=1
		 */
		if ($aPaging['iCurrentPage']==1) {
			$this->SetHtmlCanonical($aPaging['sBaseUrl'].'/'.$aPaging['sGetParams']);
		}
		return $aPaging;
	}

5 комментариев

avatar
$config['module']['comment']['nested_page_reverse'] = 0; 	// Определяет порядок вывода страниц. true - последние комментарии на первой странице, false - последние комментарии на последней странице

Это не оно?
avatar
или вы хотите вообще всю пагинацию так сделать?
avatar
Я хочу, чтобы в любом плагине, где используется постраничность или в родных экшенах с использованием постраничности, я мог изменить допустим это:
$aPaging=$this->Viewer_MakePaging($aResult['count'],$iPage,Config::Get('module.topic.per_page'),Config::Get('pagination.pages.count'),Router::GetPath('index').'top',array('period'=>$sPeriod));

на это:
$aPaging=$this->Viewer_MakePagingReverse($aResult['count'],$iPage,Config::Get('module.topic.per_page'),Config::Get('pagination.pages.count'),Router::GetPath('index').'top',array('period'=>$sPeriod));

И постраничность сменилась на убывающую.
avatar
Недостаточно одного метода формирования во вьювере.
Еще нужен другой шаблон.
Смотрите https://github.com/livestreet/livestreet/blob/master/application/frontend/skin/synio/comments/comment_pagination.tpl. Там два варианта шаблона для простой и инвертированной пагинации.
А вообще, цитируя тот же функционал, это делается просто:
$aPaging=$this->Viewer_MakePaging($aReturn['count'],$iPage,Config::Get('module.comment.nested_per_page'),Config::Get('pagination.pages.count'),'');
if (!Config::Get('module.comment.nested_page_reverse') and $aPaging) {
    // переворачиваем страницы в обратном порядке		
    $aPaging['aPagesLeft']=array_reverse($aPaging['aPagesLeft']);
    $aPaging['aPagesRight']=array_reverse($aPaging['aPagesRight']);
}
avatar
Как вариант, MakePagingReverse добавить в конец Viewer и оформить ввиде патча vcs. Тогда на новые версии можно просто накладывать патчи и обойтись без плагинов.
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.