ฉันได้สร้างแบบฟอร์มการกำหนดค่าที่กำหนดเองของผู้ดูแลระบบด้านล่างโดยอ้างอิงจากตัวอย่างด้านล่าง:
- https://git.drupalcode.org/project/examples/-/blob/8.x-1.x/form_api_example/src/Form/AjaxAddMore.php
- ฉันจะเพิ่มปุ่ม "เพิ่มเติม" ได้อย่างไร
แบบฟอร์มที่กำหนดเองของฉันแสดงผลอย่างถูกต้องในการโหลดครั้งแรก แต่เมื่อฉันคลิกที่ปุ่ม "เพิ่มผลิตภัณฑ์" จะไม่มีอะไรเกิดขึ้น ตามตัวอย่าง แบบฟอร์มควรสร้างใหม่อีกครั้งและเพิ่มฟิลด์ ฉันคิดว่าที่นี่อาจเป็นไปได้เนื่องจากมีบางสิ่งที่เลิกใช้แล้วใน Drupal 9 เนื่องจากตัวอย่างทั้งหมดข้างต้นทำงานได้ดีใน Drupal 8
ฉันจะเพิ่มปุ่มเพิ่มอย่างถูกต้องได้อย่างไร
<?php
เนมสเปซ Drupal\commerce_product_quantity\Form;
ใช้ Drupal;
ใช้ Drupal\Core\Form\ConfigFormBase;
ใช้ Drupal\Core\Form\FormStateInterface;
/**
* กำหนดการตั้งค่า commerce_product_quantity สำหรับไซต์นี้
*/
คลาส SettingsForm ขยาย ConfigFormBase {
/**
* {@inheritdoc}
*/
ฟังก์ชันสาธารณะ getFormId(): สตริง
{
ส่งคืน 'commerce_product_quantity_settings';
}
/**
* {@inheritdoc}
*/
ฟังก์ชันที่ได้รับการป้องกัน getEditableConfigNames(): อาร์เรย์
{
ส่งคืน ['commerce_product_quantity.settings'];
}
/**
* {@inheritdoc}
*/
ฟังก์ชันสาธารณะ buildForm (อาร์เรย์ $form, FormStateInterface $form_state): อาร์เรย์
{
/* ดึงข้อมูลสินค้าทั้งหมด */
$result = Drupal::entityQuery('commerce_product')
->ดำเนินการ ();
$titles = array('ไม่มี' => "- เลือก -");
foreach (ผลลัพธ์ $ เป็น $ product_id) {
$entity_manager = \Drupal::entityTypeManager();
$product = $entity_manager->getStorage('commerce_product')->โหลด($product_id);
$titles[$product->product_id->value] = $product->get('title')->value;
}
$field_count = $form_state->get('fields_count');
$form['#tree'] = TRUE;
$form['product_quantity_fieldset'] = [
'#type' => 'ชุดฟิลด์',
'#title' => $this->t('สินค้าที่มีจำนวนรวมที่อนุญาต'),
'#attributes' => ['id' => 'product-fieldset-wrapper'],
];
ถ้า (ว่าง ($ field_count)) {
$form_state->set('fields_count', 1);
$field_count = 1;
}
สำหรับ ($i = 0; $i < $field_count; $i++) {
$form['product_quantity_fieldset']['ผลิตภัณฑ์'.$i] = [
'#type' => 'เลือก',
'#title' => t('เพิ่มสินค้า'),
'#options' => $ชื่อ,
];
$configName = "commerce_product_quantity.settings.".$i;
$form['product_quantity_fieldset']['quantity'.$i] = [
'#type' => 'หมายเลข',
'#title' => $this->t('ปริมาณ'),
'#default_value' => $this->config($configName)->get('ปริมาณ'),
];
}
$แบบฟอร์ม['การกระทำ'] = [
'#type' => 'การกระทำ',
];
$form['product_quantity_fieldset']['actions']['add_name'] = [
'#type' => 'ส่ง',
'#value' => $this->t('เพิ่มสินค้า'),
'#submit' => อาร์เรย์('::addOne'),
'#อาแจ็กซ์' => [
'callback' => '::addmoreCallback',
'wrapper' => 'product-fieldset-wrapper',
]
];
ถ้า ($field_count > 1) {
$form['product_quantity_fieldset']['actions']['remove_name'] = [
'#type' => 'ส่ง',
'#value' => $this->t('ลบหนึ่งรายการ'),
'#submit' => อาร์เรย์('::removeOne'),
'#อาแจ็กซ์' => [
'callback' => '::removeCallback',
'wrapper' => 'product-fieldset-wrapper',
]
];
}
$form_state->setCached(เท็จ);
$form['actions']['submit'] = [
'#type' => 'ส่ง',
'#value' => $this->t('ส่ง'),
];
คืนฟอร์ม $;
}
ฟังก์ชันสาธารณะ addOne (อาร์เรย์ &$form, FormStateInterface $form_state) {
$field_count = $form_state->get('fields_count');
$add_button = $field_count + 1;
\Drupal::messenger()->addStatus($add_button);
$form_state->set('fields_count', $add_button);
$form_state->setRebuild();
}
ฟังก์ชันสาธารณะ removeOne (อาร์เรย์ &$form, FormStateInterface $form_state) {
$field_count = $form_state->get('num_names');
$add_button = $field_count + 1;
$form_state->set('num_names', $add_button);
$form_state->setRebuild(จริง);
}
ฟังก์ชันสาธารณะ addmoreCallback (อาร์เรย์ &$form, FormStateInterface $form_state) {
$add_button = $form_state->get('fields_count');
ส่งคืน $form['product_quantity_fieldset'];
}
ฟังก์ชั่นสาธารณะ removeCallback (อาร์เรย์ & $ ฟอร์ม, FormStateInterface $ form_state) {
$field_count = $form_state->get('fields_count');
ถ้า ($field_count > 1) {
$remove_button = $field_count - 1;
$form_state->set('fields_count', $remove_button);
}
$form_state->setRebuild(จริง);
}
ฟังก์ชันสาธารณะ validateForm (อาร์เรย์ &$form, FormStateInterface $form_state) {
}
ฟังก์ชันสาธารณะ submitForm (อาร์เรย์ &$form, FormStateInterface $form_state) {
}
}