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

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


person LEN    schedule 18.12.2012    source источник


Ответы (1)


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

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

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

Предположим, что у вас есть "example" в качестве псевдонима пути, указывающего на "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);
}
person apaderno    schedule 19.12.2012
comment
Спасибо за быстрый ответ, @kiamlaluno, но, к сожалению, hook_inbound_alter() не вызывается с псевдонимом, который я создаю, когда вызываю path_save() - по крайней мере, в том контексте, в котором я его вызываю. Более широкий контекст заключается в том, что я пытаюсь настроить псевдоним при сохранении профиля Profile2 ( т. е. в mymodule_profile2_presave()) — тогда у меня будет вся информация, необходимая для программной настройки псевдонима. Я добавил mymodule_url_inbound_alter(), но он вызывается только с указанием пути для редактирования профиля пользователя, когда я сохраняю этот профиль. - person LEN; 19.12.2012
comment
Мне жаль; Я не был ясен в этой части. hook_inbound_alter() используется для изменения URL-адреса перед его использованием в Drupal. Код, который я использую, используется для изменения пути, такого как node/93?uid=1, на node/93, и для установки сохранения $_GET['uid'] to 1. It is not used to alter what path_save()`, но он избегает пути, такого как node/93?uid=1, который используется для просмотра для узла с идентификатором, равным 93?uid=1. - person apaderno; 19.12.2012
comment
нет проблем. Я должен был предоставить более широкий контекст, когда делал свой исходный пост (я добавлю эту информацию в пост прямо сейчас). - person LEN; 19.12.2012