Puncte:0

Redați câmpurile trimise ale unui formular către e-mail cu titlu + valoare

drapel in

Am o formă destul de complexă bazată pe \Drupal\Core\Form\FormBase cu multe câmpuri (imbricate parțial) și doriți să trimiteți conținutul complet într-un e-mail la trimitere.

Momentan am

funcția publică submitForm(matrice &$form, FormStateInterface $form_state)
{

   foreach ($form_state->getValues() ca $key => $value) {
     if (!empty($form[$key]['#title']) && $key != 'imagini') {
       $values[$form[$key]['#title']->render()] = $value;
     }
   }
...
# mai târziu voi formata matricea $values ​​ca o listă HTML

Acest lucru ar afișa numai câmpuri la nivelul superior al formularului, dar am câmpuri în grupuri.

Există o modalitate frumoasă și curată de a reda toate valorile câmpului? Sau trebuie să iterez și să analizez manual peste $form matrice?

Aș putea folosi chiar și un renderer pentru asta?

EDITAȚI | ×:

funcția publică buildForm(array $form, FormStateInterface $form_state) {


    // ...

    $form['companie'] = [
        '#type' => 'container',
    ];

    $form['company']['nameofcompany'] = [
        '#type' => 'câmp text',
        '#title' => $this->t('Numele companiei'),
    ];

Pentru a rezuma:

Cum pot itera peste toate câmpurile, inclusiv pe cele care sunt în containere și să obțin valorile + eticheta (nu doar denumirea tehnică)? Există niște ajutoare drăguți pentru asta sau trebuie să fac totul manual?

apaderno avatar
drapel us
Codul acela nu ar funcționa și nu are sens. De ce aveți nevoie de `$form[$key]['#title']` pentru a accesa o valoare în `$form_state`? În plus, deoarece `$form[$key]['#title']` este un șir, nu implementează nicio metodă `render()`.
apaderno avatar
drapel us
Ar ajuta, de asemenea, să vedeți codul construind formularul. Nu este clar ce înțelegeți prin *grupuri* și dacă *câmpuri* înseamnă *elementele de formular*.
drapel in
codul funcționează în prezent, #title este un obiect, cred că asta se datorează faptului că formularul este deja construit. Singura mea problemă este să iterez peste toate elementele de formular, deoarece acestea sunt imbricate în grupuri. Adaug niște exemplu de cod cum este construită matricea inițială $form.
apaderno avatar
drapel us
Fără a vedea toate elementele formularului, nu este posibil să înțelegeți ce înțelegeți prin *grupuri*. În ceea ce privește codul afișat, este suficient să folosiți `'nameofcompany'`, nu ceea ce returnează `$this->t('Name of Company')`. Aveți deja `$values['nameofcompany']`; nu aveți nevoie de `$values[$this->t('Numele companiei')]` setat la aceeași valoare.
drapel in
Am nevoie de etichete, nu de numele interne
drapel in
Am editat întrebarea - cu grupuri mă refer la containere. Vezi exemplul de cod. Acest lucru face mai clar? Anunță-mă, dacă ai întrebări.
drapel in
@apaderno Am postat un răspuns... dar mă întreb dacă există o modalitate mai plăcută - nu atât de scăzută.
Puncte:0
drapel in

Aceasta este ceea ce am venit, doar mă întreb dacă există o modalitate mai elegantă decât această analiză „la nivel scăzut”

/**
 * Returnează o matrice cu etichete ca chei, valori trimise ca valori, pe baza formularului original
 *
 * @param FormStateInterface $form_state
 * @return matrice
 */
funcția privată generateLabelsWithValues(FormStateInterface $form_state): matrice {
  $form = $form_state->getCompleteForm();
  $rezultat = $this->iterateAndAddValues($form, $form_state);
  returnează $rezultat;
}

/**
 * Iterați peste formular sau container și adăugați valorile
 */
funcția privată iterateAndAddValues(array $formOrContainer, FormStateInterface $form_state, array $result = []) {
  foreach ($formOrContainer ca $key => $element) {
    dacă ($key[0] === '#' || $key === 'form_build_id' || $key === 'form_id' || $key === 'trimitere') {
      continua;
    }
    if ($element['#type'] === 'container' || $element['#type'] === 'fieldset') {
      $rezultat = $this->iterateAndAddValues($element, $form_state, $result);
      continua;
    }

    dacă ($valoare = $form_state->getValue($cheie)) {
      $rezultat[(șir)$element['#title']] = $valoare;
    }
  }

  returnează $rezultat;
}

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.