+7 495 008 8452 пн.-пт. 10:00 – 17:00
Если у вас возникли какие либо вопросы которые вы не смогли решить по нашим публикациям самостоятельно,
то ждем ваше обращение в нашей службе тех поддержки.


Делаем красивую универсальную ЧПУ-постраничку в Битрикс (а также выкидываем мусор из постранички)

Обязательно чиатем фикс от 07.08.15: http://blog.d-it.ru/dev/universal-beautiful-postranecky-on-bitrix-fix-and-improvement/

Есть в Битрикс места, за которые местами стыдно. Одно из них - это ПОСТРАНИЧКА (оттакенными буквами, ага). Это даже отличительная черта Битрикс - PAGEN_ - все, Битрикс. Избавляемся от этого :)

Идея проста - мы буферизируем вывод шаблона system.pagenavigation (да, поработать ручками придется). В начале ставим ob_start();, в конце небольшие махинации с preg_replace, и на выходе имеем красивые ссылки. Но это пока только ссылки. Код я разбиратьне буду, скачать вы сможете его в конце сего поста. Замечу только, что внутри колбека можно вырезать ненужные get-параметры. Как вариант, эту обработку можно вынести в функцию, которую дополнять теми параметрами, которые вы хотите удалять постоянно. Место очистки отмечено красным. И еще момент - используется анонимная функция, что требует PHP минимум 5.3 (можете переписать на старый вызов колбека).

2013_04_22_00_25_netbeans_ide.png

Да, хочу сразу предупредить - получилось не совсем универсально, я сделал только для PAGEN_1 (а есть еще PAGEN_2 и так далее), цифра в конце увеличивается при каждом новом вызове постранички на странице. Но это бывает крайне редко. И в этом случае ЧПУ-постраничка, как правило, одна.

Значит, шаблон красивый вывели

2013_04_21_17_43.png

Алгоритм не накладывает требования на шаблон. Более того, вы можете взять и применить его на ваши текущие шаблоны. Старые PAGEN продолжат работать также.

Так, далее надо поместить в htaccess волшебную строчку в секцию IfModule mod_rewrite.c:
RewriteRule ^(.*)/pagen([\d]+)/ /$1/?PAGEN_1=$2 [L,QSA]
Остался последний штрих. Нам нужно GetCurPage и GetCurDir оставить неизменными, чтобы получилось абсолютно безболезненно (и незаметно) для Битрикс. Для этого мы делаем финт таким обработчиком:
 AddEventHandler('main', 'OnPageStart', array('CMainhandlers', 'OnPageStartHandler'));
class CMainhandlers {
   public static function OnPageStartHandler() { 
      $newUri = preg_replace('#(pagen[\d]+/)#is', '', $_SERVER['REQUEST_URI']);
      if (!CHTTP::isPathTraversalUri($newUri)) {
         $_SERVER['REQUEST_URI'] = $newUri;
         $GLOBALS['APPLICATION']->reinitPath();
      }
   }
}
Вот собственно и вся магия. Комментарии подробные считаю излишними, разработчики разберутся.

UPD:

Спросили - а как убрать PAGEN_, но не ЧПУ делать, а просто приятные параметры. К примеру, page=xxx. Тут все проще.

Шаблон - все то же самое, кроме строчки
$newUrl .= 'pagen'.intval($v).'/';
ее меняем на
$arQuery['page'] = intval($v);

htaccess - вообще не трогаем.

Код обработчика - выглядит совершенно иначе:
   public static function OnPageStartHandler() { 
      if (isset($_GET['page']) && intval($_GET['page'])>0) {
         $GLOBALS['PAGEN_1'] = $_REQUEST['PAGEN_1'] = $_GET['PAGEN_1'] = $_GET['page'];
         unset($_GET['page'], $_REQUEST['page'], $GLOBALS['page']);
      }
      $GLOBALS['APPLICATION']->reinitPath();
   }


Назад в раздел

Подписаться на новые материалы раздела:












CAPTCHA