Я создал ниже пользовательскую форму конфигурации администратора, взяв ссылку на приведенные ниже примеры:
- 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\Core\Form\ConfigFormBase;
используйте Drupal\Core\Form\FormStateInterface;
/**
* Настройте параметры commerce_product_quantity для этого сайта.
*/
класс SettingsForm расширяет ConfigFormBase {
/**
* {@inheritdoc}
*/
публичная функция getFormId(): строка
{
вернуть 'commerce_product_quantity_settings';
}
/**
* {@inheritdoc}
*/
защищенная функция getEditableConfigNames(): массив
{
return ['commerce_product_quantity.settings'];
}
/**
* {@inheritdoc}
*/
общедоступная функция buildForm (массив $ form, FormStateInterface $ form_state): массив
{
/* Получить все продукты */
$result = Drupal::entityQuery('commerce_product')
->выполнить();
$titles = array('none' => "- Выберите -");
foreach ($ результат как $ 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['#дерево'] = ИСТИНА;
$form['product_quantity_fieldset'] = [
'#тип' => 'набор полей',
'#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']['product'.$i] = [
'#тип' => 'выбрать',
'#title' => t('Добавить товар'),
'#options' => $названия,
];
$configName = "commerce_product_quantity.settings.".$i;
$form['product_quantity_fieldset']['количество'.$i] = [
'#тип' => 'число',
'#title' => $this->t('Количество'),
'#default_value' => $this->config($configName)->get('количество'),
];
}
$ форма ['действия'] = [
'#type' => 'действия',
];
$form['product_quantity_fieldset']['actions']['add_name'] = [
'#type' => 'отправить',
'#value' => $this->t('Добавить товар'),
'#submit' => массив('::addOne'),
'#ajax' => [
'обратный вызов' => '::addmoreCallback',
'обертка' => 'продукт-поле-обертка',
],
];
если ($field_count > 1) {
$form['product_quantity_fieldset']['actions']['remove_name'] = [
'#type' => 'отправить',
'#value' => $this->t('Удалить один'),
'#submit' => массив('::removeOne'),
'#ajax' => [
'обратный вызов' => '::removeCallback',
'обертка' => 'продукт-поле-обертка',
]
];
}
$form_state->setCached(FALSE);
$form['действия']['отправить'] = [
'#type' => 'отправить',
'#value' => $this->t('Отправить'),
];
вернуть $ форму;
}
публичная функция addOne (массив и $ форма, 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 (массив и $ форма, 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 (массив и $ форма, 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 (массив и $ форма, FormStateInterface $ form_state) {
}
публичная функция submitForm (массив и $ форма, FormStateInterface $ form_state) {
}
}