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


8

ฉันพยายามใช้ ajax เพื่ออัพเดทสองส่วนที่แตกต่างกันของรูปแบบ drupal จากเพียงแค่การเบลอของแบบฟอร์มเดียว

ฉันมีสิ่งอาแจ็กซ์มาตรฐานในการป้อนข้อมูลของฉัน:

$my_form['my_input']['#ajax'] = array(
  'callback' => 'my_callback',
  'wrapper' => 'my_target_div',
  'event' => 'blur',
);

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

เป็นไปได้หรือไม่ความคิดใด ๆ

แก้ไข: เพื่อความชัดเจนนี่คือตัวอย่างโลกจริงของฉัน:

  • ประเภทเนื้อหา 'ภาพยนตร์'
  • ฟิลด์ที่ถูกเพิ่ม 'primary_title'
  • เมื่อ 'primary_title' ได้รับการอัปเดต ajax callback ของฉันจะตรวจสอบสตริงที่คล้ายกันและส่งคืน html
  • html จากการเรียกกลับถูกแทรกลงใน div ที่ว่างเปล่า

    ส่วนนั้นทำงานได้ดี!

ฉันพยายามที่จะแก้ไขอินพุต 'ชื่อ' โหนดโหนดมาตรฐานโดยให้ค่าเป็น 'primary_title' หลังจากที่ฉันทำ regex เพื่อจัดเรียงสตริง (ลบ "The" หรือ "A" ออกจากจุดเริ่มต้น ฯลฯ ) ผลลัพธ์ จะเป็นสองเขตข้อมูลชื่อเรื่องหนึ่งชื่อที่มีชื่อว่า 'primary_title' และชื่อเรื่อง 'ที่ถูกตัดแต่ง' ซึ่งจะมีประโยชน์สำหรับการเรียงลำดับและแสดงระเบียน


คำตอบ:


13

ดูเหมือนว่าคุณสามารถกำหนดเป้าหมายส่วนต่าง ๆ ของแบบฟอร์มโดยใช้คำสั่ง ajax อย่างไรก็ตามคุณต้องเลือกที่จะส่งคืนหนึ่งในคำสั่งเดียวเท่านั้น :

  • HTML หรือ

  • อาร์เรย์ที่สามารถเรนเดอร์หรือ

  • อาร์เรย์ของคำสั่ง AJAX

ในสถานการณ์ที่ฉันเขียนเกี่ยวกับตอนแรกฉันพยายามคืนทั้งชุดของคำสั่ง AJAX และอาร์เรย์ที่สามารถเรนเดอร์ซึ่งดูเหมือนจะเป็นไปไม่ได้

โค้ดในตัวอย่างโมดูลสาธิตการกำหนดเป้าหมายส่วนต่างๆของแบบฟอร์มโดยใช้อาร์เรย์ของคำสั่ง AJAX:

function ajax_example_advanced_commands_html_callback($form, $form_state) {
  $text = $form_state['values']['html_command_example'];

  $commands = array();
  $commands[] = ajax_command_html('#html_div', $text);
  $commands[] = ajax_command_replace("#html_status", "<div id='html_status'>Updated html_command_example with text=$text;  " . date('r') . "</div>");
  return array('#type' => 'ajax', '#commands' => $commands);
}

ในตัวอย่างโค้ดนี้ #html_div ได้รับ $ text และ #html_status กำลังได้รับ "อัปเดต html_command_example พร้อมข้อความ = $ text;" วันที่ ('r') ""

สองตำแหน่งที่แตกต่างกันบนแบบฟอร์มที่มีข้อมูลสองส่วนที่แตกต่างกันจากการโทรกลับ ajax!

ดูอีกครั้งว่าฉันกำลังทำงานอะไรอยู่ฉันรู้ว่าฉันไม่จำเป็นต้องส่งคืนชื่อฟิลด์โหนดเลย มันจะเป็นเพียงฟิลด์ยูทิลิตี้ที่ใช้สำหรับการเรียงลำดับข้อมูลในรายการ

ฉันซ่อนฟิลด์บนฟอร์มโหนดและมันจะถูกเติมครั้งที่สองฟอร์มของฉันถูกสร้างขึ้นเมื่อ ajax callback เดิมของฉันถูกทริกเกอร์


0

ฉันค่อนข้างใหม่สำหรับ Drupal แต่จนถึงตอนนี้ฉันพบว่า Ajax framework ค่อนข้างไม่ยืดหยุ่น มันใช้งานได้ดีตราบใดที่คุณใช้มันตามที่ตั้งใจไว้ ดังนั้นในกรณีของคุณถ้าคุณรู้ว่า JS บางคนที่ดีที่สุดแน่นอนว่าจะทำให้สคริปต์นั้นเป็นตัวของคุณเองมันควรจะเบามาก

โชคดี!


ขอบคุณสำหรับคำแนะนำ :) ฉันรู้ว่าฉันไม่จำเป็นต้องส่งคืนฟิลด์ชื่อโหนดเลยเพราะมันถูกใช้เป็นฟิลด์ยูทิลิตี้เพื่อจัดระเบียบรายการ มันจะได้รับประชากรเมื่อฟอร์มของฉันถูกสร้างขึ้นมาใหม่เนื่องจากการโทรกลับ ajax ที่มีอยู่ของฉัน
Rick

0

ตัวเลือกอื่นจากdrupal.org :

คุณสามารถแทนที่แบบฟอร์มทั้งหมดได้อย่างง่ายดายหากทำได้ง่ายที่สุด เพียงเพิ่ม #prefix และ #suffix ให้กับอาร์เรย์ทั้งฟอร์มแล้วตั้งเป็น #ajax ['wrapper'] (สิ่งนี้จะช่วยให้คุณเปลี่ยนองค์ประกอบหลายรูปแบบผ่านการโทร ajax ครั้งเดียว) เหตุผลเดียวที่จะไม่ทำเช่นนี้ก็คือกระบวนการจะเร็วขึ้นหากการถ่ายโอนข้อมูลน้อยลง

ฟังก์ชั่นโทรกลับของคุณอาจจะง่ายเหมือน:

function _callback($form, $form_state) {
  return $form;
}

ที่ควรถูกเรียกจาก#ajaxอาเรย์บนองค์ประกอบของแบบฟอร์ม ( field_whateverตัวอย่างด้านล่าง) ที่กำหนดไว้ในhook_form_FORM_ID_alter()(หรือบางชนิดของแบบฟอร์มแก้ไขเบ็ด) ที่คุณยังทดสอบ$form_stateและทำการเปลี่ยนแปลงกับ$formอาเรย์เช่น:

 if (isset($form_state['values']['field_whatever'])){
     $form['field_something']['#disabled'] = TRUE;
     $form['field_something_else']['#disabled'] = FALSE;
 } else {
     $form['field_something']['#disabled'] = FALSE;
     $form['field_something_else']['#disabled'] = TRUE;
 }
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.