Puncte:-2

Element de câmp text personalizat, valoare diferită $form_state și valoarea elementului „#value”.

drapel cn

Am un element textfield (numit „autogară”), care conține un nume de stație de autobuz.

Caut o modalitate de a crea un element personalizat „bus_station” (eventual extinzând clasa Textfield), care ar:

  • Vă așteptați în continuare la o introducere de text sub forma numelui stației de autobuz (și păstrați-l în timpul $form_state->setRebuild() și arătați-l utilizatorului), dar
  • În $form_value, după trimiterea formularului, fie furnizați a FALS (codul personalizat din definiția elementului nu recunoaște intrarea ca stație) sau ADEVĂRAT (recunoaște o stație)? Sau ID-ul entității (ID-ul unei stații de autobuz potrivite) și/sau NUL (nu se potrivesc)?
Puncte:0
drapel cn

Acest lucru se poate face prin implementarea Form API callback:

Interior module/src/Element/ElementClass.php, în funcția publică getInfo() {} definiți un apel invers, de ex. processMyElement sub '#proces' cheie:

funcția publică getInfo() {
  $clasa = static::clasa;
  întoarcere [
    // [...] Alte definiții.
    '#proces' => [
      [$class, 'processMyElement'],
    ],
  ];
}

Și apoi efectuați două operații complementare.

(1) Procesați intrarea utilizatorului și returnați o valoare care va fi furnizată în „#form_state” valori în valueCallback() metodă:

funcție publică statică valueCallback(&$element, $input, FormStateInterface $form_state) {
  $output = parent::valueCallback($element, $input, $form_state);
  dacă ($input == „CEVA”) {
    $ieșire = 'CEVA_ELSE';
  }
  returnează $ieșire;
}

(2) Și invers, în processMyElement() metoda returnează valoarea inițială:

funcția publică statică processMyElement(&$element, FormStateInterface $form_state, &$complete_form) {
  if ($element['#value'] == 'CEVA_ELSE') {
    $element['#value'] = 'CEVA';
  }
  returnează $element;
}

Exemplu de utilizare

Am folosit asta pentru a extinde Drupal\Core\Render\Element\Textfield clasa în combinație cu JS Storage Complete. Asta îmi oferă completare automată (fără a fi nevoie de o adresă URL de apel invers). Această completare automată returnează ID-ul entității obținut prin încărcarea entității pe baza etichetei unice din interior valueCallback() metoda, dar utilizatorului i se prezintă în continuare textul introdus (obținut prin returnarea $entity->label() interior processMyElement() metodă).

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.