Як переадресувати на сторінку після надсилання форми


24

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

Після заповнення форми, я хочу, щоб перенаправити користувача на іншу сторінку.

Як я можу це зробити?

Відповіді:


31

У оброблювачі подання ви робите

Drupal 7:

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

Drupal 8:

$form_state->setRedirect('route', $args, $options);
$form_state->setRedirectUrl(\Drupal\Core\Url);

чи існує альтернативний спосіб зробити це? форми , мені потрібно , щоб перенаправлення будуються з власним обробником #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'], визначена вона чи НЕВЕРШОВА. Однак у випадку, якщо він не був визначений і поточний запит містить рядок запиту 'призначення', 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Засіб потребує формі, щоб бути відновлено без перенаправлення.

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);

Якщо це може допомогти, нам потрібно включити цей клас із useключовим словом та його простором імен:use Drupal\Core\Routing\TrustedRedirectResponse;
Sébastien Gicquel

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 );
}

Сподіваюся, що це могло б допомогти


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',
    ),
  );
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.