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);
}