web-dev-qa-db-fra.com

Supprimer un élément de $ form_state dans un rappel ajax

J'utilise cet exemple d'api de formulaire: AjaxAddMore . Je veux ajouter un "bouton supprimer" pour chaque élément individuel, afin de supprimer un élément mais pas le dernier. Thouse sont mes changements:

...
  $form['names_fieldset'] = [
      '#type' => 'fieldset',
      '#title' => $this->t('People coming to picnic'),
      '#prefix' => '<div id="names-fieldset-wrapper">',
      '#suffix' => '</div>',
      '#attributes' => array('class'=>array('container-inline')),
    ];

    for ($i = 0; $i < $num_names; $i++) {

      $form['names_fieldset']['fields'][$i] = [
        '#type' => 'fieldset',
        '#name' => 'id_'.$i
      ];

      $form['names_fieldset']['fields'][$i]['ids'] = [
        '#type' => 'textfield',
        '#title' => $this->t('ID'),
        '#default_value' => $i,
        '#name' => 'id_'.$i
      ];

      $form['names_fieldset']['fields'][$i]['name'] = [
        '#type' => 'textfield',
        '#title' => $this->t('Name')
      ];

      $form['names_fieldset']['fields'][$i]['remove'] = [
        '#type' => 'submit',
        '#name' => 'remove_'.$i,
        '#value' => $this->t('Remove this'),
        '#submit' => ['::removethisCallback'],
        '#ajax' => [
          'callback' => '::addmoreCallback',
          'wrapper' => 'names-fieldset-wrapper',
        ],
      ];
    }
....

Cela fonctionne bien et je peux ajouter plusieurs enregistrements. Mais je ne peux pas supprimer un élément autre que le dernier. Ceci est ma fonction de rappel où j'ai essayé de désactiver l'élément que je veux supprimer:

public function removethisCallback(array &$form, FormStateInterface $form_state) {
    $button_clicked = $form_state->getTriggeringElement()['#name'];
    $id = substr($button_clicked,7);
    $values = $form_state->getValue(['names_fieldset']);
    unset($values[$id]);
    $form_state->setValues(['names_fieldset'], array_values($values));  

    $name_field = $form_state->get('num_names');
    if ($name_field > 1) {
        $remove_button = $name_field - 1;
        $form_state->set('num_names', $remove_button);
    }   
    $form_state->setRebuild();
}

Mais ça ne marche pas. Comment puis-je supprimer ou mettre à jour un élément de $ form_state?

2
briast

$ form_state-> setValues ​​(['names_fieldset'], array_values ​​($ values));

setValues ​​(array $ values) a seulement 1 paramètre

Pour 2 paramètres, vous devez utiliser setValue ($ key, $ value) sans le "s"

$form_state->setValue('name', array_values($values));  

Alternativement, vous pourriez faire

$values = $form_state->getValues();
$values['name'] = array_values($values);
$form_state->setValues($values);
1
No Sssweat