Темизация пейджера (pager), замена node?page=1 на node/page/1 (6.0)

Автор: B.X - 23.06/2009, вт - 14:56

Эта тема давнишняя и вопрос я этот поднял ещё с начала ознакомления с Друпал (07/04/2007), больше двух лет назад. Мне подумалось. почему ЧПУ не работает для пейджера нод (трекера и всего остального) в Друпале? Неужели так сложно было сделать? Как оказалось, не сложно. jason32 сделал это фактически на спор, желая посмотреть, заплатят ли ему 30$ за это или нет... Всё работает отлично. В трекере, на главной и везде где надо. Ниже я даю два кода, то, что у меня и тот, что был опубликован на Друпал.Ру.

Если кто попробовал в работе и ему всё понравилось, тот может перечислить денег ("сколько не жалко ™") на счёт разработчика. Его реквизиты можно найти здесь. Лично я за такую хорошую реализацию не пожалею 15$, а если это сделают несколько человек, то сами понимаете, работа наверняка окупится. Код, который ниже, нужно вставить в файл template.php вашей темы:

  1. <?php
  2. /** Убрать ? в pager, реализация jason32  http://drupal.ru/node/4875
  3.  */
  4. function phptemplate_pager_link($text, $page_new, $element, $parameters = array(), $attributes = array()) {
  5.   $page = isset($_GET['page']) ? $_GET['page'] : '';
  6.   if ($new_page = implode(',', pager_load_array($page_new[$element], $element, explode(',', $page)))) {
  7.     $parameters['page'] = $new_page;
  8.   }
  9.   $query = array();
  10.   if (count($parameters)) {
  11.     $query[] = drupal_query_string_encode($parameters, array());
  12.   }
  13.   $querystring = pager_get_querystring();
  14.  
  15.   if ($querystring != '') {
  16.     $query[] = $querystring;
  17.   }
  18.  
  19.   // Set each pager link title
  20.   if (!isset($attributes['title'])) {
  21.     static $titles = NULL;
  22.     if (!isset($titles)) {
  23.       $titles = array(
  24.         t('|&larr;') => t('Go to first page'),
  25.         t('&larr;') => t('Go to previous page'),
  26.         t('&rarr;') => t('Go to next page'),
  27.         t('&rarr;|') => t('Go to last page'),
  28.       );
  29.     }
  30.     if (isset($titles[$text])) {
  31.       $attributes['title'] = $titles[$text];
  32.     }
  33.     else if (is_numeric($text)) {
  34.       $attributes['title'] = t('Go to page @number', array('@number' => $text));
  35.     }
  36.   }
  37.   if(is_clear_url())
  38.   {
  39.    $new_q=drupal_get_path_alias($_GET['q']); // использование псевдонимов
  40.    if (isset($parameters['page']))    $new_q.='/page/'.$parameters['page'];
  41.    return l($text, $new_q, $attributes,NULL , NULL,FALSE,TRUE);
  42.    //return l($text, $new_q, $attributes, count($query) ? implode('&', $query) : NULL, NULL,FALSE,TRUE);
  43.   }
  44.   else
  45.     return l($text, $_GET['q'], $attributes, count($query) ? implode('&', $query) : NULL, NULL,FALSE,TRUE);
  46. }
  47.  
  48. function is_clear_url() {
  49.   return true;
  50. }
  51. /** Конец реализации pager
  52. */
  53. ?>

И код с Друпал.Ру (с дополнениями), это нужно, если pager вам надо изменять не везде, а только там, где вы указали. Замените ссылки ниже на свои и вставьте код, в дополнение к тому, что я указал выше, вместо второй одноимённой функции:

  1. <?php function is_clear_url() {
  2.     $dinamic_q=array();
  3.     $dinamic_q[]='^blogs/groups(/(.*))?';
  4.     $dinamic_q[]='^blogs/projects(/(.*))?';
  5.     $dinamic_q[]='^blogs/private(/(.*))?';
  6.     $dinamic_q[]='^blogs/talk(/(.*))?';
  7.   $dinamic_q[]='^all(/(.*))?';
  8.   $dinamic_q[]='^blogs(/(.*))?';  
  9.   $dinamic_q[]='^groups(/(.*))?';
  10.   $dinamic_q[]='^projects(/(.*))?';
  11.     $matches=array();
  12.     foreach ($dinamic_q as $v ) {
  13.        if (ereg($v, $_GET['q'])) return true;
  14.   }
  15.   return false;
  16. }    ?>

А этот код, нужно вставить в файл .htaccess в обоих (вышеуказанных) случаях:

  1. # сразу после RewriteEngine on
  2.  RewriteCond %{REQUEST_FILENAME} !-f
  3.   RewriteCond %{REQUEST_FILENAME} !-d
  4.   RewriteRule ^((.*)/page/([0-9]+))$ index.php?q=$2&page=$3 [L,QSA]

Комментарии

Здравствуйте!

Я не очень разбираюсь в пхп. Прошу помощи.
Подскажите, пожалуйста вот что.
1. Мне нужно изменить текст "следующая ›" на "› "
"последняя »" на " » "
"‹ предыдущая" на " ‹ "
"« первая" на " « "
На сайте есть русский язык, далее предполагается и английский. Хотелось бы, чтобы такие изменения были для каждого языка свои.
2. Хотелось бы изменить "следующая ›", "последняя »", "‹ предыдущая", "« первая" на картинки с соответствующими рисунками.
Буду очень признателен.
Спасибо.

так в этом модуле и есть переопределение стандартной функции... сделайте по аналогии, да и всё...
поменяйте то, что вам не нравится, на своё... двоеточия можно убрать с помощью css...

вообще же, то что вы хотите, можно сделать с помощью css, добавить классам соответствующий рисунок, убрать текст, и нет проблемы...

0, скорее всего, не подойдёт, будут просто шрифты по-умолчанию...

если описание шрифтов отнести к классу ниже, чем рисунок, то шрифт пропадёт, а рисунок - нет... впрочем, это слишком сложно... проще поиграть с настройками шрифтов...

вот учебник хороший, я им всё время пользуюсь: http://www.htmlbook.ru/css/