[ Решено ] Собственные УРЛ адреса при переносе сайта на Drupal 7 без замены ? на %3F , и = на %3D.

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

Аватар пользователя Users681 Users681 11 сентября 2012 в 14:57

Здравствуйте Уважаемое Сообщество. Прошу вашей помощи в который раз... Мозг за неделю проб и ошибок "кипит не по детски". Проблема моя неоднократно поднималась на этом форуме, но работоспособного решения мне все таки получить не удалось. Суть в том, что уже неделю бьюсь с настройкой собственных ЧПУ на сайте.

Причина по которой это пришлось делать - перенос самопального сайта моей молодости на 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 не подходит, так как большая ссылочная масса на сайт, не позволит сделать корректную склейку без анкорных адресов. Буду ждать вашей помощи. Должно же быть решение этой проблемы?

Комментарии

Аватар пользователя Advin Advin 11 сентября 2012 в 17:25

Вы, вероятно, хотите сохранить внешние ссылки и т.п. Не проще будет написать правило для 301 редиректа на новые адреса ?

UPD: Прошу, прощения, невнимательно прочитал окончание поста... хотя не понимаю, как большое количество страниц помешает написать правило для редиректа...

Аватар пользователя Users681 Users681 11 сентября 2012 в 17:33

Дело в том, что ссылочная масса прекрасно переносится за счет 301 редиректа, если она как минимум не "безанкорная". Если на сайт стоит очень много внешних ссылок без анкоров, то такая ссылочная масса на данный момент переклеивается очень плохо. В итоге -> переспам анкорлиста и задние позиции в выдаче.

Вопрос остается открытым. Прошу помощи в решении проблемы. Знаю, что многие бывалые друпалеры сталкивались с такими траблами при переносе. Может все таки кто поможет..?

Аватар пользователя Виктор Степаньков ака RxB Виктор Степаньк... 11 сентября 2012 в 19:21

Сколько можно?

<?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];
  }                                                                                                                                                                             
}
?>

Не для продакшен-использования

Аватар пользователя Users681 Users681 11 сентября 2012 в 22:32

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 нужно. Пожалуйста, распишите подробнее, не могу разобраться что к чему.

Аватар пользователя Виктор Степаньков ака RxB Виктор Степаньк... 11 сентября 2012 в 22:53

У меня всё работает, я проверял код.
Передавал id = 73 и открывал 73 ноду.
Так что - сбрасываем кеш, дебажим, улыбаемся и машем.

hook_url_outbound_alter() используется для вывода ссылок на сайте.

Аватар пользователя Users681 Users681 12 сентября 2012 в 1:01

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). Ее можно как то побороть, что бы все было красиво, или ни как?

Аватар пользователя Users681 Users681 12 сентября 2012 в 13:34

Верю... но у меня эти знания в зачаточном состоянии, и если кинуться в PHP, то по сути родить смогу только через 9 месяцев Smile Был бы рад, если бы вы смогли акселерировать процесс моего познании в этом вопросе.

И если можно, хотел бы узнать... Понимаю, что этот модуль и правка commona - это своего рода костыль, так как лезть в ядро Drupal нельзя. Можно ли каким либо образом вынести function drupal_encode_path($path) за пределы ядра, переопределив ее в модуле или еще как.

RxB, не сердитесь... Просто хочется сделать все более менее по человечески, а знаний не хватает. Заранее благодарю за помощь. И с праздничком вас - сегодня ведь день программиста.

Аватар пользователя Users681 Users681 15 сентября 2012 в 19:19

Вижу, что тема тонет в терновнике Друпаловских решений и поисков. Привык доводить до логического завершения свои начинания, а по сему снова прошу помощи в своем вопросе. Ошибка - 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) за пределы ядра, для переопределения, дабы обновлять все это дело?

Аватар пользователя sg85 sg85 15 сентября 2012 в 20:00

Нельзя, именно для этого и придуманы альтеры, менять что либо в ядре не рекомендую, с вашим уровнем знаний вероятность того, что вы его поломаете гдето 99.9%, причем так же велика вероятность проявления глюков или ошибок не сразу.

Конкретно в вашем случае этот нотис загорается при отсутствии гет переменной id, о чем это самое уведомление вам и говорит. На рабочих сайтах нотисы принято отключать. Так же символ @ перед командой позволяет игнорировать эти нотисы и прочую фигню, так же можно обернуть все это дело в
<?php if(isset($_GET['id'])){
Содержимое функции
}
?>
Это самые основы PHP

Аватар пользователя Users681 Users681 5 октября 2012 в 12:54

Вижу, что прямого ответа получить у меня не выйдет... Понимаю, что для php - шника в теме, эти пары строк кода сущий пустяк, но мне с этим не справиться, о чем я и писал в стартовом своем посте. А по сему задаю вопрос уже немного в другом ключе...

Кто сможет помочь мне в настройке url адресов вида view_post.php?id=67 - для постов, view_rub.php?id=8 - для рубрик, index.php?page=2 - для навигации.., за деньги? Ребята, помогите настроить, практически 2 недели перед монитором а толку ноль... Буду Вам искренне благодарен! Заранее спасибо!

Аватар пользователя sg85 sg85 21 сентября 2012 в 21:25

Я ж написал 3 прямых способа(которые можно даже одновременно использовать, для полного кайфа), чем не устроили?

За символическую плату, лично мне "лень встать с дивана"

Аватар пользователя Users681 Users681 21 сентября 2012 в 21:39

После обертки в -


<?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 код. По этому и бьюсь с настройками, на зная как толком решить вопрос.

Аватар пользователя Users681 Users681 5 октября 2012 в 10:22

Спасибо всем отписавшимся и давшим советы. Итог - переопределил функцию ядра, и получил нужные url в строке браузера. Тема закрыта! Как решить проблему через модуль решения так и нет, но это совсем другая история, требующего огромных знаний PHP, API и много еще чего, о чем вот так просто сообщество делиться не станет! Вопрос по сути решен!

Аватар пользователя gnom22 gnom22 23 сентября 2013 в 12:45

Здрасти!
помогите пожалуйста, вставляю в синоним вот эту ссылку 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, как решить задачу подскажите пожалуйста!

Аватар пользователя gnom22 gnom22 24 сентября 2013 в 19:19

Здрасти!
помогите пожалуйста, вставляю в синоним вот эту ссылку 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, как решить задачу подскажите пожалуйста!

Аватар пользователя Kottov Kottov 11 августа 2014 в 13:27

Столкнулся с той же проблемой при создании ноды через 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));  ?>
Аватар пользователя salexua salexua 22 декабря 2014 в 1:02

Users681 Если не тяжело, расскажите как вы это реализовали. У меня похожая история, нужно получить урл вида ?p=. Меняю файл common.inc и добавляю это модуль и ничего не работает.