[РЕШЕНО] кто менял node?page=1 (2 и так далее) на более понятное node/page/1

Главные вкладки

Аватар пользователя B.X B.X 7 апреля 2007 в 2:09

Кто-нибудь этим занимался? Посмотрел pathauto, но там вроде только с контентом всё, что связано перерабатывается, остальное - нет...
или это лучше через htaccess организовать? в mod_rewrite чтобы просто заменял и всё?
искал на Друпал.орг похоже этим никто не озадачивался... все и так довольны...

Комментарии

Аватар пользователя Kostya.S Kostya.S 31 января 2008 в 9:49

Создайте в директории файл .htaccess и впишите в него:

RewriteEngine On
RewriteRule ^page/([^/]*)$ /node?page=$1 [L]

Страницы будут иметь вид: http://ваш_сайт/page/номер_страницы

Аватар пользователя B.X B.X 11 февраля 2008 в 11:08

хех, тоже думал, что через htaccess оно проще будет...

но, ничего не меняется...
ведь ссылки на страницы изменяются в движке Друпала...
то есть, доступ по /page/2 будет доступен, но видиться эти ссылки будут всё равно по-прежнему...

Аватар пользователя jason32 jason32 11 февраля 2012 в 11:04

я делал подобное - там возня, но немного - один патч в ядре на пару строк. И плюс работа по перекрытию ссылок в теме и htaccess .

Аватар пользователя volocuga volocuga 3 июня 2009 в 2:17

"cascad" wrote:
Кто применяет это ещё? Помогите фиксом.

Применяют все.Включите чистые ссылки и правьте синонимы ссылок

Аватар пользователя cascad cascad 3 июня 2009 в 16:45

volocuga, "чистые ссылки" не изменяют адрес "node?page=1", который внизу страницы. В том и дело. Посмотрите хотя бы сюда http://drupal.ru/news?page=1 , а надо http://drupal.ru/page1

Это имеет большое значение для поисковиков

Аватар пользователя Ильич Рамирес Санчес Ильич Рамирес Санчес 3 июня 2009 в 18:09

"cascad" wrote:
Кто применяет это ещё? Помогите фиксом.

я у себя на блоге применяю. написав свои задокументированные функции.
custom_url_rewrite_inbound и custom_url_rewrite_outbound - для 6ки

Еще раньше тут в блоге на Drupal.ru писал как сделать это для 5ой версии. даже с примером. Правда page=? устранить не совсем тривиально но можно.

"Химический Али" wrote:
Какой толк менять динамические адреса динамических страниц? Там все равно контент вечно меняется.

да вообще то никакого. просто урлы понтовей выглядят.

Аватар пользователя jason32 jason32 3 июня 2009 в 20:30

я вставлял в .htaccess внутренний редирект, паеред последним правилом в файле

  RewriteCond %{REQUEST_FILENAME} !-f
  RewriteCond %{REQUEST_FILENAME} !-d
  RewriteRule ^((.*)/page/([0-9]+))$ index.php?q=$2&page=$3 [L,QSA]

,
ну и само собой сами ссылки менялись через функции темизации самого пейджера.Для 5-го сработало - сработает и для 6-го.

Аватар пользователя cascad cascad 3 июня 2009 в 20:56

«Какой толк менять динамические адреса динамических страниц? Там все равно контент вечно меняется.»
Отчасти вы правы. Но поисковик пессемизируют при конкурентной борьбе,еслие есть "?". К тому же не всегда контент меняется. Мне вот надо сделать архив на друпале - там всё статично.

jason32, спасибо за отклик! Искал, но не нашел твоего фикса для 5-ки.
Я так понимаю, что надо только pager.inc изменить, ну и апач. С htacess умею работать, а вот в php - полный ноль я. Поможешь?

p.s. жалко, что liveidea закрылся... хоть бы каталог сделали из него под сапу и рекламу.

Аватар пользователя jason32 jason32 11 февраля 2012 в 11:04

Ищи функции с началом theme_ в файле pager.inc и подобных. Как темизировать - описано неоднократно, куда копировать эти функции и как переименовывать

Аватар пользователя Ильич Рамирес Санчес Ильич Рамирес Санчес 3 июня 2009 в 23:30

"jason32" wrote:
,
ну и само собой сами ссылки менялись через функции темизации самого пейджера.Для 5-го сработало - сработает и для 6-го.

твоя идея к теме привязана... хотя да. по алгоритмам и нагрузке она легче. да

Аватар пользователя cascad cascad 4 июня 2009 в 18:23

jason32, я не нашел тут на сайте, где описан механизм изменения pager.inc для 5-ки. То есть нужной темизации для чпу. Знаешь линки?

Аватар пользователя cascad cascad 4 июня 2009 в 19:29

Этот код ответственен за формирование урла.

<?php
function theme_pager_link($text$page_new$element$parameters = array(), $attributes = array()) {
  
$page = isset($_GET['page']) ? $_GET['page'] : '';
  if (
$new_page implode(','pager_load_array($page_new[$element], $elementexplode(','$page)))) {
    
$parameters['page'] = $new_page;
  }
?>

Сейчас у меня урл /node/?page=1

этот код, где "node"

<?php
return l($text$_GET['q'], array('attributes' => $attributes'query' => count($query)));
}
?>

всё в pager.inc

Задача: Избавиться от "/node/?page=", и привести отображение урла к такому виду "/page1"

Совсем чуть местами поменять в указанном коде, но не получается...

Аватар пользователя cascad cascad 4 июня 2009 в 23:01

Ilya1st, шантаж не прокатит. Я 30 отдал бы тому, кто бесплатно предложил бы, чем такому навязчевому как вы.

Аватар пользователя Ильич Рамирес Санчес Ильич Рамирес Санчес 4 июня 2009 в 23:24

"cascad" wrote:
шантаж не прокатит

где?
"cascad" wrote:
30 отдал бы тому, кто бесплатно предложил бы

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

Аватар пользователя cascad cascad 5 июня 2009 в 1:53

"Ilya1st" wrote:
исходя из опыта я могу сказать что вы врете.

Мне плевать на ваш опыт. Вы не авторитет. Здесь если кто-то помогает, то оно для всех. Я в php ноль, но я рисую дизайн, делаю валидную вёрстку xhtml. Я помогу своими знаниями, а другие - своими, если хотят. А вы умеете только бабки кляньчить за то, что другие делают бесплатно, так как они считаю важным делать вклад в базу знаний по друпалу.

"Ilya1st" wrote:
потому бесплатно я редко что предлагаю

И кто тут жлоб? - тот, кто бабки просит. А если уж выбирать кому давать, то только тому, кто вызывает доверие. Это не вы. Хватит заниматься саморекламой! Больше на ваш флуд не буду отвечать.

Аватар пользователя Ильич Рамирес Санчес Ильич Рамирес Санчес 5 июня 2009 в 2:05

"cascad" wrote:
но я рисую дизайн, делаю валидную вёрстку xhtml

вы бесплатно это делаете? Smile
"cascad" wrote:
А вы умеете только бабки кляньчить за т

было просто предложено. никто не клянчил. нет - значит не надо.

"cascad" wrote:
И кто тут жлоб? - тот, кто бабки просит.

то есть и вы тоже? Smile

"cascad" wrote:
Хватит заниматься саморекламой!

"cascad" wrote:
делаю валидную вёрстку xhtml.

Smile
молодцом Smile
вам было просто предложено. никто не клянчил. вы о себе сами все сказали.

Аватар пользователя cascad cascad 5 июня 2009 в 4:32

gor, во-первых, я рад за него, что он спец. Во-вторых, 30 баксов - не деньги. Согласен. Тут дело принципа,т.к. если бы все помогали тут за деньги, то...
В-третьх, делать вёрстку правильную не все умеют. Я редко встречаю чистый xhtml,кот. во всех браузерах идентично выглядит. В-четвёртых, тут дела на две строчки, просто я принципиально пока не учу php. В-пятых, мы все тут вежливые, а вы масло в огонь подлеваете. Мы с Ильёй уже лучшие друзья почти! Будете с нами дружить? )) в-шестых, давайте писать только по теме топика, прошу вас.

Аватар пользователя jason32 jason32 8 июня 2009 в 20:59

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

<?php function phptemplate_pager_link($text$page_new$element$parameters = array(), $attributes = array()) {
  
$page = isset($_GET['page']) ? $_GET['page'] : '';
  if (
$new_page implode(','pager_load_array($page_new[$element], $elementexplode(','$page)))) {
    
$parameters['page'] = $new_page;
  }
  
$query = array();
  if (
count($parameters)) {
    
$query[] = drupal_query_string_encode($parameters, array());
  }
  
$querystring pager_get_querystring();

  if (

$querystring != '') {
    
$query[] = $querystring;
  }

  

// Set each pager link title
  
if (!isset($attributes['title'])) {
    static 
$titles NULL;
    if (!isset(
$titles)) {
      
$titles = array(
        
t('|&larr;') => t('Go to first page'),
        
t('&larr;') => t('Go to previous page'),
        
t('&rarr;') => t('Go to next page'),
        
t('&rarr;|') => t('Go to last page'),
      );
    }
    if (isset(
$titles[$text])) {
      
$attributes['title'] = $titles[$text];
    }
    else if (
is_numeric($text)) {
      
$attributes['title'] = t('Go to page number', array('number=> $text));
    }
  }
  if(
is_clear_url())
  {
   
$new_q=drupal_get_path_alias($_GET['q']); // использование псевдонимов
   
if (isset($parameters['page']))    $new_q.='/page/'.$parameters['page'];
   return 
l($text$new_q$attributes,NULL NULL,FALSE,TRUE);
   
//return l($text, $new_q, $attributes, count($query) ? implode('&', $query) : NULL, NULL,FALSE,TRUE);
  
}
  else
    return 
l($text$_GET['q'], $attributescount($query) ? implode('&'$query) : NULLNULL,FALSE,TRUE);
}
?>

Функция is_clean_url для того, чтобы не глючило в админской части и чтобы чистый пейджер был только там где нужно. Если нужно везде - напишите просто в ней <?php return true;?>

<?php function is_clear_url() {
    
$dinamic_q=array();
    
$dinamic_q[]='^blogs/groups(/(.*))?';
    
$dinamic_q[]='^blogs/projects(/(.*))?';
    
$dinamic_q[]='^blogs/private(/(.*))?';
    
$dinamic_q[]='^blogs/talk(/(.*))?';
  
$dinamic_q[]='^all(/(.*))?';
  
$dinamic_q[]='^blogs(/(.*))?';  
  
$dinamic_q[]='^groups(/(.*))?';
  
$dinamic_q[]='^projects(/(.*))?';
    
$matches=array();
    foreach (
$dinamic_q as $v ) {
       if (
ereg($v$_GET['q'])) return true;
  }
  return 
false;
}    
?>

Это функция прям из того сайта, там нужно было это. Примерно понятно, как адреса добавлять.
Всё это работает с тем .htaccess. Привожу его полный текст, за вычетом каментов, во избежание.

 <FilesMatch "(\.(engine|inc|info|install|module|profile|po|sh|.*sql|theme|tpl(\.php)?|xtmpl)|code-style\.pl|Entries.*|Repository|Root|Tag|Template)$">
  Order allow,deny
</FilesMatch>

# Don't show directory listings for URLs which map to a directory.
Options -Indexes

# Follow symbolic links in this directory.
Options +FollowSymLinks

# Customized error messages.
ErrorDocument 404 /index.php

# Set the default handler.
DirectoryIndex index.php

# PHP 4, Apache 1.
<IfModule mod_php4.c>
  php_value magic_quotes_gpc                0
  php_value register_globals                0
  php_value session.auto_start              0
  php_value mbstring.http_input             pass
  php_value mbstring.http_output            pass
  php_value mbstring.encoding_translation   0
</IfModule>

# PHP 4, Apache 2.
<IfModule sapi_apache2.c>
  php_value magic_quotes_gpc                0
  php_value register_globals                0
  php_value session.auto_start              0
  php_value mbstring.http_input             pass
  php_value mbstring.http_output            pass
  php_value mbstring.encoding_translation   0
</IfModule>

# PHP 5, Apache 1 and 2.
<IfModule mod_php5.c>
  php_value magic_quotes_gpc                0
  php_value register_globals                0
  php_value session.auto_start              0
  php_value mbstring.http_input             pass
  php_value mbstring.http_output            pass
  php_value mbstring.encoding_translation   0
</IfModule>

# Requires mod_expires to be enabled.
<IfModule mod_expires.c>
  # Enable expirations.
  ExpiresActive On
  # Cache all files for 2 weeks after access (A).
  ExpiresDefault A1209600
  # Do not cache dynamically generated pages.
  ExpiresByType text/html A1
</IfModule>

# Various rewrite rules.
<IfModule mod_rewrite.c>
  RewriteEngine on
  # new code-----------------------------------
  RewriteCond %{REQUEST_FILENAME} !-f
  RewriteCond %{REQUEST_FILENAME} !-d
  RewriteRule ^((.*)/page/([0-9]+))$ index.php?q=$2&page=$3 [L,QSA]

  # Rewrite current-style URLs of the form 'index.php?q=x'.
  RewriteCond %{REQUEST_FILENAME} !-f
  RewriteCond %{REQUEST_FILENAME} !-d
  RewriteRule ^(.*)$ index.php?q=$1 [L,QSA]
</IfModule>

Должно всё работать. Данные в профиле.

Аватар пользователя cascad cascad 6 июня 2009 в 12:24

Не работает. Пишет "Call to undefined function is_clear_url()

Добавлял код в bluemarine\template.php, в phptemplate.engine и pager.inc пробовал заменять.

Там вроде только в "$parameters['page/'] = $new_page;" надо править и в "return l($text, $_GET['q'], array('attributes' => $attributes, 'query' => count($query)));", что добавит к page/ ещё цифру, то есть будет page/1

Аватар пользователя jason32 jason32 6 июня 2009 в 16:37

"cascad" wrote:
Только не исчезло "node" линк стал "node/page/1/", а желательно именно так "/page1/", и без node в линке...

Так на всем сайте станет page1 - и куда ему вести? Нужно же какое то определение, на какой странице этот пейджер? Подставьте всесто node что-нибудь, но совсем убирать всё, кроме page нельзя. Или вам надо, чтобы на главной только было? У вас счас что, адреса вида "www.example.com?page=2" есть? Да и название темы - кто менял node?page=1 (2 и так далее) на более понятное node/page/1

Аватар пользователя cascad cascad 6 июня 2009 в 17:40

"jason32" wrote:
Нужно же какое то определение, на какой странице этот пейджер

так это определение же можно через апач задать.
то есть если ссылка www.sitе.ru/page1/ , то будет RewriteRule ^/page([0-9]+))$ index.php?q=$2&page=$3

В том и дело, что надо www.sitе.ru/page1/ или www.sitе.ru/1/

"node" из админки не убирается, а где в файлах не нашел, где этот node отображает себя в ссылках. Мне кажется, что его надо убирать в pager.inc.

Мне кажется, что достаточно просто в строчке return l($text, $_GET['q'], array('attributes' => $attributes, 'query' => count($query)));
задать последовательность . 'page' . и прикрутить "$", который номер выводит. Это вроде count($query)
будет сразу sitе.ru/page1/. Но может я ошибаюсь.

Аватар пользователя jason32 jason32 6 июня 2009 в 17:58

"cascad" wrote:
то есть если ссылка www.sitе.ru/page1/ , то будет RewriteRule ^/page([0-9]+))$ index.php?q=$2&page=$3

Блин, вы что, хотите переделать логику работы CMS? Посмотрите внимательно на ваш пример - где указания, на какую страницу переходить? Что будет в переменной q=$2( да и $3 тоже непонятно, ибо там $1 максимум )? Какое значение там ? По вашему реврайту - никакого, потому что в изначальной ссылке нету никакого - www.sitе.ru/page1/ - есть только указание на номер страницы неизвестно где. В курсе вообще, что в Друпале можно главной любую страницу поставить, а не только node ? Как системе определить, на пейджер какой страницы ей перейти? Код работает для любого Views и любого списка, но Друпалу надо знать, на страницу какого списка надо перейтии единственный способ узнать - взять из ссылки перехода.

Аватар пользователя gor gor 6 июня 2009 в 19:02

Не стоит нервничать, это просто чел пытается сказать что ты не прав, код не работает как ему надо, а значит он тебе не должен $30.
А в целом спасибо за код, молодец. Если потребуется кому из клиентов, включу твои $30 в бюджет). Твои контакты у меня есть.

Аватар пользователя cascad cascad 6 июня 2009 в 19:15

У меня везде идёт "node", т.е. index.php?q=node&page=1, значит можно сократить до /page1/ или /page/1/ а в htacess тогда RewriteRule ^/page([0-9]+))$ index.php?q=node&page=$1

Кстати, ваш код не работает со словарями - у меня показывается /node/page/1/, а вот на словаре таксономии вместо /news/page/1/ появлятся /taxonomy/term/1/page/1/ то есть ужасс, а ведь надо /news/page/1/ ,но так не показывает...

Это вообще реально сделать? (эти два пункта)
1) /news/page1/ вместо /taxonomy/term/1/page/1/ как сейчас получается.
но при этом
2) избавиться от /node/ в корне сайта, т.е. site.ru/page1/

Аватар пользователя cascad cascad 6 июня 2009 в 19:22

gor, вы что такое говорите.Сказать, что не прав, - бред какой-то... Мне не жалко денег, абсолютно! Но хочется платить за то, что работает, а там чпу ломается в словарях (смотри мой пост выше - я описал косяк). "/taxonomy/term/1/page/1/" вместо "/news/page/1/". Пусть оставит координаты - я напишу,а то инфо пустое.

Аватар пользователя cascad cascad 8 июня 2009 в 17:55

Фигово, что там такие сложности. jason32, отправьте координаты в лс. я всё-таки хотел бы найти решение вопроса с чпу. Потом выложу для всех.

Аватар пользователя jason32 jason32 8 июня 2009 в 21:13

"cascad" wrote:
Фигово, что там такие сложности.

исправил пост с функцией, добавил псевдонимы ссылок, проверил - работает.

Аватар пользователя B.X B.X 23 июня 2009 в 16:08

Спасибо [b]jason32[/b], всё работает... два года ждал реализации... от меня 15$, хех, хотя я и не обещал... подробности здесь...

Quote:
Теперь просто появлятся www.site.ru/node/ и всё. Версия 6.1.1 , кэш очищал.

используйте
<?php function is_clear_url() {
return true;
} ?>

и всё заработает... в тексте же написано, что надо делать "по аналогии"... там всё видно, как...

Аватар пользователя Dimaseo Dimaseo 5 ноября 2010 в 2:15

Может кто сталкивался..
Использую реализацию пейджера от jason32 - все замечательно работает, за исключением одного пейджера на единственной страничке сделанной на views2

Страница исключена с помощью

<?php function is_clear_url() {
    
$dinamic_q=array();
    
$dinamic_q[]='^search(/(.*))';
    
$matches=array();
    foreach (
$dinamic_q as $v ) {
       if (
ereg($v$_GET['q'])) return false;
  }
  return 
true;
}    
?>

но пейджер ни в какую не работает..
В какую сторону "копать"?

Аватар пользователя Dimaseo Dimaseo 5 ноября 2010 в 2:19

В общем разобрался...
Заменил

<?php  
else
    return 
l($text$_GET['q'], $attributescount($query) ? implode('&'$query) : NULLNULL,FALSE,TRUE); 
?>

На

<?php
else
    return 
l($text$_GET['q'], array('attributes' => $attributes'query' => count($query) ? implode('&'$query) : NULL));
?>

И все замечательно заработало.