Наверх

Реализуем пагинацию без GET-параметров в URL

Иногда требуется, чтобы ссылки постраничной навигации выглядели как-то так:
http://site.ru/articles/2.html
http://site.ru/articles/3.html
http://site.ru/articles/4.html

MODX с такой задачей справляется довольно легко.

Необходимо только поправить ссылки в сниппете, например, pdoPage:
&tplPage=`@INLINE <li><a href="[[~[[*id]]]][[+pageNo]].html">[[+pageNo]]</a></li>`
&tplPageActive=`@INLINE <li class="active"><a href="[[~[[*id]]]][[+pageNo]].html">[[+pageNo]]</a></li>`
&tplPageFirst=`@INLINE <li class="control"><a href="[[~[[*id]]]][[+pageNo]].html">Первая</a></li>`
&tplPageLast=`@INLINE <li class="control"><a href="[[~[[*id]]]][[+pageNo]].html">Последняя</a></li>`
&tplPagePrev=`@INLINE <li class="control"><a href="[[~[[*id]]]][[+pageNo]].html">«</a></li>`
&tplPageNext=`@INLINE <li class="control"><a href="[[~[[*id]]]][[+pageNo]].html">»</a></li>`

И создать плагин, указав события OnPageNotFound и OnHandleRequest:
<?php
if ($modx->context->key == 'mgr') return '';
switch($modx->event->name) {
    case 'OnHandleRequest':
        if (strpos($_SERVER['REQUEST_URI'], '?page=')) {
            $uri = str_replace('?page=', '', $_SERVER['REQUEST_URI']);
            $modx->sendRedirect($uri, array('responseCode' => 'HTTP/1.1 301 Moved Permanently'));
        }
        break;
    case 'OnPageNotFound':
        $alias = $modx->context->getOption('request_param_alias', 'q');
        if (!isset($_REQUEST[$alias])) {return false;}
        
        $request = $_REQUEST[$alias];
        $tmp = explode('/', $request);
        $p = array_pop($tmp);
        $pageNo = str_replace('.html', '', $p);
        if (is_numeric($pageNo)) {
        	if ($pageNo == $p) {
        		$modx->sendRedirect(implode('/', $tmp) . '/' . $pageNo . '.html', array('responseCode' => 'HTTP/1.1 301 Moved Permanently'));
        	}
        	if (!$section = $modx->findResource(implode('/', $tmp) . '/')) {
        	    if (empty($tmp)) {
        	        $section = $modx->getOption('site_start');
        	    } else {
        		    return false;
        	    }
        	}
    		$_GET['page'] = $_REQUEST['page'] = $pageNo;
    		$modx->sendForward($section);
        }
    default:
        break;
}
return '';


4 комментария

  1. Анастасия 07 февраля 2020, 19:56 # 0
    Добрый день! Подскажите, а как быть, если страница не имеет расширения .html? Если изменить плагин, убрав html, то выдает ошибку
    1. Илья Уткин 10 февраля 2020, 08:09 # 0
      Я думаю, достаточно просто удалить всю эту строчку:
      $modx->sendRedirect(implode('/', $tmp) . '/' . $pageNo . '.html', array('responseCode' => 'HTTP/1.1 301 Moved Permanently'));
      1. Анастасия 10 февраля 2020, 17:17 # 0
        Получилось! Спасибо большое!
    2. игорь 21 июня 2020, 06:04(Комментарий был изменён) # 0
      а как исправить плагин чтобы не просто номер страницы был в конце — а запись вида page=номер страницы

      Авторизация

      через сервис Loginza:


      Шаблоны MODX

      1 2 Дальше »

      Объектная
      модель
      MODX