Puncte:0

Eroare de aruncare pentru câmpul obligatoriu din hook_form_alter?

drapel cn

Am un tip de nod care poate fi creat de utilizatori autentificați. În formularul de creare a nodului, am adăugat o casetă de selectare a termenilor de serviciu printr-un cârlig de formular, astfel:

funcția themename_form_alter(&$form, &$form_state, $form_id) {
  dacă ($form_id == 'node_nodetype_form') {
    $form['field_tos_accept'] = matrice(
      '#type' => 'caseta de selectare',
      '#title' => t('Sunt de acord cu termenii și condițiile.'),
      '#weight' => '999',
      '#required' => TRUE,
    );
  }
}

Acest lucru îmi oferă posibilitatea de a avea această casetă de selectare în formularul de creare a nodurilor, dar nu în forma de editare a nodului, deoarece nu este necesară acolo. Când adaug

'#required_error' => t('Vă rugăm să acceptați termenii și condițiile.'), 

Acest lucru ar trebui, după înțelesul meu, să arunce un mesaj de eroare atunci când formularul este trimis. Dar, în schimb, starea necesară a câmpului împiedică trimiterea formularului. Deci, nu există nici un mesaj de eroare aruncat.

Există vreo modalitate de a seta acest lucru într-un form_alter? Sau ar trebui doar să validez starea casetei de selectare prin JS? Ce ar fi considerat cea mai bună practică? Vă mulțumesc foarte mult anticipat!

apaderno avatar
drapel us
`#required_error` este eroarea afișată atunci când formularul este validat și elementul de formular este necesar, dar utilizatorii nu au introdus nicio valoare. `#required` este folosit pentru a însemna utilizatorii trebuie să introducă o valoare pentru acel element de formular. Niciunul dintre ele nu împiedică depunerea formularului. Atâta timp cât utilizatorii furnizează o valoare pentru acel element de formular, formularul este trimis.
apaderno avatar
drapel us
De asemenea, dacă adăugați caseta de selectare numai atunci când este creat un nod, dar nu și atunci când un nod este editat, utilizați mai mult cod decât arată întrebarea.
Berry Dingle avatar
drapel cn
@apaderno Folosesc doar codul de mai sus în fișierul meu themename.theme. Dar din moment ce mă conectez la formularul node-nodetype și nu la node-nodetype-edit-form, este afișat doar în formularul de adăugare/creare a nodului, și nu în formularul de editare. Ai dreptate în privința trimiterii. Starea necesară nu împiedică trimiterea formularului, dar declanșează validarea implicită a câmpului HTML5, pe care nu o văd deoarece am făcut un buton de comutare din intrarea implicită a casetei de selectare. Cred că o voi face în JS și voi arunca o eroare când se face clic pe butonul de trimitere, dar caseta de selectare nu este bifată.
apaderno avatar
drapel us
Formularul de editare a unui nod este același formular folosit pentru a-l crea, cel implementat de clasa `Drupal\node\NodeForm`. Dacă doriți să adăugați un element de formular numai atunci când nodul este creat, ar trebui să adăugați cod similar cu următorul: `$node = $form_state->getFormObject()->getEntity(); if ($nod && $nod->isNew()) { /* Nodul este creat. */ }`
Puncte:1
drapel cn

Există vreo modalitate de a seta acest lucru într-un form_alter? Sau ar trebui doar să validez starea casetei de selectare prin JS?

Ai putea înlocui #necesar prin setarea unui handler de validare personalizat în modul de modificare a formularului, dacă doriți să generați mesajul de eroare pe partea serverului:

$form_state->setErrorByName('field_tos_accept', $error_message);

Când adaug „#required_error”, acest lucru ar trebui, după înțelesul meu, să arunce un mesaj de eroare atunci când formularul este trimis.

#required_error' a fost introdus în 2011, dar când a fost lansat Drupal 8, se pare că a încetat să funcționeze în browserele care acceptă validarea formularelor HTML5 și, prin urmare, nu a fost niciodată adoptat cu adevărat.

Cu toate acestea, puteți utiliza atributul formular HTML5 nuvalidate pentru a dezactiva validarea formularului pe partea client, atunci această proprietate funcționează din nou și veți primi mesajul de eroare personalizat fără un handler de validare personalizat:

funcția themename_form_alter(&$form, &$form_state, $form_id) {
  // pentru formele de entitate este format din $form_id
  // ENTITY_TYPE_BUNDLE_FORM_MODE_form
  // BUNDLE numai dacă entitatea are pachete
  // FORM_MODE numai dacă nu este implicit
  // Exemple:
  // node_article_edit_form - formularul de editare a nodului pentru articolul de tip conținut
  // node_page_form - formular de creare a nodului pentru pagina de tip de conținut
  // nodurile folosesc pentru formularul de creare modul de formular implicit
  dacă ($form_id == 'node_nodetype_form') {
    $form['#attributes']['novalidate'] = 'nuvalidare';
    $form['field_tos_accept'] = [
      '#type' => 'caseta de selectare',
      '#title' => t('Sunt de acord cu termenii și condițiile.'),
      '#weight' => '999',
      '#required' => TRUE,
      '#required_error' => t('Vă rugăm să acceptați termenii și condițiile.'), 
    ];
  }
}

Vedea https://developer.mozilla.org/en-US/docs/Web/HTML/Element/form#attr-novalidate

Berry Dingle avatar
drapel cn
Wow - mulțumesc foarte mult! Este exact ceea ce căutam și funcționează așa cum mi-am dorit. Inca o data, multumesc frumos!

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.