เปลี่ยนเส้นทางไปยังหน้าเว็บที่กำหนดเองหลังจากที่เพิ่มหรือแก้ไขโหนดแล้ว


15

การใช้hook_form_alterฉันจะเปลี่ยนเส้นทางผู้ใช้ไปยังเพจที่กำหนดเองหลังจากสร้างหรือแก้ไขโหนดแทนโหนดที่สร้างหรือแก้ไขได้อย่างไร

รหัสปัจจุบันสำหรับhook_form_alter()เป็นรหัสต่อไปนี้:

function custom_form_alter(&$form, &$form_state, $form_id) {
  if ($form['#id'] == 'custom-node-form') {
    $form['actions']['submit']['#value'] = t('Add Entry');
    $form['field_custom_email']['und'][0]['value']['#element_validate'] = array('_custom_form_validate_email');
  }
}

"มีโมดูลสำหรับสิ่งนั้น": โหนดปลายทาง ( drupal.org/project/node_destination ) แต่มีเฉพาะสำหรับ D6 เท่านั้น บางทีมันอาจจะถูกดัดแปลง
เบ็ก

คำตอบ:


16
function custom_form_node_form_alter(&$form, &$form_state, $form_id) {
  if ($form['#node']->type == 'custom') {
    $form['actions']['submit']['#value'] = t('Add Entry');
    $form['field_custom_email']['und'][0]['value']['#element_validate'] = array('_custom_form_validate_email');
    $form['#submit'][] = 'custom_node_submit';
  }
}

function custom_node_submit($form, &$form_state) {
  $form_state['redirect'] = 'choose/your/path';
}

รหัสเปลี่ยนเส้นทางแบบฟอร์มอย่างอิสระจากปุ่มคลิกเพื่อส่งแบบฟอร์ม หากคุณต้องการเปลี่ยนเส้นทางแบบฟอร์มเฉพาะเมื่อมีการคลิกปุ่มส่งเฉพาะคุณควรใช้รหัสต่อไปนี้

function custom_form_node_form_alter(&$form, &$form_state, $form_id) {
  if ($form['#node']->type == 'custom') {
    $form['actions']['submit']['#value'] = t('Add Entry');
    $form['field_custom_email']['und'][0]['value']['#element_validate'] = array('_custom_form_validate_email');
    $form['actions']['submit']['#submit'][] = 'custom_node_submit';
  }
}

function custom_node_submit($form, &$form_state) {
  $form_state['redirect'] = 'choose/your/path';
}

 

  • ID แบบฟอร์มไม่มีขีดกลาง ID ของฟอร์มคือชื่อของฟังก์ชัน PHP ที่สร้างฟอร์ม (หรือที่เรียกว่า form builder) และฟังก์ชั่น PHP ไม่สามารถมียัติภังค์ในชื่อได้
  • แบบฟอร์ม ID ที่ถูกส่งไปยังการใช้งานของhook_form_alter () , hook_form_BASE_FORM_ID_alter ()และhook_form_FORM_ID_alter () hook_form_FORM_ID_alter()ไม่ต้องการจริงๆเนื่องจากมีการเรียกใช้แบบฟอร์มเฉพาะในขณะที่อีกสอง hooks ถูกเรียกใช้สำหรับมากกว่าหนึ่งรูปแบบ
  • ฟังก์ชั่นแรกคือการใช้งานของhook_form_BASE_FORM_ID_alter () ; ในกรณีนี้ ID รูปแบบพื้นฐานคือ "node_form" ซึ่งเป็นรูปแบบพื้นฐานสำหรับฟอร์มแก้ไขโหนด
  • แบบฟอร์มการแก้ไขโหนดมี$form['#node']ซึ่งเป็นวัตถุโหนดสำหรับวัตถุที่กำลังแก้ไข; "กำหนดเอง" เป็น ID ย่อสำหรับประเภทเนื้อหาที่คุณต้องการเปลี่ยนเส้นทางผู้ใช้เมื่อพวกเขาแก้ไขโหนด
  • การเปลี่ยนแปลง$form_state['redirect']จากhook_form_alter()ไม่มีผลใด ๆ จำเป็นต้องตั้งค่าจากตัวจัดการการส่ง

ขอบคุณสำหรับสิ่งนี้. โปรดทราบว่า&ในfunction custom_node_submit($form, &$form_state) {มีความสำคัญมาก มิฉะนั้นคุณจะไม่ผ่านสถานะดังกล่าวเพื่อเป็นข้อมูลอ้างอิงและการแก้ไขที่คุณทำเองจะไม่ส่งผลกระทบใด ๆ
Bram

9

รหัสนี้ใช้ได้กับไซต์ Drupal 7

/**
 * Implements hook_form_alter()
 */

function custom_form_alter(&$form, &$form_state, $form_id) {    
  if ($form_id == 'article_node_form') {
    $form['actions']['submit']['#submit'][] = 'mysubmit_node_submit';
  }     
}

function mysubmit_node_submit($form, &$form_state) {
  $form_state['redirect'] = '/homepage';
}

คำตอบใดที่คุณอ้างถึงเป็น # 4
ЕлинЙ

ทำไมสิ่งนี้ไม่ทำงานสำหรับฉัน ฉันใช้รหัสเดียวกัน
ทับทิม

ล้างแคช @ruby ของคุณหรือไม่
coderama

สำหรับโหนดที่มีอยู่คุณดีกว่าที่จะให้แน่ใจว่าล้างค่าปลายทางแรกซึ่งปกติจะถูกเพิ่ม URL เมื่อคุณคลิกแก้ไขปุ่มบนadmin/contentหน้านี้: drupal.stackexchange.com/a/192271/15055
leymannx

4

สิ่งนี้สามารถทำได้โดยการตั้งค่า$form_state['redirect']ตัวอย่างเช่นใช้หนึ่งในบรรทัดต่อไปนี้

$form_state['redirect'] = "some-internal-path";
$form_state['redirect'] = array($path, $options_array, $http_code);

drupal_goto()มันขัดแย้งกันที่คุณจะส่งผ่านไปยัง


ขอบคุณสำหรับคำติชม @Shoaib Nawaz ฉันได้เพิ่ม $ form_state ['redirect'] ไปที่ hook_form_alter hook โดยไม่มีโชค
Citricguy

สำหรับชีวิตของฉันฉันไม่สามารถรับ $ form_state ['redirect'] ให้มีผลได้ทุกที่
Citricguy

สิ่งนี้จะไม่ทำงานหากคุณพยายามเปลี่ยนเส้นทางหลังจากมีการเพิ่มหรือแก้ไขโหนด เพื่อดูว่าทำไมใช้เวลาดูที่รูปแบบโหนดส่ง ค่าใดก็ตามที่คุณกำหนดให้$form_state['redirect']จะถูกเขียนทับหาก($node->nid)ประเมินเป็น TRUE
ฟรี Radical

2

ไม่แน่ใจว่านี่เป็นตัวเลือกสำหรับคุณหรือไม่ แต่ถ้านี่เป็นประเภทเนื้อหาคุณสามารถทำสิ่งนี้ได้อย่างรวดเร็วโดยใช้โมดูลกฎโดยการตั้งค่ากฎที่จะถูกเรียกใช้ในการอัปเดตหรือสร้างเนื้อหาบางประเภท

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.