Drupal 7 path_save с аргументами запроса

Я искал повсюду примеры этого, но я не нашел ни одного. Я пытаюсь создать псевдоним для пути, который включает в себя аргументы запроса, например, профиль? Arg1 = 113.

Неважно, если я предоставлю path_save() с простым строковым представлением пути, или если я предоставлю его url(),

url('profile', array('query' => array('arg1' => $uid)))

В любом случае ? и = отображаются как экранированные символы на странице администрирования псевдонимов URL, что, естественно, означает, что путь не может быть найден.

Как я могу сохранить? и = от побега?

19.12.12 Редактирование 1: более широкий контекст заключается в том, что я пытаюсь настроить псевдоним при сохранении профиля Profile2 (т.е. в mymodule_profile2_presave()) - именно тогда у меня будет вся необходимая информация программно настроить псевдоним.

19.12.12 Редактирование 2: Я только что понял, что проблема не в стороне вставки - в таблице url_alias на самом деле есть неэкранированные символы. Проблема в том, что Drupal не кодирует путь перед его использованием...

20.12.12 Редактирование 3: Нашел решение, использующее Redirect вместо псевдонимов пути. Redirect правильно декодирует строку запроса!

1 ответ

Вы не можете прикрепить строку запроса к месту назначения псевдонима. Код, выполняемый из drupal_path_initialize(), неправильно обрабатывает строку запроса.

Функция содержит следующий код.

$_GET['q'] = drupal_get_normal_path($_GET['q']);

Предположим, что у вас есть "пример" в качестве псевдонима пути, который указывает на "node/93? Uid=1"; этот код будет установлен $_GET['q'] в 'node/93?uid=1', пока вы ожидаете $_GET['q'] получить 'node/93', а также $_GET['uid'] быть установленным на 1,

Что вы можете сделать, это реализовать hook_inbound_alter() с кодом, подобным следующему.

function mymodule_url_inbound_alter(&$path, $original_path, $path_language) {
  list ($path, $query) = explode('?', $path);
  $_GET += drupal_get_query_array($query);
}
Другие вопросы по тегам