drupal_goto (request_uri ()) заменяет мои '?', '=' и '&' в URL

11

Мне нужно перенаправить пользователя со страницы с example.com/node/add/dispo?arg1=1&arg2=2 на URL того же типа. Но когда я просто делаю a drupal_goto(request_uri());, он перенаправляет моего пользователя на example.com/node/add/dispo%25F%3C и т. Д.

Я попробовал str_replace, но это не сработало.

Будете ли вы иметь обходной путь?

Григорий Капустин
источник

Ответы:

32

drupal_goto()принимает $optionsпараметр для передачи в url()функцию. Вы можете передать строку запроса следующим образом:

$options = array('query' => array('foo' => 'bar'));
drupal_goto('path', $options);

Этот пример будет перенаправлен на / path? Foo = bar

Клайв
источник
Я думаю, что он чище, чем заголовок (местоположение?
Григорий Капустин
2
Это зависит от того, действительно ли, если вы посмотрите на код, все, что вам drupal_goto()нужно, - это создать URL на основе предоставленных параметров, которые он затем вызывает header()сам. Основные отличия заключаются в том, что он drupal_exit()вызывается, предоставляя чистый выход сценарию, и, если $_GET['destination']он установлен, переопределяет путь, который вы передаете в функцию. Как правило, drupal_goto()следует использовать, но бывают случаи, когда старое доброе header()более уместно. Все зависит от того, что вам нужно сделать
Клайв
Хорошо спасибо. Я буду использовать заголовок для этого, но все же, я думаю, что drupal_goto чище.
Григорий Капустин
обратите внимание, что у массива параметров есть запрос массива с именем и парой значений. Поэтому мой код для входа в систему с помощью переменной назначения выглядит следующим образом: $ options = array ('query' => array ('destination' => internal / dashboard ') drupal_goto (' user ', $ options));
reptilex
Удивительный должен узнать что - то новое
Rishab
13

Это так же, как ответ Клайва. Это правильно IMO, но я просто хотел добавить ответ, который подходит для вашего варианта использования 1: 1.

$options = array('query' => drupal_get_query_parameters());
drupal_goto(current_path(), $options);

Вы хотели позвонить drupal_goto()в то же место, что и текущее.

mysite.com/node/add/dispo?arg1=1&arg2=2

current_path () возвращает узел / add / dispo; drupal_get_query_parameters () возвращает все $_GETпараметры, кроме $_GET['q']внутреннего узла пути / add / dispo.

Когда вы звоните drupal_goto(), Drupal может перестроить тот же URI для отправки пользователю.

AyeshK
источник
Отлично, я повысил ваш ответ, оставив Клайва избранным. Спасибо вам всем.
Григорий Капустин
0

Вы также можете использовать drupal_goto($GLOBALS['base_root'] . request_uri());

Обратите внимание, что это не то же самое, что и drupal_goto(request_uri());когда переданный параметр urlencoded, как если бы это был внутренний путь drupal, который на самом деле является источником вашей проблемы.

анонимное
источник
-1

На самом деле я сделал это с помощью header("location: " . $base_path . request_uri());

Григорий Капустин
источник
3
это не правильно. drupal_goto сделано по какой-то причине, которую вы знаете.
AyeshK