it-swarm-vi.com

Cách chuyển hướng đến một trang sau khi gửi biểu mẫu

Tôi có một mô-đun tùy chỉnh hiển thị một hình thức.

Khi gửi biểu mẫu, tôi muốn chuyển hướng người dùng đến một trang khác.

Làm thế nào tôi có thể làm điều đó?

24
Carlos Muñiz

Trong trình xử lý trình bạn làm

Drupal 7:

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

Drupal 8:

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

Cần lưu ý rằng có một số kích hoạt có thể ngăn chặn chuyển hướng:

  • $form_state['redirect'] === FALSE: Nếu được đặt, hàm xây dựng biểu mẫu hoặc trình xử lý biểu mẫu/trình xử lý biểu mẫu không muốn người dùng được chuyển hướng, điều đó có nghĩa là drupal_goto() không được gọi. Đối với hầu hết các biểu mẫu, logic chuyển hướng sẽ giống nhau bất kể $form_state['redirect'] Không được xác định hoặc FALSE. Tuy nhiên, trong trường hợp không được xác định và yêu cầu hiện tại chứa chuỗi truy vấn 'đích', drupal_goto() sẽ chuyển hướng đến đích đã cho thay thế. Chỉ đặt $form_state['redirect'] Thành FALSE sẽ ngăn mọi chuyển hướng.
  • $form_state['no_redirect'] === TRUE: Khi được đặt, cuộc gọi lại ban đầu được xây dựng biểu mẫu không cho phép bất kỳ chuyển hướng nào, bất kể giá trị chuyển hướng trong $form_state['redirect']. Ví dụ: ajax_get_form() định nghĩa $form_state['no_redirect'] Khi xây dựng một biểu mẫu trong một cuộc gọi lại AJAX để ngăn chặn mọi chuyển hướng. $form_state['no_redirect'] KHÔNG nên bị thay đổi bởi chức năng xây dựng biểu mẫu hoặc xác thực mẫu/gửi trình xử lý.
  • $form_state['programmed'] === TRUE: có nghĩa là việc gửi biểu mẫu thường được gọi thông qua drupal_form_submit(), vì vậy mọi chuyển hướng sẽ phá vỡ tập lệnh đã gọi drupal_form_submit().
  • $form_state['rebuild'] === TRUE: có nghĩa là biểu mẫu cần được xây dựng lại mà không cần chuyển hướng.
17
trampjuice

Với Drupal 7, tôi đã thử điều này trên một mô-đun tùy chỉnh và nó hoạt động. Nó cũng có thể được sử dụng trong một chủ đề:

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

BTW, tôi đã tìm thấy đoạn trích này ở đây: https://Gist.github.com/postrational/5768796

7

Để chuyển hướng đến một URL bên ngoài trong Drupal 8, hãy sử dụng lớp TrustedRedirectResponse , như trong đoạn mã sau.

$response = new TrustedRedirectResponse('http://google.co.in');
$form_state->setResponse($response);
4
DRUPWAY

Trên D8 tôi đã làm như thế này (nhưng điều này sẽ không hoạt động ... xem bên dưới):

/**
* 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])
     );    
   }

}

Biên tập/

Tôi đã thiếu rằng setRedirect/setRedirectUrl hoạt động SAU mô-đun được gửi, vì vậy đây là giải pháp làm việc của tôi trên 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 );
}

Hy vọng điều này có thể giúp

2
nessunluogo

Dành cho drupal 7 nếu bạn muốn chuyển hướng đến url với các thông số như someurl?param1=1&param2=2

$query = array(
  'param1' => '1',
   'param2' => '2',
 );
$form_state['redirect'] = array(
    'someurl',
    array(
      'query'    => $query,
      'fragment' => 'hash_fragment',
    ),
  );
1
berramou