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ă).