ฉันมีโมดูลที่กำหนดเองที่แสดงแบบฟอร์ม
เมื่อส่งแบบฟอร์มฉันต้องการเปลี่ยนเส้นทางผู้ใช้ไปยังหน้าอื่น
ฉันจะทำสิ่งนั้นได้อย่างไร
ฉันมีโมดูลที่กำหนดเองที่แสดงแบบฟอร์ม
เมื่อส่งแบบฟอร์มฉันต้องการเปลี่ยนเส้นทางผู้ใช้ไปยังหน้าอื่น
ฉันจะทำสิ่งนั้นได้อย่างไร
คำตอบ:
ในตัวจัดการการส่งที่คุณทำ
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
URL:
ควรสังเกตว่ามีทริกเกอร์หลายตัวที่อาจป้องกันการเปลี่ยนเส้นทาง:
$form_state['redirect'] === FALSE
: หากตั้งค่าฟังก์ชันตัวสร้างฟอร์มหรือการตรวจสอบแบบฟอร์ม / ตัวจัดการส่งไม่ต้องการให้ผู้ใช้เปลี่ยนเส้นทางซึ่งหมายความdrupal_goto()
ว่าไม่ได้เรียกใช้ สำหรับรูปแบบส่วนใหญ่ตรรกะการเปลี่ยนเส้นทางจะเหมือนกันไม่ว่า$form_state['redirect']
จะไม่ได้กำหนดหรือเป็น FALSE อย่างไรก็ตามในกรณีที่มันไม่ได้ถูกกำหนดและคำขอปัจจุบันมีสตริงการสืบค้น 'ปลายทาง' drupal_goto()
จะเปลี่ยนเส้นทางไปยังปลายทางที่กำหนดแทน การตั้งค่าเฉพาะ$form_state['redirect']
เพื่อFALSE
ป้องกันการเปลี่ยนเส้นทางใด ๆ$form_state['no_redirect'] === TRUE
: เมื่อตั้งค่าการเรียกกลับที่สร้างขึ้นครั้งแรกในรูปแบบชัดเจนไม่อนุญาตให้เปลี่ยนเส้นทางใด ๆ $form_state['redirect']
โดยไม่คำนึงถึงความคุ้มค่าการเปลี่ยนเส้นทางใน ตัวอย่างเช่นajax_get_form()
กำหนด$form_state['no_redirect']
เมื่อสร้างแบบฟอร์มในการโทรกลับ AJAX เพื่อป้องกันการเปลี่ยนเส้นทางใด ๆ $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';
}
BTW ฉันพบข้อมูลโค้ดนี้ที่นี่: 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 );
}
หวังว่านี่จะช่วยได้
สำหรับdrupal 7ถ้าคุณต้องการเปลี่ยนเส้นทางไปยัง url ด้วย params เช่นsomeurl?param1=1¶m2=2
$query = array(
'param1' => '1',
'param2' => '2',
);
$form_state['redirect'] = array(
'someurl',
array(
'query' => $query,
'fragment' => 'hash_fragment',
),
);