Tôi đã tạo biểu mẫu cấu hình tùy chỉnh dành cho quản trị viên bên dưới bằng cách tham khảo các ví dụ bên dưới:
- https://git.drupalcode.org/project/examples/-/blob/8.x-1.x/form_api_example/src/Form/AjaxAddMore.php
- Làm cách nào để thêm nút "Thêm nhiều hơn"?
Biểu mẫu tùy chỉnh của tôi được hiển thị chính xác trong lần tải đầu tiên nhưng khi tôi nhấp vào nút "Thêm sản phẩm" thì không có gì xảy ra. Theo ví dụ, biểu mẫu sẽ được xây dựng lại và thêm vào trước các trường. Tôi cho rằng ở đây có thể là do một số thứ không được dùng nữa trong Drupal 9 vì tất cả các ví dụ trên đều hoạt động tốt trong Drupal 8.
Làm cách nào tôi có thể thêm chính xác nút Thêm nữa?
<?php
không gian tên Drupal\commerce_product_quantity\Form;
sử dụng Drupal;
sử dụng Drupal\Core\Form\ConfigFormBase;
sử dụng Drupal\Core\Form\FormStateInterface;
/**
* Định cấu hình cài đặt commerce_product_quantity cho trang web này.
*/
lớp SettingsForm mở rộng ConfigFormBase {
/**
* {@inheritdoc}
*/
hàm công khai getFormId(): chuỗi
{
trả về 'cài đặt_sản_phẩm_quantity_thương_mại';
}
/**
* {@inheritdoc}
*/
hàm được bảo vệ getEditableConfigNames(): mảng
{
return ['commerce_product_quantity.settings'];
}
/**
* {@inheritdoc}
*/
hàm công khai buildForm(mảng $form, FormStateInterface $form_state): mảng
{
/* Lấy tất cả sản phẩm */
$result = Drupal::entityQuery('commerce_product')
->thực thi();
$titles = array('none' => "- Chọn -");
foreach ($kết quả là $product_id) {
$entity_manager = \Drupal::entityTypeManager();
$product = $entity_manager->getStorage('commerce_product')->load($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' => 'bộ trường',
'#title' => $this->t('Sản phẩm có tổng số lượng cho phép'),
'#attributes' => ['id' => 'product-fieldset-wrapper'],
];
nếu (trống ($field_count)) {
$form_state->set('fields_count', 1);
$field_count = 1;
}
for ($i = 0; $i < $field_count; $i++) {
$form['product_quantity_fieldset']['product'.$i] = [
'#type' => 'chọn',
'#title' => t('Thêm sản phẩm'),
'#options' => $titles,
];
$configName = "commerce_product_quantity.settings.".$i;
$form['product_quantity_fieldset']['quantity'.$i] = [
'#type' => 'số',
'#title' => $this->t('Số lượng'),
'#default_value' => $this->config($configName)->get('số lượng'),
];
}
$form['hành động'] = [
'#type' => 'hành động',
];
$form['product_quantity_fieldset']['actions']['add_name'] = [
'#type' => 'gửi',
'#value' => $this->t('Thêm Sản phẩm'),
'#submit' => mảng('::addOne'),
'#ajax' => [
'gọi lại' => '::addmoreCallback',
'trình bao bọc' => 'trình bao bọc bộ trường sản phẩm',
],
];
nếu ($field_count > 1) {
$form['product_quantity_fieldset']['actions']['remove_name'] = [
'#type' => 'gửi',
'#value' => $this->t('Xóa một'),
'#submit' => mảng('::removeOne'),
'#ajax' => [
'gọi lại' => '::removeCallback',
'trình bao bọc' => 'trình bao bọc bộ trường sản phẩm',
]
];
}
$form_state->setCached(FALSE);
$form['actions']['submit'] = [
'#type' => 'gửi',
'#value' => $this->t('Gửi'),
];
trả về biểu mẫu $;
}
hàm công cộng addOne(mảng &$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();
}
hàm công khai removeOne(mảng &$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(TRUE);
}
chức năng công cộng addmoreCallback(mảng &$form, FormStateInterface $form_state) {
$add_button = $form_state->get('fields_count');
trả về $form['product_quantity_fieldset'];
}
hàm công khai removeCallback(mảng &$form, FormStateInterface $form_state) {
$field_count = $form_state->get('fields_count');
nếu ($field_count > 1) {
$remove_button = $field_count - 1;
$form_state->set('fields_count', $remove_button);
}
$form_state->setRebuild(TRUE);
}
hàm công khai validateForm(mảng &$form, FormStateInterface $form_state) {
}
hàm công khai submitForm(mảng &$form, FormStateInterface $form_state) {
}
}