Кто-нибудь этим занимался? Посмотрел pathauto, но там вроде только с контентом всё, что связано перерабатывается, остальное - нет...
или это лучше через htaccess организовать? в mod_rewrite чтобы просто заменял и всё?
искал на Друпал.орг похоже этим никто не озадачивался... все и так довольны...
Комментарии
Создайте в директории файл .htaccess и впишите в него:
RewriteEngine On
RewriteRule ^page/([^/]*)$ /node?page=$1 [L]
Страницы будут иметь вид: http://ваш_сайт/page/номер_страницы
хех, тоже думал, что через htaccess оно проще будет...
но, ничего не меняется...
ведь ссылки на страницы изменяются в движке Друпала...
то есть, доступ по /page/2 будет доступен, но видиться эти ссылки будут всё равно по-прежнему...
А чем /admin/settings/clean-urls не подходит?
я делал подобное - там возня, но немного - один патч в ядре на пару строк. И плюс работа по перекрытию ссылок в теме и htaccess .
Необходимо избавиться от "node?page=1", сделав /page1.
Кто применяет это ещё? Помогите фиксом.
Применяют все.Включите чистые ссылки и правьте синонимы ссылок
volocuga, "чистые ссылки" не изменяют адрес "node?page=1", который внизу страницы. В том и дело. Посмотрите хотя бы сюда http://drupal.ru/news?page=1 , а надо http://drupal.ru/page1
Это имеет большое значение для поисковиков
Какой толк менять динамические адреса динамических страниц? Там все равно контент вечно меняется.
я у себя на блоге применяю. написав свои задокументированные функции.
custom_url_rewrite_inbound и custom_url_rewrite_outbound - для 6ки
Еще раньше тут в блоге на Drupal.ru писал как сделать это для 5ой версии. даже с примером. Правда page=? устранить не совсем тривиально но можно.
да вообще то никакого. просто урлы понтовей выглядят.
я вставлял в .htaccess внутренний редирект, паеред последним правилом в файле
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^((.*)/page/([0-9]+))$ index.php?q=$2&page=$3 [L,QSA]
,
ну и само собой сами ссылки менялись через функции темизации самого пейджера.Для 5-го сработало - сработает и для 6-го.
«Какой толк менять динамические адреса динамических страниц? Там все равно контент вечно меняется.»
Отчасти вы правы. Но поисковик пессемизируют при конкурентной борьбе,еслие есть "?". К тому же не всегда контент меняется. Мне вот надо сделать архив на друпале - там всё статично.
jason32, спасибо за отклик! Искал, но не нашел твоего фикса для 5-ки.
Я так понимаю, что надо только pager.inc изменить, ну и апач. С htacess умею работать, а вот в php - полный ноль я. Поможешь?
p.s. жалко, что liveidea закрылся... хоть бы каталог сделали из него под сапу и рекламу.
Ищи функции с началом theme_ в файле pager.inc и подобных. Как темизировать - описано неоднократно, куда копировать эти функции и как переименовывать
твоя идея к теме привязана... хотя да. по алгоритмам и нагрузке она легче. да
jason32, я не нашел тут на сайте, где описан механизм изменения pager.inc для 5-ки. То есть нужной темизации для чпу. Знаешь линки?
Этот код ответственен за формирование урла.
<?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], $element, explode(',', $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"
Совсем чуть местами поменять в указанном коде, но не получается...
если тебе так приспичило - всего за $30 я готов предоставить готовое решение.
Ilya1st, шантаж не прокатит. Я 30 отдал бы тому, кто бесплатно предложил бы, чем такому навязчевому как вы.
где?
исходя из опыта я могу сказать что вы врете.
есть простое слово. жлобство
у нас оно, увы, распространено. вы не исключение.
потому бесплатно я редко что предлагаю.
Мне плевать на ваш опыт. Вы не авторитет. Здесь если кто-то помогает, то оно для всех. Я в php ноль, но я рисую дизайн, делаю валидную вёрстку xhtml. Я помогу своими знаниями, а другие - своими, если хотят. А вы умеете только бабки кляньчить за то, что другие делают бесплатно, так как они считаю важным делать вклад в базу знаний по друпалу.
И кто тут жлоб? - тот, кто бабки просит. А если уж выбирать кому давать, то только тому, кто вызывает доверие. Это не вы. Хватит заниматься саморекламой! Больше на ваш флуд не буду отвечать.
вы бесплатно это делаете?
было просто предложено. никто не клянчил. нет - значит не надо.
то есть и вы тоже?
молодцом
вам было просто предложено. никто не клянчил. вы о себе сами все сказали.
gor, во-первых, я рад за него, что он спец. Во-вторых, 30 баксов - не деньги. Согласен. Тут дело принципа,т.к. если бы все помогали тут за деньги, то...
В-третьх, делать вёрстку правильную не все умеют. Я редко встречаю чистый xhtml,кот. во всех браузерах идентично выглядит. В-четвёртых, тут дела на две строчки, просто я принципиально пока не учу php. В-пятых, мы все тут вежливые, а вы масло в огонь подлеваете. Мы с Ильёй уже лучшие друзья почти! Будете с нами дружить? )) в-шестых, давайте писать только по теме топика, прошу вас.
ок, посмотрим на правдивость слов о 30 баксах.
Следующую функцию добавить в код используемой темы оформления.
<?php function phptemplate_pager_link($text, $page_new, $element, $parameters = array(), $attributes = array()) {
// Set each pager link title
$page = isset($_GET['page']) ? $_GET['page'] : '';
if ($new_page = implode(',', pager_load_array($page_new[$element], $element, explode(',', $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;
}
if (!isset($attributes['title'])) {
static $titles = NULL;
if (!isset($titles)) {
$titles = array(
t('|←') => t('Go to first page'),
t('←') => t('Go to previous page'),
t('→') => t('Go to next page'),
t('→|') => 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'], $attributes, count($query) ? implode('&', $query) : NULL, NULL,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. Привожу его полный текст, за вычетом каментов, во избежание.
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>
Должно всё работать. Данные в профиле.
Не работает. Пишет "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
функцию is_clear_url() туда же добавить надо - код приведен
Только не исчезло "node" линк стал "node/page/1/", а желательно именно так "/page1/", и без node в линке...
Так на всем сайте станет page1 - и куда ему вести? Нужно же какое то определение, на какой странице этот пейджер? Подставьте всесто node что-нибудь, но совсем убирать всё, кроме page нельзя. Или вам надо, чтобы на главной только было? У вас счас что, адреса вида "www.example.com?page=2" есть? Да и название темы - кто менял node?page=1 (2 и так далее) на более понятное node/page/1
так это определение же можно через апач задать.
то есть если ссылка 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/. Но может я ошибаюсь.
Блин, вы что, хотите переделать логику работы CMS? Посмотрите внимательно на ваш пример - где указания, на какую страницу переходить? Что будет в переменной q=$2( да и $3 тоже непонятно, ибо там $1 максимум )? Какое значение там ? По вашему реврайту - никакого, потому что в изначальной ссылке нету никакого - www.sitе.ru/page1/ - есть только указание на номер страницы неизвестно где. В курсе вообще, что в Друпале можно главной любую страницу поставить, а не только node ? Как системе определить, на пейджер какой страницы ей перейти? Код работает для любого Views и любого списка, но Друпалу надо знать, на страницу какого списка надо перейтии единственный способ узнать - взять из ссылки перехода.
Не стоит нервничать, это просто чел пытается сказать что ты не прав, код не работает как ему надо, а значит он тебе не должен $30.
А в целом спасибо за код, молодец. Если потребуется кому из клиентов, включу твои $30 в бюджет). Твои контакты у меня есть.
У меня везде идёт "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/
gor, вы что такое говорите.Сказать, что не прав, - бред какой-то... Мне не жалко денег, абсолютно! Но хочется платить за то, что работает, а там чпу ломается в словарях (смотри мой пост выше - я описал косяк). "/taxonomy/term/1/page/1/" вместо "/news/page/1/". Пусть оставит координаты - я напишу,а то инфо пустое.
с pathauto работу никто и не обещал, нигде это не указывалось и не делалось
Фигово, что там такие сложности. jason32, отправьте координаты в лс. я всё-таки хотел бы найти решение вопроса с чпу. Потом выложу для всех.
исправил пост с функцией, добавил псевдонимы ссылок, проверил - работает.
Теперь просто появлятся www.site.ru/node/ и всё. Версия 6.1.1 , кэш очищал.
Спасибо [b]jason32[/b], всё работает... два года ждал реализации... от меня 15$, хех, хотя я и не обещал... подробности здесь...
используйте
<?php function is_clear_url() {
return true;
} ?>
и всё заработает... в тексте же написано, что надо делать "по аналогии"... там всё видно, как...
Может кто сталкивался..
Использую реализацию пейджера от 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;
} ?>
но пейджер ни в какую не работает..
В какую сторону "копать"?
В общем разобрался...
Заменил
<?php
else
return l($text, $_GET['q'], $attributes, count($query) ? implode('&', $query) : NULL, NULL,FALSE,TRUE);
?>
На
<?php
else
return l($text, $_GET['q'], array('attributes' => $attributes, 'query' => count($query) ? implode('&', $query) : NULL));
?>
И все замечательно заработало.