Am creat mai jos formularul de configurare personalizată admin, luând o referință la exemplele de mai jos:
- https://git.drupalcode.org/project/examples/-/blob/8.x-1.x/form_api_example/src/Form/AjaxAddMore.php
- Cum adaug un buton „Adăugați mai multe”?
Formularul meu personalizat este redat corect la prima încărcare, dar când fac clic pe butonul „Adăugați produs” nu se întâmplă nimic. Ca exemplu, formularul ar trebui să se reconstruiască din nou și să prevadă câmpurile. Presupun că aici ar putea fi posibil din cauza a ceva depreciat în Drupal 9, deoarece toate exemplele de mai sus funcționează bine în Drupal 8.
Cum pot adăuga corect butonul Adăugați mai multe?
<?php
namespace Drupal\commerce_product_quantity\Form;
utilizați Drupal;
utilizați Drupal\Core\Form\ConfigFormBase;
utilizați Drupal\Core\Form\FormStateInterface;
/**
* Configurați setările commerce_product_quantity pentru acest site.
*/
clasa SettingsForm extinde ConfigFormBase {
/**
* {@inheritdoc}
*/
funcția publică getFormId(): șir
{
returnează „comerț_produs_cantitate_setări”;
}
/**
* {@inheritdoc}
*/
funcția protejată getEditableConfigNames(): matrice
{
returnează ['commerce_product_quantity.settings'];
}
/**
* {@inheritdoc}
*/
funcția publică buildForm(array $form, FormStateInterface $form_state): matrice
{
/* Preluați toate produsele */
$rezultat = Drupal::entityQuery('produs_comerț')
->execute();
$titles = array('none' => "- Selectați -");
foreach ($rezultat ca $product_id) {
$entity_manager = \Drupal::entityTypeManager();
$produs = $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' => 'set de câmpuri',
'#title' => $this->t('Produse cu cantitatea totală permisă'),
'#attributes' => ['id' => 'product-fieldset-wrapper'],
];
dacă (gol ($field_count)) {
$form_state->set('fields_count', 1);
$field_count = 1;
}
pentru ($i = 0; $i < $field_count; $i++) {
$form['product_quantity_fieldset']['produs'.$i] = [
'#type' => 'selectați',
'#title' => t('Adăugați produs'),
'#options' => $titluri,
];
$configName = "commerce_product_quantity.settings.".$i;
$form['product_quantity_fieldset']['cantity'.$i] = [
'#type' => 'număr',
'#title' => $this->t('Cantitate'),
'#default_value' => $this->config($configName)->get('cantity'),
];
}
$form['actions'] = [
'#type' => 'acțiuni',
];
$form['product_quantity_fieldset']['actions']['add_name'] = [
'#type' => 'trimite',
'#value' => $this->t('Adăugați produs'),
'#submit' => array('::addOne'),
'#ajax' => [
'callback' => '::addmoreCallback',
'wrapper' => 'product-fieldset-wrapper',
],
];
dacă ($field_count > 1) {
$form['product_quantity_fieldset']['actions']['remove_name'] = [
'#type' => 'trimite',
'#value' => $this->t('Eliminați unul'),
'#submit' => array('::removeOne'),
'#ajax' => [
'callback' => '::removeCallback',
'wrapper' => 'product-fieldset-wrapper',
]
];
}
$form_state->setCached(FALSE);
$form['actions']['submit'] = [
'#type' => 'trimite',
'#value' => $this->t('Trimite'),
];
returnează $form;
}
funcția publică addOne(matrice &$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();
}
funcția publică removeOne(matrice &$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);
}
funcția publică addmoreCallback(matrice &$form, FormStateInterface $form_state) {
$add_button = $form_state->get('fields_count');
returnează $form['product_quantity_fieldset'];
}
funcția publică removeCallback(matrice &$form, FormStateInterface $form_state) {
$field_count = $form_state->get('fields_count');
dacă ($field_count > 1) {
$remove_button = $field_count - 1;
$form_state->set('fields_count', $remove_button);
}
$form_state->setRebuild(TRUE);
}
funcția publică validateForm(matrice &$form, FormStateInterface $form_state) {
}
funcția publică submitForm(matrice &$form, FormStateInterface $form_state) {
}
}