วิธีเปลี่ยนเส้นทางไปยังหน้าหลังจากส่งแบบฟอร์ม


24

ฉันมีโมดูลที่กำหนดเองที่แสดงแบบฟอร์ม

เมื่อส่งแบบฟอร์มฉันต้องการเปลี่ยนเส้นทางผู้ใช้ไปยังหน้าอื่น

ฉันจะทำสิ่งนั้นได้อย่างไร

คำตอบ:


31

ในตัวจัดการการส่งที่คุณทำ

Drupal 7:

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

Drupal 8:

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

มีวิธีอื่นในการทำเช่นนี้หรือไม่? แบบฟอร์มที่ฉันต้องการเปลี่ยนเส้นทางนั้นสร้างขึ้นด้วย #submit handler ของตัวเอง (ตัวจัดการการส่งไม่ได้อยู่ในโมดูลที่กำหนดเอง) ดังนั้นฉันจึงไม่สามารถเข้าถึงรหัสได้
Carlos Muñiz

@Charlie ใช้ form_alter เพื่อเพิ่มของคุณเอง
googletorp

@Charlie ถ้าของคุณสามารถเข้าถึงส่วนใหญ่โดยการเชื่อมโยงใส่พารามิเตอร์ปลายทางใน /my-form?destination=node/123URL:
tostinni

ไม่ทำงานกับ D7 แต่ฉันพบสิ่งที่ทำ ตรวจสอบข้อความของฉันด้านล่าง
Ignacio Segura Postigo

ฉันแค่อยากจะบอกว่าขอบคุณที่ตอบ D7 จากนั้นกลับมาอีก 5 ปีเพื่ออัพเดตคำตอบสำหรับ D8 <3
ant

17

ควรสังเกตว่ามีทริกเกอร์หลายตัวที่อาจป้องกันการเปลี่ยนเส้นทาง:

  • $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: หมายถึงรูปแบบที่จะต้องสร้างใหม่โดยไม่ต้องเปลี่ยนเส้นทาง

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

BTW ฉันพบข้อมูลโค้ดนี้ที่นี่: 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 ด้วย params เช่นsomeurl?param1=1&param2=2

$query = array(
  'param1' => '1',
   'param2' => '2',
 );
$form_state['redirect'] = array(
    'someurl',
    array(
      'query'    => $query,
      'fragment' => 'hash_fragment',
    ),
  );
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.