Submitted by Shinochi on
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,