У меня есть пользовательский модуль, который отображает форму.
После отправки формы я хочу перенаправить пользователя на другую страницу.
Как я могу это сделать?
У меня есть пользовательский модуль, который отображает форму.
После отправки формы я хочу перенаправить пользователя на другую страницу.
Как я могу это сделать?
Ответы:
В обработчике отправки вы делаете
Drupal 7:
$form_state['redirect'] = 'url';
Drupal 8:
$form_state->setRedirect('route', $args, $options);
$form_state->setRedirectUrl(\Drupal\Core\Url);
/my-form?destination=node/123
.
Следует отметить, что существует несколько триггеров, которые могут предотвратить перенаправление:
$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
: означает, что форму нужно перестраивать без перенаправления.Для 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
Чтобы перенаправить на внешний URL-адрес в Drupal 8, используйте TrustedRedirectResponse
класс, как показано в следующем коде.
$response = new TrustedRedirectResponse('http://google.co.in');
$form_state->setResponse($response);
use
ключевым словом и его пространством имен:use Drupal\Core\Routing\TrustedRedirectResponse;
На 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 );
}
Надеюсь, что это может помочь