การแสดงแบบฟอร์มฟิลด์วิดเจ็ตที่ใช้งานได้เป็นไปได้หรือไม่?


21

ฉันสนใจที่จะฝัง Field Widget Form ข้างบริบทของโหนดการแก้ไขแบบฟอร์มทั้งหมด

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

การแสดงแบบฟอร์มฟิลด์วิดเจ็ตที่ใช้งานได้เป็นไปได้หรือไม่? อะไรจะเป็นวิธีที่ดีที่สุดในการทำเช่นนั้น?

ทั้งฟิลด์วิดเจ็ตและรูปแบบ "ปกติ" ดูเหมือนกันมากดังนั้นหากไม่สามารถทำได้สิ่งที่จะต้อง "เปลี่ยน" รูปแบบวิดเจ็ตเป็นรูปแบบปกติ?

คำถามนี้ดูเหมือนจะขอสิ่งที่คล้ายกัน แต่ฉันไม่เข้าใจคำตอบ คำตอบนั้นระบุโดยใช้hook_field_widget_form_alter ; สิ่งที่ฉันไม่เข้าใจคือวิธีทำให้ฟอร์มฟิลด์แสดงไม่ใช่วิธีเชื่อมต่อเมื่อมีการสร้างขึ้น

คำตอบ:


18

VBO ทำอะไรเช่นนี้ใน modified.action.inc:

$form_key = 'bundle_' . $bundle_name;
$form[$form_key] = array(
  '#type' => 'fieldset',
  '#title' => $label,
  '#parents' => array($form_key),
);  
field_attach_form($context['entity_type'], $entity, $form[$form_key], $form_state, LANGUAGE_NONE);  

ดังนั้นคุณต้องมีประเภทเอนทิตีเอนทิตี (ซึ่งอาจเป็นวัตถุว่างเปล่าที่มีเพียงชุดคีย์บันเดิลนั่นคือสิ่งที่ใช้จริง) รูปแบบที่เพิ่มวิดเจ็ตและภาษา หากคุณต้องการฝังวิดเจ็ตลงในแบบฟอร์มให้ลึกลงไป (ไม่ใช่ในรูปแบบ $ form แต่ในรูปแบบ $ form [$ form_key] อย่างที่ฉันทำหรือมากกว่านั้น) form form นั้นต้องตั้งค่า #parents

แน่นอนโปรดสังเกตว่าสิ่งนี้จะฝังวิดเจ็ตของฟิลด์ทั้งหมดที่เป็นของประเภทเอนทิตี & ชุดข้อมูล นี่คือวิธีการเขียนฟังก์ชั่นการแนบ การไปรอบ ๆ นั้นต้องการให้คุณสร้างรหัสใหม่อีกครั้ง ดูรหัสจริงที่ทำให้การยกของหนัก สิ่งที่ฉันทำคือผ่านอินสแตนซ์ของฟิลด์รับ $ field_name แต่ละรายการและถ้าประเภทของฟิลด์นั้นไม่สนใจฉันฉันจะตั้งค่าให้$form[$form_key][$field_name]['#access'] = FALSE; ซ่อนวิดเจ็ตเหล่านั้นจากสายตา

แก้ไข: เอาล่ะ ctools มี ctools_field_invoke_field () ซึ่งในทางทฤษฎีอนุญาตให้คุณทำงานบนพื้นฐานของแต่ละฟิลด์ ฉันไม่เคยใช้มันเลย ข้อความข้างต้นคือประสบการณ์ตรงของฉัน


คำตอบที่ยอดเยี่ยม ฉันใช้เวลาส่วนหนึ่งไปกับการทำงานกับสิ่งนี้และมันก็ใช้ได้เหมือนที่ฉันต้องการ ได้รับรางวัลมากมายและฉันแนะนำให้ OP ยอมรับว่านี่เป็นคำตอบที่ถูกต้อง ฉันสิ้นสุดการสร้างประเภทเนื้อหาจำลองเพื่อให้ฉันสามารถควบคุมฟิลด์ของฉันเหมือนประเภทเนื้อหาอื่น ๆ ได้แทนที่จะตั้งค่า#access = FALSEซึ่งดูเหมือนว่าแฮ็คในบริบทนี้
Letharion

ขอขอบคุณที่ยืนยันสิ่งที่ฉันกลัว: เครื่องมือฟิลด์เดียวไม่สามารถใช้งานได้จริง
SMTF

7

ฉันใช้ฟังก์ชั่นที่แนะนำโดย ttk อย่างเข้มข้น แต่ฉันคิดว่าการอัปเดตล่าสุดทำให้สิ่งต่าง ๆ ยุ่งเหยิง ...

นี่เป็นเวอร์ชั่นใหม่ของโซลูชันก่อนหน้าซึ่งทำงานได้ดีกับ Drupal 7.22 และ ctools 7.x-1.3

ดังนั้นเช่นเดียวกับในโพสต์ก่อนหน้าคุณเรียกฟังก์ชั่นที่คุณกำหนดเองเช่นนี้:

my_field_attach_form('field_body', 'node', 'blog',  $node, $form, $form_state, LANGUAGE_NONE);

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

และmy_field_attach_formถูกกำหนดเป็น:

function my_field_attach_form($field_name, $entity_type, $bundle, $entity, &$form, &$form_state, $langcode = NULL) {

  // Set #parents to 'top-level' if it doesn't exist.
  $form += array('#parents' => array());

  // If no language is provided use the default site language.
  $options = array(
    'language' => field_valid_language($langcode),
    'default' => TRUE,
  );

  // Append to the form
  ctools_include('fields');
  $field_instance = field_info_instance($entity_type, $field_name, $bundle);
  $form += (array) ctools_field_invoke_field($field_instance, 'form', $entity_type, $entity, $form, $form_state, $options);
}

ฟังก์ชั่นนี้ช่วยฉันได้มากฉันหวังว่ามันจะช่วยคุณเช่นกัน!


5

นี่คือวิธีการแก้ปัญหาโดยใช้ctools_field_invoke_field()วิธีการ ในฟังก์ชั่นรูปแบบกำหนดเองของคุณเพิ่ม:

$form = array();
$node = new stdClass();
$node->type = 'blog';
my_field_attach_form('field_body', 'node', $node, $form, $form_state, LANGUAGE_NONE);

ที่my_field_attach_formฟังก์ชั่นถูกกำหนดให้เป็น

function my_field_attach_form($field_name, $entity_type, $entity, &$form, &$form_state, $langcode = NULL) {
  // Set #parents to 'top-level' if it doesn't exist.
  $form += array('#parents' => array());

  // If no language is provided use the default site language.
  $options = array(
    'language' => field_valid_language($langcode),
    'default' => TRUE,
  );
  module_load_include("inc","ctools","includes/fields");
  $form += (array) ctools_field_invoke_field($field_name, 'form', $entity_type, $entity, $form, $form_state, $options);
}

โปรดทราบว่าเว็บไซต์ของคุณต้องเปิดใช้ ctools มันแย่มากที่ Drupal ไม่ได้รวมฟังก์ชั่นตัวช่วยเช่นนี้ไว้เป็นค่าเริ่มต้น


2

ฉันไม่สามารถใช้วิธีการ ctools ได้และตัดสินใจทำเช่นนี้แทน

รหัสนี้จะอยู่ในฟังก์ชั่นแบบฟอร์มดังนั้น $ form และ $ form_state จะถูกส่งผ่านไปแล้ว

function form_function($form, &$form_state) {

ขั้นแรกให้สร้างโหนดว่างเปล่าของประเภทที่มีเขตข้อมูลที่คุณต้องการแสดงผล

    $entity = new stdClass();
    $entity->title = "Temp Object";
    $entity->type = "node_type";
    node_object_prepare($entity);

ฉันทำซ้ำตัวแปรแบบฟอร์มดังนั้นฉันจะไม่ปิดบังต้นฉบับ

    $temp_form       = $form;
    $temp_form_state = $form_state;
    field_attach_form("node", $entity, $temp_form, $temp_form_state);

ดึงเขตข้อมูลที่คุณกำลังค้นหาและเพิ่มลงในแบบฟอร์ม

    $form["field"] = $temp_form["existing_field"];
}

ฉันใช้วิธีนี้เพื่อแสดงวิดเจ็ตการเลือก taxonomy, วิดเจ็ตกล่องกาเครื่องหมาย taxonomy และวิดเจ็ตHierarchical Selectในรูปแบบที่กำหนดเอง (Taxonomy การเติมข้อความอัตโนมัติวิดเจ็ตทำให้เกิดข้อผิดพลาดในการส่ง)

ในที่สุดการแสดงผลและพิมพ์

drupal_render(drupal_get_form("form_function"))

นี่ดูเหมือนจะเป็นวิธีที่ง่ายในการใช้วิดเจ็ตฟิลด์ในแบบฟอร์มที่กำหนดเอง ขึ้นอยู่กับบันเดิลที่มีอยู่แล้ว ในกรณีของฉันฉันใช้ประเภทเนื้อหาจำลองที่ฉันสร้างและกำหนดค่าฟิลด์ตามต้องการ มันค่อนข้างแฮ็ก แต่จำเป็นสำหรับวิธีอื่นด้วย เพื่อทราบ: ctools_field_invoke_field()วิธีการที่อธิบายไว้ข้างต้นใช้ได้เช่นกัน
Bernhard Fürst

0

ฉันได้สร้างแบบฟอร์มจากการใช้ฟิลด์เฉพาะ

field_default_form('entity_type', $entity, $field,$field_instance,LANGUAGE_NONE,$default_value, $form, $form_state);

สิ่งนี้ควรส่งคืนวิดเจ็ตที่ต้องการซึ่งสามารถใช้ในรูปแบบใด ๆ เช่น

 $custom_form['form_element_to_display'] = field_default_form('entity_type', $entity, $field,$field_instance,LANGUAGE_NONE,$default_value, $custom_form, $custom_form_state);

ในการรับค่าสำหรับพารามิเตอร์ 2 ด้านบนให้ใช้:

$field = field_info_field($field_name);
$field_instance = field_info_instance('node', $field_name, $node_type);

สำหรับพารามิเตอร์อื่น ๆ คุณสามารถตรวจสอบลิงค์ API ที่นี่

สิ่งนี้จะส่งคืนรูปแบบวิดเจ็ตเริ่มต้นที่กำหนดไว้ในฟิลด์ประเภทเนื้อหา

หวังว่าจะช่วยให้ใครบางคน :)

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