Как перенаправить на страницу после отправки формы

24

У меня есть пользовательский модуль, который отображает форму.

После отправки формы я хочу перенаправить пользователя на другую страницу.

Как я могу это сделать?

Карлос Муньис
источник

Ответы:

31

В обработчике отправки вы делаете

Drupal 7:

$form_state['redirect'] = 'url';

Drupal 8:

$form_state->setRedirect('route', $args, $options);
$form_state->setRedirectUrl(\Drupal\Core\Url);
googletorp
источник
Есть ли альтернативный способ сделать это? формы, которые мне нужно перенаправить, создаются с помощью собственного обработчика #submit (обработчики отправки не помещаются в мой пользовательский модуль), поэтому у меня нет доступа к коду.
Карлос Муньис,
@Charlie используйте form_alter, чтобы добавить свой собственный.
googletorp
@Charlie если ваш для в основном доступны по ссылке, поместите параметр назначения в URL: /my-form?destination=node/123.
Тостинни
Не работает на D7, но я нашел то, что делает. Проверьте мое сообщение ниже.
Игнасио Сегура Постиго
Я просто хочу поблагодарить вас за ответ на вопрос D7, а затем вернуться через 5 лет, чтобы обновить ответ для D8. <3
муравей
17

Следует отметить, что существует несколько триггеров, которые могут предотвратить перенаправление:

  • $form_state['redirect'] === FALSE: Если установлено, функция построителя формы или обработчик проверки / отправки формы не хочет, чтобы пользователь перенаправлялся, что означает, что drupal_goto()он не вызывается. Для большинства форм логика перенаправления будет одинаковой независимо от того, $form_state['redirect']является ли она неопределенной или FALSE. Однако, если он не был определен и текущий запрос содержит строку запроса 'destination', он drupal_goto()будет перенаправлен на этот данный пункт назначения. Только установка $form_state['redirect']для FALSEпредотвратит перенаправление.
  • $form_state['no_redirect'] === TRUE: Когда установлено, обратный вызов, который первоначально построил форму, явно запрещает любое перенаправление, независимо от значения перенаправления в $form_state['redirect']. Например, ajax_get_form()определяет $form_state['no_redirect']при построении формы в обратном вызове AJAX, чтобы предотвратить любое перенаправление. $form_state['no_redirect']НЕ должны быть изменены функциями построителя форм или обработчиками проверки / отправки форм.
  • $form_state['programmed'] === TRUE: означает, что отправка формы обычно вызывается с помощью drupal_form_submit(), поэтому любое перенаправление нарушит вызываемый скрипт drupal_form_submit().
  • $form_state['rebuild'] === TRUE: означает, что форму нужно перестраивать без перенаправления.
trampjuice
источник
7

Для Drupal 7 я попробовал это на пользовательском модуле, и он работает. Это также может быть использовано в теме:

function my_theme_form_alter(&$form, &$form_state, $form_id) {
if ($form_id == 'contact_site_form') {
$form['#submit'][] = 'contact_form_submit_handler';
}
}

function contact_form_submit_handler(&$form, &$form_state) {
$form_state['redirect'] = 'thank-you-page-alias';
}

Кстати, я нашел этот фрагмент здесь: https://gist.github.com/postrational/5768796

Игнасио Сегура Постиго
источник
4

Чтобы перенаправить на внешний URL-адрес в Drupal 8, используйте TrustedRedirectResponseкласс, как показано в следующем коде.

$response = new TrustedRedirectResponse('http://google.co.in');
$form_state->setResponse($response);
DRUPWAY
источник
В случае, если это может помочь, нам нужно включить этот класс с useключевым словом и его пространством имен:use Drupal\Core\Routing\TrustedRedirectResponse;
Себастьян Гикель
2

На D8 мне это понравилось (но это не сработает ... см. Ниже):

/**
* Implements hook_form_FORM_ID_alter().
*/
function MYMODULE_form_FORM_ID_form_alter( array &$form, FormStateInterface $form_state, $form_id ) {

   // Force redirect to "/thankyou" page
   $url = "/thankyou";
   $path = \Drupal::service('path.alias_manager')->getPathByAlias($url);
   if(preg_match('/node\/(\d+)/', $path, $matches)) {
     $form_state->setRedirect('entity.node.canonical',
       array('node' => $matches[1])
     );    
   }

}

Редактировать/

Мне не хватало того, что setRedirect / setRedirectUrl работает ПОСЛЕ отправки модуля, так что это мое рабочее решение на D8:

/**
 * Implements hook_form_FORM_ID_alter().
 */
function MYMODULE_form_FORM_ID_form_alter( array &$form, FormStateInterface $form_state, $form_id ) {
  $form['actions']['submit']['#submit'][] = 'MYFORM_redirect_handler';
}

function MYFORM_redirect_handler($form, FormStateInterface $form_state) {
  // Force redirect to "/sent"
  $dest_url = "/sent";
  $url = Url::fromUri('internal:' . $dest_url);
  $form_state->setRedirectUrl( $url );
}

Надеюсь, что это может помочь

nessunluogo
источник
1

Для Drupal 7, если вы хотите перенаправить на URL с такими параметрами, какsomeurl?param1=1&param2=2

$query = array(
  'param1' => '1',
   'param2' => '2',
 );
$form_state['redirect'] = array(
    'someurl',
    array(
      'query'    => $query,
      'fragment' => 'hash_fragment',
    ),
  );
berramou
источник