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


24

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 đó?

Câu trả lời:


31

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

Có một cách khác để làm điều này? các biểu mẫu tôi cần chuyển hướng được xây dựng bằng trình xử lý #submit của riêng nó (trình xử lý gửi không được đặt trong mô-đun tùy chỉnh của tôi), vì vậy tôi không có quyền truy cập vào mã.
Carlos Muñiz

@Charlie sử dụng form_alter để thêm của riêng bạn.
googletorp

@Charlie nếu liên kết của bạn chủ yếu có thể truy cập bằng liên kết, hãy đặt tham số đích trong URL : /my-form?destination=node/123.
tostinni

Không hoạt động trên D7, nhưng tôi đã tìm thấy một cái gì đó. Kiểm tra tin nhắn của tôi dưới đây.
Ignacio Segura Postigo

Tôi chỉ muốn nói cảm ơn vì đã trả lời cho D7, sau đó quay lại 5 năm sau để cập nhật câu trả lời cho D8. <3
con kiến

17

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, chức năng trình tạo biểu mẫu hoặc trình xác thực / 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à điều đó drupal_goto()không được gọi. Đối với hầu hết các hình thức, logic chuyển hướng sẽ giống nhau bất kể $form_state['redirect']là không xác định hay 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ỉ thiết lập $form_state['redirect']để FALSEsẽ ngăn chặn bất kỳ 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()xác định $form_state['no_redirect']khi xây dựng biểu mẫu trong 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 được thay đổi bởi các hàm xây dựng biểu mẫu hoặc xác thực / gửi trình xử lý biểu mẫu.
  • $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 được gọi drupal_form_submit().
  • $form_state['rebuild'] === TRUE: có nghĩa là hình thức cần phải được xây dựng lại mà không cần chuyển hướng.

7

Đối 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 tại đây: https://gist.github.com/postrational/5768796


4

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

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

Trong trường hợp nó có thể giúp ích, chúng ta cần bao gồm lớp này với usetừ khóa và không gian tên của nó:use Drupal\Core\Routing\TrustedRedirectResponse;
Sébastien Gicquel

2

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

}

Chỉnh sửa/

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


1

Đối với 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',
    ),
  );
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.