Garder les données du formulaire lors du rebuild suite à un appel AJAX

Information importante

En raison d'un grand nombre d'inscriptions de spammers sur notre site, polluant sans relache notre forum, nous suspendons la création de compte via le formulaire de "sign up".

Il est néanmoins toujours possible de devenir adhérent•e en faisant la demande sur cette page, rubrique "Inscription" : https://www.drupal.fr/contact


De plus, le forum est désormais "interdit en écriture". Il n'est plus autorisé d'y écrire un sujet/billet/commentaire.

Pour contacter la communauté, merci de rejoindre le slack "drupalfrance".

Si vous voulez contacter le bureau de l'association, utilisez le formulaire disponible ici, ou envoyez-nous un DM sur twitter.

Bonjour,

J'ai un problème sur un formulaire que j'ai créé.
Le but de ce formulaire est d'ajouter des lignes ($form['ajouter']) ou d'en supprimer ($form['articles'][$i]['trash']).
J'arrive à les ajouter et à les retirer avec AJAX, mais je n'arrive pas à conserver les données...

J'ai tenté d'utiliser les sessions ou bien form_data, mais je n'y arrive pas...
Je galère un peu avec l'API de formulaire... Voici le code du formulaire.

class ArmateurCreerDevis extends FormBase {
  public function buildForm(array $form, FormStateInterface $form_state) {
    $form['#tree'] = TRUE;
    $form['#cache'] = ['max-age' => 0];
    $form['articles'] = [
      '#type' => 'markup',
      '#markup' => '<table class="table table-bordered table-striped" id="article-wrapper"> <thead>
            <td></td>
            <td>' . $this->t('Article') . '</td>
            <td id="quantity-td">' . $this->t('Qté') . '</td>
            <td>' . $this->t('PU HT(€)') . '</td>
            <td>' . $this->t('TVA') . '</td>
            <td>' . $this->t('Total HT(€)') . '</td>
            <td>' . $this->t('Total TTC(€)') . '</td>
            <td></td>
            </thead> ',
      '#tree' => TRUE,
    ];
    $form_state->set('article_num', 0);
    $nb_article = $form_state->get('article_num');
    $session = new Session();
    $nb_article = count($session->get('articles'));
    $session->set('articles', NULL);
    $articles = NULL;
    if (is_null($nb_article)) {
      $nb_article = 0;
    }
    else {
      for ($i = 0; $i < $nb_article; $i++) {
        $form['articles'][$i]['article_name'] = [
          '#type' => 'textfield',
          '#title' => $this->t('Nom de l\'article'),
          '#attributes' => ['placeholder' => $this->t('Ajouter ici le nom de l\'article (obligatoire)')],
          '#required' => TRUE,
          '#title_display' => TRUE,
          '#prefix' => '<tr id="row-' . $i . '" class="draggable" data-row="' . $i . '"><td class="drag-action"><i class="fa fa-arrows"></i></td><td>',
          '#suffix' => '',
        ];
        $form['articles'][$i]['article_comment'] = [
          '#type' => 'textfield',
          '#title_display' => TRUE,
          '#title' => $this->t('Commentaire de l\'article'),
          '#attributes' => ['placeholder' => $this->t('Ajouter ici une description (optionnel)')],
          '#suffix' => '</td>',
        ];
        $form['articles'][$i]['quantity'] = [
          '#type' => 'number',
          '#title' => $this->t('Quantité'),
          '#min' => 1,
          '#value' => 0,
          '#required' => TRUE,
          '#prefix' => '<td>',
          '#suffix' => '</td>',
        ];
        $form['articles'][$i]['unity_price'] = [
          '#type' => 'number',
          '#title' => $this->t('Prix unitaire'),
          '#min' => 1,
          '#value' => 0,
          '#required' => TRUE,
          '#prefix' => '<td>',
          '#suffix' => '</td>',
        ];
        $form['articles'][$i]['tva'] = [
          '#type' => 'select',
          '#title' => $this->t('TVA'),
          '#options' => ['1.2' => '20%', '1.1' => '10%'],
          '#default_value' => '1.2',
          '#value' => '1.2',
          '#required' => TRUE,
          '#prefix' => '<td>',
          '#empty_option' => '',
          '#suffix' => '</td><td class="total-ht">0.00 €</td><td class="total-ttc">0.00 €</td>',
        ];

        $form['articles'][$i]['trash'] = [
          '#type' => 'submit',
          '#name' => 'trash',
          '#value' => '',
          '#id_' => $i,
          '#prefix' => '<td class="delete-action">',
          '#suffix' => '</td></tr>',
          '#ajax' => [
            'callback' => [$this, 'RemoveArticleCallback'],
            'wrapper' => 'article-wrapper',
            'effect' => 'fade',
          ],
          '#submit' => ['::RemoveArticleSubmited'],
          '#limit_validation_errors' => [],
        ];
      }
    }
    $form['accompte'] = [
      '#type' => 'hidden',
      '#default_value' => $form_state->get('accompte'),
    ];
    $form['html_end'] = [
      '#type' => 'markup',
      '#markup' => '</table>',
    ];
    $form['ajouter'] = [
      '#type' => 'submit',
      '#name' => 'add',
      '#value' => $this->t('Ajouter un article'),
      '#ajax' => [
        'callback' => [$this, 'AddArticleCallback'],
        'effect' => 'fade',
        'wrapper' => 'article-wrapper',
        'progress' => ['type' => 'none'],
      ],
      '#submit' => ['::AddArticleSubmited'],
      '#limit_validation_errors' => [],
    ];

    return $form;
  }

  public function AddArticleCallback(array &$form, FormStateInterface $form_state) {
    return $form['articles'];
  }

  public function RemoveArticleCallback(array &$form, FormStateInterface $form_state) {
    unset($form['articles'][(int) $form_state->getTriggeringElement()['#value']]);
    return $form['articles'];
  }

  public function AddArticleSubmited(array $form, FormStateInterface $form_state) {
    $c = $form_state->get('article_num') + 1;
    $form_state->set('article_num', $c);
    $form_state->set('articles', $form['articles']);
    $form_state->setRebuild(TRUE);
    $session = new Session();
    $form_state->set('article_num', 0);
    $session->set('articles', $form['articles']);
  }

  public function RemoveArticleSubmited(array $form, FormStateInterface $form_state) {
    $c = $form_state->get('article_num') - 1;
    $form_state->set('article_num', $c);
    unset($form['articles'][(int) $form_state->getTriggeringElement()['#id_']]);
    $form_state->set('articles', $form['articles']);
    $form_state->setRebuild(TRUE);
    $session = new Session();
    $session->set('articles', $form['articles']);
  }
}

Merci par avance,

Forum : 
Version de Drupal :