Здравствуйте Уважаемое Сообщество. Прошу вашей помощи в который раз... Мозг за неделю проб и ошибок "кипит не по детски". Проблема моя неоднократно поднималась на этом форуме, но работоспособного решения мне все таки получить не удалось. Суть в том, что уже неделю бьюсь с настройкой собственных ЧПУ на сайте.
Причина по которой это пришлось делать - перенос самопального сайта моей молодости на Drupal 7. Перерыл весь форум в поисках нужной информации, но ничего более менее внятного так и не нашел.
Что я только не пробовал сделать... В общем, нужно получить УРЛ адреса страниц сайта такого вида view_post.php?id=16, view_rub.php?id=8 и так далее в этом духе. После установки и настройки pathauto синонимы адресов в интерфейсе действительно становятся такими как мне надо, но друпал по открытию этих адресов из ? в строке урл формирует связку %3F, из = формирует другой набор символов... Короче полностью перебивает адрес страницы сайта.
От отчаяния пытался хакнуть ядро - файл common.inc заменив код
<?php
function drupal_encode_path($path) {
return str_replace('%2F', '/', rawurlencode($path));
}
?>
на этот
<?php
function drupal_encode_path($path) {
if (variable_get('clean_url', '0')) {
return str_replace(array('%2F', '%3F', '%3D', '%26', '%2523'),
array('/', '?', '=', '&', '#'),
rawurlencode($path));
}
else {
return str_replace('%2F', '/', rawurlencode($path));
}
}
?>
В итоге, страницы стали открываться с нужными адресами, но семерка все равно не видит, что это синонимы, и не знает что по этим адресам должны открыться статьи сайта. 404 код стал ответом этих страниц. Настройки модуля ни к чему не привели. Видел тему, где в Drupal 6 такое можно было реализовать, но под 7 решение не пошло. В одной из веток обсуждалось данное мероприятие с использованием модуля views, но к семерке - это дело не захотело прикручиваться ни в какую.
Прошу откликнуться знающих в этом вопросе ребят. Реально сил нет биться в конвульсиях с этими адресами. Заранее благодарю откликнувшихся людей за помощь. И еще 301 не подходит, так как большая ссылочная масса на сайт, не позволит сделать корректную склейку без анкорных адресов. Буду ждать вашей помощи. Должно же быть решение этой проблемы?
Комментарии
Вы, вероятно, хотите сохранить внешние ссылки и т.п. Не проще будет написать правило для 301 редиректа на новые адреса ?
UPD: Прошу, прощения, невнимательно прочитал окончание поста... хотя не понимаю, как большое количество страниц помешает написать правило для редиректа...
Дело в том, что ссылочная масса прекрасно переносится за счет 301 редиректа, если она как минимум не "безанкорная". Если на сайт стоит очень много внешних ссылок без анкоров, то такая ссылочная масса на данный момент переклеивается очень плохо. В итоге -> переспам анкорлиста и задние позиции в выдаче.
Вопрос остается открытым. Прошу помощи в решении проблемы. Знаю, что многие бывалые друпалеры сталкивались с такими траблами при переносе. Может все таки кто поможет..?
Сколько можно?
<?php
function ololourl_url_inbound_alter(&$path, $original_path, $path_language){
$req = $_GET['q'].'?id='.$_GET['id'];
if (preg_match('/^view_post.php\?id=(\d+)/', $req, $matches) ) {
$path = 'node/'.$matches[1];
}
}
?>
Не для продакшен-использования
RxB, быть может еще какие либо функции необходимо дописать в модуль? Код не отрабатывает... Блин ткните носом что куда вставить нужно... Очень прошу... Распишите более подробно. Я создал модуль, запихнул туда этот код:
<?php
function название_модуля_url_inbound_alter(&$path, $original_path, $path_language){
$req = _GET['q'].'?id='.$_GET['id'];
if (preg_match('/^view_post.php\?id=(\d+)/', $req, $matches) ) {
$path = 'node/'.$matches[1];
}
}
?>
В итоге, после включения модуля ничего не поменялось. Может все это дело и еще function название_модуля_url_outbound_alter нужно. Пожалуйста, распишите подробнее, не могу разобраться что к чему.
У меня всё работает, я проверял код.
Передавал id = 73 и открывал 73 ноду.
Так что - сбрасываем кеш, дебажим, улыбаемся и машем.
hook_url_outbound_alter() используется для вывода ссылок на сайте.
RxB, спасибо что помогаете и направляете на путь истинный! В общем удалось победить седьмой друпал, в формировании собственных url, но только отчасти. Ваш код начал работать только после добавления доллара. Без знака модуль выдавал ошибку Parse error: syntax error, unexpected '[' in Z:\home\site.rus\www\sites\all\modules\ololo\ololo.module on line 3.
После дебажа все стало так как надо! Друпал работает, отдает нужные урлы и страницы, все гуд! Но теперь в админке вылазит ошибка Notice: Undefined index: id в функции ololo_url_inbound_alter() (строка 3 в файле Z:\home\site.rus\www\sites\all\modules\ololo\ololo.module). Ее можно как то побороть, что бы все было красиво, или ни как?
Увы, но только знанием PHP
Верю... но у меня эти знания в зачаточном состоянии, и если кинуться в PHP, то по сути родить смогу только через 9 месяцев Был бы рад, если бы вы смогли акселерировать процесс моего познании в этом вопросе.
И если можно, хотел бы узнать... Понимаю, что этот модуль и правка commona - это своего рода костыль, так как лезть в ядро Drupal нельзя. Можно ли каким либо образом вынести function drupal_encode_path($path) за пределы ядра, переопределив ее в модуле или еще как.
RxB, не сердитесь... Просто хочется сделать все более менее по человечески, а знаний не хватает. Заранее благодарю за помощь. И с праздничком вас - сегодня ведь день программиста.
Вижу, что тема тонет в терновнике Друпаловских решений и поисков. Привык доводить до логического завершения свои начинания, а по сему снова прошу помощи в своем вопросе. Ошибка - Notice: Undefined index: id в функции ololo_url_inbound_alter() (строка 3 в файле Z:\home\site.rus\www\sites\all\modules\ololo\ololo.module), кто сталкивался, как решить, и можно ли вынести function drupal_encode_path($path) за пределы ядра, для переопределения, дабы обновлять все это дело?
Нельзя, именно для этого и придуманы альтеры, менять что либо в ядре не рекомендую, с вашим уровнем знаний вероятность того, что вы его поломаете гдето 99.9%, причем так же велика вероятность проявления глюков или ошибок не сразу.
Конкретно в вашем случае этот нотис загорается при отсутствии гет переменной id, о чем это самое уведомление вам и говорит. На рабочих сайтах нотисы принято отключать. Так же символ @ перед командой позволяет игнорировать эти нотисы и прочую фигню, так же можно обернуть все это дело в
<?php if(isset($_GET['id'])){
Содержимое функции
}
?>
Это самые основы PHP
Тема не тонет, решение проблемы есть, и оно выше.
Я учить вас PHP и Drupal API не хочу, а вы упорно хотите хакать ядро
Вижу, что прямого ответа получить у меня не выйдет... Понимаю, что для php - шника в теме, эти пары строк кода сущий пустяк, но мне с этим не справиться, о чем я и писал в стартовом своем посте. А по сему задаю вопрос уже немного в другом ключе...
Кто сможет помочь мне в настройке url адресов вида view_post.php?id=67 - для постов, view_rub.php?id=8 - для рубрик, index.php?page=2 - для навигации.., за деньги? Ребята, помогите настроить, практически 2 недели перед монитором а толку ноль... Буду Вам искренне благодарен! Заранее спасибо!
Я ж написал 3 прямых способа(которые можно даже одновременно использовать, для полного кайфа), чем не устроили?
За символическую плату, лично мне "лень встать с дивана"
После обертки в -
<?php if(isset($_GET['id'])){
Содержимое функции
}
?>
Код перестает работать, и по URL адресам, страницы более не открываются. Нотисы можно отключить, но работоспособность данного кода
<?php
function название_модуля_url_inbound_alter(&$path, $original_path, $path_language){
$req = _GET['q'].'?id='.$_GET['id'];
if (preg_match('/^view_post.php\?id=(\d+)/', $req, $matches) ) {
$path = 'node/'.$matches[1];
}
}
?>
Достигнута за счет уже правленого ядра! Т.е. если ядро не трогать, то модуль с этим кодом, уже не включает нормальную - мою структуру URL адресов, а выдает 404 код. По этому и бьюсь с настройками, на зная как толком решить вопрос.
Спасибо всем отписавшимся и давшим советы. Итог - переопределил функцию ядра, и получил нужные url в строке браузера. Тема закрыта! Как решить проблему через модуль решения так и нет, но это совсем другая история, требующего огромных знаний PHP, API и много еще чего, о чем вот так просто сообщество делиться не станет! Вопрос по сути решен!
Здрасти!
помогите пожалуйста, вставляю в синоним вот эту ссылку catalog/showful.php?bc_tovar_id=3044&&binn_rubrik_pl_catelems1=268 а она меняется на эту http://magazin/catalog/showful.php%3Fbc_tovar_id%3D3044%26%26binn_rubrik..., вопросительный знак меняется на %3F и && меняются на %26%26 знак равно тоже меняется на %3D, как решить задачу подскажите пожалуйста!
Здрасти!
помогите пожалуйста, вставляю в синоним вот эту ссылку catalog/showful.php?bc_tovar_id=3044&&binn_rubrik_pl_catelems1=268 а она меняется на эту http://magazin/catalog/showful.php%3Fbc_tovar_id%3D3044%26%26binn_rubrik..., вопросительный знак меняется на %3F и && меняются на %26%26 знак равно тоже меняется на %3D, как решить задачу подскажите пожалуйста!
Столкнулся с той же проблемой при создании ноды через Entity Reference Prepopulate from URL
Помогло http://www.php.su/functions/?urldecode
<?php$b = 'node/add/my_content?field_my_referencing_field='.$nodeid_current;
$b = l(t('Click me now'), $b);
print_r (urldecode($b)); ?>
Users681 Если не тяжело, расскажите как вы это реализовали. У меня похожая история, нужно получить урл вида ?p=. Меняю файл common.inc и добавляю это модуль и ничего не работает.