Drupal 8 - Formulaire - « ajouter un élément » et « supprimer un élément »

Posté le Lundi 9 octobre 2017 - 17:19
Dernière mise à jour le Mardi 5 décembre 2017 - 09:17

Voici comment dans un formulaire custom D8, avoir un ensemble de champ "multiples" dans un formulaire de config par exemple.

drupal8-formulaire-add-more.jpg

Dans mon exemple je n'ai que le champ « titre », mais c'est simplement pour alléger le snippet.

Le code en question :

  1. <?php
  2.  
  3. namespace Drupal\monmodule\Form;
  4.  
  5. use Drupal\Core\Form\ConfigFormBase;
  6. use Drupal\Core\Form\FormStateInterface;
  7. use Drupal\file\Entity\File;
  8.  
  9. /**
  10.  * Class PopoteConfigForm.
  11.  */
  12. class HomepageConfigForm extends ConfigFormBase {
  13.  
  14. protected function getEditableConfigNames() {
  15. return [
  16. 'monmodule.homepage',
  17. ];
  18. }
  19.  
  20. public function getFormId() {
  21. return 'homepage_config_form';
  22. }
  23.  
  24. public function buildForm(array $form, FormStateInterface $form_state) {
  25. $config = $this->config('monmodule.homepage');
  26. $pomoted_items = $config->get('promoted', []);
  27. $number_promoted = $form_state->getValue('number_promoted', count($pomoted_items));
  28. $removed = $form_state->getValue('removed_promoted', []);
  29.  
  30. $form['number_promoted'] = [
  31. '#type' => 'value',
  32. '#value' => $number_promoted,
  33. ];
  34. $form['removed'] = [
  35. '#type' => 'value',
  36. '#value' => $removed,
  37. ];
  38. $form['promoted'] = [
  39. '#type' => 'fieldset',
  40. '#title' => t("À la une"),
  41. '#tree' => TRUE,
  42. ];
  43. for ($i = 1; $i <= $number_promoted; $i++) {
  44. $item = array_shift($pomoted_items);
  45. if (in_array($i, $removed)) {continue;}
  46. $form['promoted'][$i] = [
  47. '#type' => 'fieldset',
  48. '#title' => t("À la une #@i", ['@i' => $i]),
  49. ];
  50. $form['promoted'][$i]['title'] = [
  51. '#type' => 'textfield',
  52. '#title' => $this->t("Titre"),
  53. '#default_value' => $item['title'],
  54. ];
  55. $form['promoted'][$i]['remove_' . $i] = [
  56. '#type' => 'submit',
  57. '#value' => t("Supprimer l'élément #@i", ['@i' => $i]),
  58. '#submit' => ['::removeItem'],
  59. '#attributes' => [
  60. 'class' => ['button--danger'],
  61. 'data-toRemove' => $i,
  62. ]
  63. ];
  64. }
  65. $form['promoted']['add_item'] = [
  66. '#type' => 'submit',
  67. '#value' => t('Ajouter un autre élément'),
  68. '#submit' => ['::addPromotedItem'],
  69. ];
  70.  
  71. return parent::buildForm($form, $form_state);
  72. }
  73.  
  74. public function addPromotedItem(array &$form, FormStateInterface $form_state) {
  75. $form_state->setValue('number_promoted', $form_state->getValue('number_promoted') + 1);
  76. $form_state->setRebuild();
  77. }
  78.  
  79. public function removeItem(array &$form, FormStateInterface $form_state) {
  80. $removed = $form_state->getValue('removed_promoted', []);
  81. $removed[] = $form_state->getTriggeringElement()['#attributes']['data-toRemove'];
  82. $form_state->setValue('removed_promoted', $removed);
  83. $form_state->setRebuild();
  84. }
  85.  
  86. public function submitForm(array &$form, FormStateInterface $form_state) {
  87. parent::submitForm($form, $form_state);
  88. $parsed = [];
  89. $promoted = $form_state->getValue('promoted');
  90. foreach ($promoted as $promoted_item) {
  91. if(is_array($promoted_item)) {
  92. $parsed[] = $promoted_item;
  93. }
  94. }
  95. $this->config('monmodule.homepage')->set('promoted', $parsed)->save();
  96. }
  97. }

 

 
 

Commentaires

Ajouter un commentaire

Ne sera pas publié

HTML restreint

  • Balises HTML autorisées : <a href hreflang> <em> <strong> <cite> <blockquote cite> <code> <ul type> <ol start type> <li> <dl> <dt> <dd> <h2 id> <h3 id> <h4 id> <h5 id> <h6 id>
  • Les lignes et les paragraphes vont à la ligne automatiquement.
  • Les adresses de pages web et les adresses courriel se transforment en liens automatiquement.
CAPTCHA
Désolé, pour ça, mais c'est le seul moyen pour éviter le spam...