Puncte:0

Pot adăuga elemente la un widget de câmp cu AJAX?

drapel lb

Doresc să adaug câmpuri în funcție de prima opțiune selectată. Am făcut și un formular cu un comportament similar, dar nu a fost un widget de câmp.

Am folosit acest modul ca exemplu pentru a face formularul

Nu sunt sigur dacă modul în care implementez acest comportament AJAX ar trebui să fie diferit într-un widget.

Comportamentul acestui formular poate fi implementat într-un widget de câmp? Încerc să caut exemple de widget-uri de câmp specific care implementează acest lucru, dar încă nu am găsit nimic care ar putea ajuta `

 funcția publică formElement(FieldItemListInterface $articole, $delta, matrice $element, matrice &$form, FormStateInterface $form_state) {
    $valoare = isset($articole[$delta]->valoare) ? $articole[$delta]->valoare: '';
    $element = [];

    // Adună deja numărul de nume din formular.
    $num_names = $form_state->get('num_names');
    // Trebuie să ne asigurăm că există cel puțin un câmp de nume.
    dacă ($num_nume === NULL) {
        $name_field = $form_state->set('num_names', 1);
        $num_nume = 1;
    } 

    $element['puncte de întrerupere'] = [
      '#type' => 'selectați',
      '#title' => $this->t('Grup punct de întrerupere'),
      '#options' => $this->getBreakpointsGroups(),
      '#default_value' => $valoare,
      '#empty_option' => $this->t('-Selectează un grup de puncte de întrerupere-'),
    ];   



    $element['images_fieldset'] = [
        '#type' => 'fieldset',
        '#title' => $this->t('Încărcați imagini pentru fiecare punct de întrerupere'),
        '#prefix' => '<div id="breakpoint-wrapper">',
        '#sufix' => '</div>',
    ];

    pentru ($i = 0; $i < $num_nume; $i++) {
        $element['images_fieldset']['image'][$i] = [
            '#type' => 'imagine',
            '#title' => $this->t('Imagine'),
            '#name' => "Nume"
        ];
    }

    $element['images_fieldset']['submit'] = [
        '#type' => 'trimite',
        '#title' => 'Trimiteți',
        '#submit' => ['::submitForm'],
        '#value' => $this->t("trimite"),
        '#ajax' => [
            'callback' => '::loadImageFields',
            'wrapper' => 'wrapper-punct de întrerupere',
        ],
    ];


    returnează ['value' => $element];
}

/**
 * Returnează o listă de puncte de întrerupere.
 *
 * @return matrice
 * O matrice asociativă de puncte de întrerupere, potrivită pentru a fi folosită ca formă
 *   Opțiuni.
 */
funcția protejată getBreakpointsGroups() {
    $breakpoints = \Drupal::service('breakpoint.manager')->getGroups();
    $breakpoint_names = array_keys($breakpoints);
    $breakpoint_group = array();
    foreach ($breakpoint_names ca $name) {
        $breakpoint_group += [$nume => $nume];
    }
    returnează $breakpoint_group;
}

funcția protejată submitForm($form, &$form_state) {
    $state = $form_state->getTriggeringElement();
    $breakpoint= $state['#value'];
    $array = array();

    $breakpoint = \Drupal::service('breakpoint.manager')->getBreakpointsByGroup($breakpoint);
    $breakpoints_name = array_keys($breakpoint);

    foreach ($breakpoints_name ca $breakpoint_definition) {
        $mediaQuery = $breakpoint[$breakpoint_definition]->getMediaQuery();
        array_push($array,$mediaQuery);
    }      

    $name_field = $form_state->get('num_names');
    $form_state->set('num_names',count($array));

    $form_state->setRebuild();

}

funcția publică loadImageFields(matrice $form, FormStateInterface $form_state) {
    returnează $form['images_fieldset'];
 }

}

Alfred Armstrong avatar
drapel cn
Nu sunt sigur fără testare, dar mă întreb dacă modul în care creați elementul wrapper cu ID-ul său este corect.Cele mai multe dintre exemplele de lucru pe care le pot găsi folosesc „#prefix” și „#suffix” pentru a adăuga un wrapper div.
Burly Uranus avatar
drapel lb
@AlfredArmstrong Am editat codul pentru a pune ceea ce am primit până acum! Widgetul face ceea ce trebuie să facă (generează câmpuri), dar valorile nu sunt salvate!
Alfred Armstrong avatar
drapel cn
Nu pot vedea nimic în codul elementului dvs. care să primească valoarea curentă și să configureze formularul în consecință. (De obicei aveți nevoie de $items[$delta]->value). Veți dori ca formularul să se potrivească cu cum ar fi dacă cineva ar fi selectat acea valoare și ar fi actualizat prin ajax. Pentru ca valoarea să fie stocată, în mod implicit trebuie să fie sub $element['value'], așa că s-ar putea să doriți să schimbați cheile elementului de câmp să fie $element['value']['breakpoints'] și așa mai departe.
Burly Uranus avatar
drapel lb
Mulțumiri. Valoarea selectată a meniului derulant este salvată, dar încă nu știu cum să adaug câmpurile în funcție de meniul derulant. Mi-am editat modificările dacă se întâmplă să știi cum să o faci. Câmpurile nu pot fi adăugate prin AJAX, dar nu știu cum să le adaug în alt mod. Am încercat să le adaug în cadrul funcției formElement, dar nu funcționează la fel ca o formă normală drupal.
Alfred Armstrong avatar
drapel cn
Ar trebui să verificați valoarea transmisă atunci când construiți elementul de formular și să creați câmpuri de formular corespunzătoare pe baza valorii.
Burly Uranus avatar
drapel lb
Multumesc, deja am inteles. Voi posta soluția mai târziu.
Puncte:0
drapel kz

Ideea este că nu puteți modifica structura internă a formularului Drupal într-un apel invers Ajax. Deci veți avea nevoie de un handler de trimitere, fie pentru câmp, fie pentru widgetul complet, faceți modificările formularului acolo și adăugați un $form_state->setRebuild().

Apelurile Ajax modifică practic HTML-ul în browser, asta este tot ce fac. Acestea sunt apelate după ce validarea și transmiterea au fost efectuate.

Burly Uranus avatar
drapel lb
Multumesc pentru raspunsul tau! Un handler de trimitere? Voi încerca să fac asta. Dacă îmi puteți indica unde să-l caut, v-aș fi recunoscător, dar îl voi căuta oricum.
Burly Uranus avatar
drapel lb
Dacă aveți timp, puteți verifica modificările mele. Mulțumesc oricum.

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.