У мене є для користувача модуль, який відображає форму.
Після заповнення форми, я хочу, щоб перенаправити користувача на іншу сторінку.
Як я можу це зробити?
У мене є для користувача модуль, який відображає форму.
Після заповнення форми, я хочу, щоб перенаправити користувача на іншу сторінку.
Як я можу це зробити?
Відповіді:
У оброблювачі подання ви робите
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']
, визначена вона чи НЕВЕРШОВА. Однак у випадку, якщо він не був визначений і поточний запит містить рядок запиту 'призначення', drupal_goto()
замість цього буде перенаправлено на вказане призначення. Лише налаштування $form_state['redirect']
на FALSE
запобігає перенаправлення.$form_state['no_redirect'] === TRUE
: Якщо встановлено, зворотний виклик, який спочатку створив форму, явно забороняє будь-яке перенаправлення, незалежно від значення переадресації в $form_state['redirect']
.ajax_get_form()
$form_state['no_redirect']
$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 );
}
Сподіваюся, що це могло б допомогти