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 đó?
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:
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);
/my-form?destination=node/123
.
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']
để FALSE
sẽ 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.Đố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
Để chuyển hướng đến một URL bên ngoài trong Drupal 8, hãy sử dụng TrustedRedirectResponse
lớp, như trong đoạn mã sau.
$response = new TrustedRedirectResponse('http://google.co.in');
$form_state->setResponse($response);
use
từ khóa và không gian tên của nó:use Drupal\Core\Routing\TrustedRedirectResponse;
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