Puncte:0

Cum afișez în mod dinamic (AJAX) radiourile în formularul API?

drapel au

Se așteaptă ca un formular ca următorul să afișeze câmpuri suplimentare atunci când utilizatorul a selectat „Da” în butonul radio „Afișați mai multe”. Când este afișată, secțiunea mai are un câmp de text „Nume” și un set de radiouri „Sex”.

Dar nu funcționează niciodată așa cum era de așteptat. Eticheta „Gender” va fi acolo, dar butoanele radio nu sunt niciodată redate. Știu că schimbarea „Genului” în radiouri ar funcționa, dar din anumite motive, trebuie să folosesc mai multe butoane radio. Există vreo modalitate de a face asta să funcționeze?

<?php

spațiu de nume Drupal\mymodule\Form;

utilizați Drupal\Core\Form\FormBase;

clasa DonationPrepareForm extinde FormBase {

  /**
   * {@inheritdoc}
   */
  funcția publică getFormId() {
    returnează „formul_meu”;
  }

  /**
   * {@inheritdoc}
   */
  funcția publică buildForm(
    matrice $form,
    FormStateInterface $form_state
  ) {
    $form['show_more'] = [
      '#type' => 'radiouri',
      '#title' => 'Afișați mai multe',
      '#options' => [
        'Y' => 'Da',
        'N' => 'Nu',
      ],
      '#ajax' => [
        'callback' => '::ajaxBuildForm',
        'wrapper' => 'edit-mai-wrapper',
        'progres' => [
          'type' => 'throbber',
          'message' => $this->t('Se încarcă...'),
        ],
      ],
    ];
    $form['mai mult'] = [
      '#type' => 'container',
      '#prefix' => '<div id="edit-more-wrapper">',
      '#sufix' => '</div>',
    ];

    returnează $form;
  }

  funcția publică ajaxBuildForm(matrice &$form, FormStateInterface $form_state)
  {
    if ($form_state->getValue('show_more') === 'Y') {
      $form['mai mult']['nume'] = [
        '#type' => 'câmp text',
        '#title' => 'Nume',
        '#required' => TRUE,
      ];
      $form['mai mult']['sex'] = [
        '#type' => 'radiouri',
        '#title' => 'Sex',
        '#options' => [
          'M' => 'Bărbat',
          „F” => „Femeie”,
        ],
        '#required' => TRUE,
      ];
    }
    returnează $form['mai mult'];
  }
}

Aceeași întrebare se extinde la alte elemente de formă compozită (de ex.casete de selectare). Există vreo modalitate de a face AJAX să funcționeze pentru ei?

Puncte:2
drapel cn

De fapt, este mult mai ușor să utilizați proprietatea elementului de formular #states pentru a face un element vizibil, invizibil, activat, dezactivat, obligatoriu sau... în loc să utilizați ajax

Un astfel de cod va face treaba:

<?php

spațiu de nume Drupal\mymodule\Form;

utilizați Drupal\Core\Form\FormBase;

clasa DonationPrepareForm extinde FormBase {

  /**
   * {@inheritdoc}
   */
  funcția publică getFormId() {
    returnează „formul_meu”;
  }

  /**
   * {@inheritdoc}
   */
  funcția publică buildForm(
    matrice $form,
    FormStateInterface $form_state
  ) {
    $form['show_more'] = [
      '#type' => 'radiouri',
      '#title' => 'Afișați mai multe',
      '#options' => [
        'Y' => 'Da',
        'N' => 'Nu',
      ],
    ];


    $form['mai mult']['nume'] = [
      '#type' => 'câmp text',
      '#title' => 'Nume',
      '#states' => matrice(
        'vizibil' => matrice(
          ':input[name="show_more"]' => array('value' => 'Y'),
        ),
        'required' => matrice(
          ':input[name="show_more"]' => array('value' => 'Y'),
        )
      ),
    ];
    $form['mai mult']['sex'] = [
      '#type' => 'radiouri',
      '#title' => 'Sex',
      '#options' => [
        'M' => 'Bărbat',
        „F” => „Femeie”,
      ],
      '#states' => matrice(
        'vizibil' => matrice(
          ':input[name="show_more"]' => array('value' => 'Y'),
        ),
        'required' => matrice(
          ':input[name="show_more"]' => array('value' => 'Y'),
        )
      ),
    ];

    returnează $form;
  }

}

drapel au
Acest lucru nu funcționează în cazul meu, deoarece aș dori că câmpurile apărute să fie câmpuri obligatorii.
drapel in
Ce nu merge asta exact? Starea necesară este, de asemenea, dependentă de intrare în răspuns?
Puncte:1
drapel cn

Mută ​​construirea formularului în buildForm(). Nu puteți construi elemente de formular într-un apel invers Ajax (am redenumit și metoda de apel invers pentru a clarifica acest lucru):

<?php

spațiu de nume Drupal\mymodule\Form;

utilizați Drupal\Core\Form\FormBase;

clasa DonationPrepareForm extinde FormBase {

  /**
   * {@inheritdoc}
   */
  funcția publică getFormId() {
    returnează „formul_meu”;
  }

  /**
   * {@inheritdoc}
   */
  funcția publică buildForm(array $form, FormStateInterface $form_state) {
     $form['show_more'] = [
      '#type' => 'radiouri',
      '#title' => 'Afișați mai multe',
      '#options' => [
        'Y' => 'Da',
        'N' => 'Nu',
      ],
      '#ajax' => [
        'callback' => '::ajaxCallback',
        'wrapper' => 'edit-mai-wrapper',
        'progres' => [
          'type' => 'throbber',
          'message' => $this->t('Se încarcă...'),
        ],
      ],
    ];
    $form['mai mult'] = [
      '#type' => 'container',
      '#prefix' => '<div id="edit-more-wrapper">',
      '#sufix' => '</div>',
    ];

    if ($form_state->getValue('show_more') === 'Y') {
      $form['mai mult']['nume'] = [
        '#type' => 'câmp text',
        '#title' => 'Nume',
        '#required' => TRUE,
      ];
      $form['mai mult']['sex'] = [
        '#type' => 'radiouri',
        '#title' => 'Sex',
        '#options' => [
          'M' => 'Bărbat',
          „F” => „Femeie”,
        ],
        '#required' => TRUE,
      ];
    }

    returnează $form;
  }

  funcția publică ajaxCallback(matrice &$form, FormStateInterface $form_state) {
    returnează $form['mai mult'];
  }
}
drapel au
Mulțumesc mult. Funcționează!

Postează un răspuns

Majoritatea oamenilor nu înțeleg că a pune multe întrebări deblochează învățarea și îmbunătățește legătura interpersonală. În studiile lui Alison, de exemplu, deși oamenii își puteau aminti cu exactitate câte întrebări au fost puse în conversațiile lor, ei nu au intuit legătura dintre întrebări și apreciere. În patru studii, în care participanții au fost implicați în conversații ei înșiși sau au citit transcrieri ale conversațiilor altora, oamenii au avut tendința să nu realizeze că întrebarea ar influența – sau ar fi influențat – nivelul de prietenie dintre conversatori.