เพิ่มเขตข้อมูลไปยังกลุ่มฟิลด์โดยทางโปรแกรม


15

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

ฉันใช้ Hook_form_alter ฉันสังเกตเห็นว่าทุกฟิลด์มี 'und'attribute ซึ่งกลุ่มฟิลด์ที่เป็นสมาชิกอยู่ในรายการ แต่ถ้ามีการสร้างและ' und 'อาร์เรย์และเพิ่มชื่อกลุ่มฟิลด์ลงไปมันจะไม่ทำงาน .

ฉันควรทำอย่างไร


1
คุณสามารถใช้ field_group API hook_field_group_build_pre_render_alter กร้า () ( drupal.org/node/1017962 )
codeinthehole

คำตอบ:


20

มันค่อนข้างเก่า แต่ฉันต้องการทำสิ่งเดียวกันและหาคำตอบจากเว็บไม่ได้ ฉันคิดออกเอง

สมมติว่าคุณสร้างกลุ่มเขตข้อมูลผ่านส่วนต่อประสาน CMS ด้วยชื่อ "group_product_fields" คุณเพิ่มบางฟิลด์ในกลุ่มนั้น

ตอนนี้คุณมีฟิลด์ใหม่ที่รวมอยู่ในแบบฟอร์มโดยใช้โปรแกรมผ่าน hook_form_alter คุณต้องการเพิ่มฟิลด์นั้นใน "group_product_fields" นี่คือตัวอย่างของสนามที่อาจเป็น:

$form['new_product_field'] = array(
  '#type' => 'textfield',
  '#title' => t('New product field'),
  '#description' => t('Description for this new product field'),
);

สิ่งที่คุณต้องทำตอนนี้คือการเพิ่มเขตข้อมูลใหม่นั้นลงในกลุ่มเขตข้อมูล โดยเพิ่มบรรทัดด้านล่างลงใน hook_form_alter สามารถวางที่ใดก็ได้ข้างใน

$form['#group_children']['new_product_field'] = 'group_product_fields';

นั่นคือทั้งหมดที่ คุณอาจต้องการปรับน้ำหนักของสนามให้อยู่ในตำแหน่งที่คุณต้องการ แต่ในท้ายที่สุดมันง่ายจริงๆ :)


นี่ควรเป็นคำตอบที่ได้รับการยอมรับ IMO
m.stenta

6

การอ้างอิงหลังจากโดยทางโปรแกรมเพิ่มเขตข้อมูลลงในกลุ่มฟิลด์ :

$groups = field_group_read_groups(array(
  'entity_type' => 'node',
  'bundle'      => 'article',
  'mode'   => 'full'
));
$your_group = $groups['node']['article']['form']['group_your_group'];
$your_group->children[] = 'field_your_new_field';
field_group_group_save($your_group);

3
ฉันต้องการเปลี่ยนแบบฟอร์ม!
SA Malik

3
ถ้าอย่างนั้นฉันไม่เห็นสาเหตุที่คุณต้องการใช้โมดูลกลุ่มฟิลด์? เพียงกำหนดชุดเขตข้อมูลและย้ายเขตข้อมูลของคุณไปที่นั่น ตัวอย่างเช่น: drupal.stackexchange.com/questions/4049/…
Maciej Zgadzaj

เราสามารถใช้'mode' => 'form'หรือ'mode' => 'default'แทน'mode' => 'full'หรือเพียงแค่ละเว้นmodeเลย view_mode_name ใด ๆ ขอบคุณ @Maiq Fash
graceman9

สิ่งนี้มีวิธีในการกำหนดนิยามฟิลด์อีกครั้งไม่ต้องทำ form_alter - ไม่ใช่สิ่งที่ OP ขอ
aaronbauman

1

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

| เอนทิตี | varchar (32)
| มัด varchar (128)

| โหมด | varchar (128)

ฉันต้องใช้รูปแบบต่อไปนี้เพื่อให้มันใช้งานได้ แจ้งให้เราทราบหากฉันกำลังทำอะไรโง่ ๆ ที่นี่

$groups = field_group_read_groups(array(
  'entity_type' => 'node',
  'bundle' => 'bundle type',
  'mode' => 'view_mode_name'));

1

ลองดูที่ hook_field_group_build_pre_render_alter ()

สิ่งนี้เปิดโอกาสให้คุณเปลี่ยนโครงสร้างของกลุ่มของคุณโดยทางโปรแกรม

ตัวอย่างเช่นย้ายฟิลด์ "example_field" ไปยังกลุ่ม "group_example" จากองค์ประกอบของฟอร์มรูท:

function EXAMPLE_forms_field_group_build_pre_render_alter(&$form) {
  if (example_condition()) {
    $form['group_example'] = $form['group_example']['example_field'];
    unset($form['example_field']);
    // Further adjustments as necessary
  }
}

0

ขั้นแรกค้นหาชื่อกลุ่มเครื่องฟิลด์ของคุณในแผงควบคุม CMS จากนั้นทำการแก้ไขแบบฟอร์มของคุณ

$form['#group_children']['FIELD_MACHINE_NAME'] = 'GROUP_MACHINE_NAME';

สำหรับ instanst ฉันได้เพิ่มเมลฟิลด์ที่กำหนดเองลงในUser form field groupกลุ่มฟิลด์:

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