Folosesc un formular AJAX. Acest formular îl construiesc dintr-o subclasă de ContentEntityForm
. Entitatea editată de acest formular are un câmp MyField. Pentru a aduce toate valorile câmpului într-o structură adecvată pe care o folosesc massageFormValues()
în MyFieldWidget
clasa (subclasa de WidgetBase
).
Mica problemă este: metoda massageFormValues()
este apelat de două ori la fiecare trimitere. Nu există alte probleme cu formularul. Pot edita corect valorile din acest formular.
Deci este doar întrebarea de înțelegere: de ce Drupal sună massageFormValues()
de două ori la fiecare trimitere.
Codul menționat și codul meu (foarte simplificat):
Controlerul meu ajax
clasa AjaxController extinde ControllerBase {
...
...
funcția publică myController($eid) {
$myEntity = $this->entityTypeManager()->getStorage('my_entity')->load($eid);
$form = $this->entityFormBuilder()->getForm($myEntity, 'my_mode');
$renderer = \Drupal::service('renderer');
$ieșire = $renderer->renderRoot($form);
$răspuns = AjaxResponse nou();
$răspuns->addCommand(new OpenModalDialogCommand($titlu, $ieșire));
returnează $răspuns;
}
...
...
}
MyForm
este o subclasă a ContentEntityForm și este a forma modului pentru modul modul_meu
a Entității entitatea_mea
:
clasa MyForm extinde ContentEntityForm {
...
...
acțiuni ale funcției protejate (matrice $form, FormStateInterface $form_state) {
$actions = parent::actions($form, $form_state);
$actions['trimite'] = [
'#type' => 'trimite',
'#value' => t('Salvare'),
'#ajax' => [
'callback' => '::ajaxCallback',
'event' => 'mousedown',
],
];
returnează $acțiuni;
}
...
...
}
Clasa mea de widgeturi de câmp:
clasa MyFieldWidget extinde WidgetBase implementează ContainerFactoryPluginInterface {
...
...
funcția publică massageFormValues(matrice $valori, matrice $form, FormStateInterface $form_state) {
// ACEST COD ESTE NUMAT DE DOUA ORI LA FIECARE TRIMITERE A BUTONULUI MEU DE TRIMITE DEFINIT MAI SUS
// DAR DE CE DE DOUA ORI?
returnează $rightStructureValues;
}
...
...
}