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

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

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

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

20 голосов | спросил Carlos Muñiz 25 J0000006Europe/Moscow 2011, 23:18:29

5 ответов


28

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

Drupal 7:

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

Drupal 8:

$form_state->setRedirect('route', $args, $options);
$form_state->setRedirectUrl(\Drupal\Core\Url);
ответил googletorp 25 J0000006Europe/Moscow 2011, 23:28:11
16

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

  • $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 3 rdEurope/Moscowp30Europe/Moscow09bEurope/MoscowSat, 03 Sep 2011 15:55:04 +0400 2011, 15:55:04
5

Для 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

ответил Ignacio Segura Postigo 1 stEurope/Moscowp30Europe/Moscow09bEurope/MoscowMon, 01 Sep 2014 20:43:18 +0400 2014, 20:43:18
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 12 Maypm17 2017, 18:14:02
1

Для перенаправления внешнего URL-адреса в D8.

Использовать класс TrustedRedirectResponse

$response = new TrustedRedirectResponse('http://google.co.in');
$form_state->setResponse($response);
ответил Smalution 16 Jpm1000000pmTue, 16 Jan 2018 15:43:45 +030018 2018, 15:43:45

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132