Puncte:2

Formular cu două butoane de trimitere

drapel th

Încerc să creez un formular cu două butoane de trimitere și fiecare buton va folosi o funcție diferită: cea implicită submitForm funcție și un obicei submitFormEndSession funcţie. Deci am acest cod:

clasa EndSessionForm extinde FormBase {

  /**
   * @var \Drupal
   */
  private $drupal;

  funcția publică __construct() {
    $this->drupal = Drupal nou();
  }

  /**
   * {@inheritdoc}
   */
  funcția publică getFormId(): șir {
    returnează „form_sesiune_final”;
  }

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

    // ... unele câmpuri

    $form['trimite'] = [
      '#type' => 'trimite',
      '#value' => 'Închideți sesiunea',
      '#name' => 'btnEnd',
    ];

    $form['stop'] = [
      '#type' => 'trimite',
      '#value' => 'Opriți sesiunea',
      '#name' => 'btnStop',
    ];

    returnează $form;
  }

  funcția publică submitForm(matrice &$form, FormStateInterface $form_state) {
    // Funcție de apelat cu butonul btnEnd
  }

  funcția publică submitStopForm(matrice &$form, FormStateInterface $form_state) {
    // Funcție de apelat cu butonul btnStop
  }
}

In conformitate cu documentație din Drupal 9.2.x, singurul lucru pe care trebuia să-l fac a fost să adaug a #Trimite parametru la $form['stop'] element ca acesta:

$form['stop'] = [
  '#type' => 'trimite',
  '#value' => 'Opriți sesiunea',
  '#name' => 'btnStop',
  '#submit' => [ $this, 'submitStopForm' ] // link către a doua funcție de trimitere
]

Dar nu merge.

După multe încercări și cercetări, am găsit o soluție parțială adăugând aceasta în buildForm:

$form['#submit'][] = [$this, 'submitStopForm'];

Cele două butoane sunt acum legate la submitForm și submitStopForm, indiferent dacă pun o #Trimite parametru pe butoane sau nu, submitStopForm se execută mai întâi apoi submitForm. Dar mă întreb cum pot conecta primul buton la submitForm iar al doilea la submitStopForm corect și fără a intra în ambele funcții când facem clic pe un buton.

Mulțumesc și să ai o zi bună!

berliner avatar
drapel bd
Bună și bine ați venit la Drupal Answers! Am un comentariu care nu are legătură directă cu întrebarea ta: constructorul tău arată foarte ciudat. De obicei, nu aveți nevoie de un constructor pentru clasele de formular dacă nu doriți să injectați servicii. Și nu am văzut niciodată „noul Drupal()” nicăieri în codul personalizat. Pot să vă întreb de unde l-ați luat și de ce îl folosiți?
Auraylien avatar
drapel th
Bună @berlinern, acest cod nu este codul meu potrivit, așa că nu pot explica instrucțiunea `$this->Drupal = new Drupal()`. Când am primit acest proiect, era pe Drupal 8 și am făcut mai multe actualizări la cea mai recentă versiune Drupal, deci poate că este cod depreciat. L-am eliminat (și constructorul de asemenea) și nimic nu s-a schimbat.
berliner avatar
drapel bd
De fapt, nu se aștepta nicio schimbare ;) Ați încercat cealaltă notație din documentația la care ați conectat-o? `'::methodName'` pentru orice eventualitate.
Auraylien avatar
drapel th
Da, am incercat deja asta dar nici nu merge :(
berliner avatar
drapel bd
Puteți posta codul real complet pentru conținutul funcțiilor de trimitere (sau un exemplu minim care reproduce problema dvs.)? E ceva ciudat acolo. Toate funcțiile de trimitere setate în `$form['#submit']` ar trebui apelate, nu numai prima.
Auraylien avatar
drapel th
A fost o greșeală din partea mea: am scris `die()` în ambele cu un comentariu pentru a testa ce funcție aș putea ajunge. Deci, ajung mai întâi la `submitStopForm` apoi la `submitForm`. Dar ceea ce am vrut este să ajung imediat la `submitStopForm` sau `submitForm`, în funcție de buton, și punerea `#submit => [$this, 'submitStopForm']` sub un buton parametrii nu funcționează
berliner avatar
drapel bd
Vă rugăm să vă actualizați întrebarea în consecință. Acest lucru vă va crește șansele de a obține un răspuns.
Kevin avatar
drapel in
Da, vă rugăm să adăugați codul _actual_ utilizat.
Puncte:1
drapel cn

Cred că trebuie să înfășurați apelul sumit într-o altă matrice, dacă utilizați acea notație apelabilă. Deci fie:

$form['stop'] = [
  '#type' => 'trimite',
  '#value' => 'Opriți sesiunea',
  '#name' => 'btnStop',
  '#submit' => [ [$this, 'submitStopForm'] ] // Matrice de apelabile (care sunt matrice)
];

sau asta

$form['stop'] = [
  '#type' => 'trimite',
  '#value' => 'Opriți sesiunea',
  '#name' => 'btnStop',
  '#submit' => [ 'submitStopForm' ] //Matrice de funcții de trimitere
]

Puteți obține și elementul care a declanșat acțiunea din interiorul funcției de trimitere, dar tind să cred că soluția anterioară este mai bună.

funcția publică submitForm(matrice &$form, FormStateInterface $form_state) { 
    $submitButton = $form_state->getTriggeringElement(); 
    dump($sumbitButton); 
}

https://api.drupal.org/api/drupal/core%21lib%21Drupal%21Core%21Form%21FormState.php/function/FormState%3A%3AgetTriggeringElement/8.2.x

Auraylien avatar
drapel th
Vă mulțumim pentru răspunsul dumneavoastră. `'#submit => [ [ $this, 'submitStop' ] ]` funcționează, dar numai dacă pun parametrul `#submit` pe primul buton. Scrieți-l pe al doilea buton nu are niciun efect. Și pune-l pe primul buton schimbă manerul pentru ambele butoane. Și dacă folosesc a doua soluție, ambele butoane au același element de declanșare, nu înțeleg de ce

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.