Sarcina mea este de a ajaxifica formularul de steag complex (cu câmpuri suplimentare).
Am nevoie de asta pentru că flagul ajax implicit nu dupport fiedls.
Trebuie să am formularul de semnalizare pentru create flag și apoi să-l actualizez când a fost creată semnalizarea.
Vreau să plasez un formular ajaxificat de semnalizare personalizată în șablonul meu
Mai întâi primesc formularul:
$term = $variabile['termen'];
$flag = \Drupal::service('flag')->getFlagById('subscribe_term');
$flagging_entity = \Drupal::service('flag')->getFlagging($flag, $variables['term']);
dacă (!$flagging_entity) {
$flagging_entity = \Drupal::entityTypeManager()->getStorage('flagging')->create([
'uid' => \Drupal::currentUser()->id(),
'session_id' => NULL,
'flag_id' => $flag->id(),
'entity_id' => $term->id(),
'entity_type' => $term->getEntityTypeId(),
'global' => $flag->isGlobal(),
]);
}
$form = \Drupal::entityTypeManager()
->getFormObject('semnalizare', 'editare')
->setEntity($flagging_entity);
$variables['flag'] = \Drupal::formBuilder()->getForm($form);
Formularul merge ok.
Apoi modific anunțul de formular și adaug apel invers ajax:
$form['actions']['submit']['#ajax'] = [
'callback' => 'mymodule_flag_form_ajax_callback',
'efect' => 'fade',
];
Și apoi, în apelul ajax, încerc să obțin aceeași formă:
$render_selector = ".flag-form-wrapper";
$răspuns = AjaxResponse nou();
$form_object = $form_state->getFormObject();
$flagging_entity = $form_object->getEntity();
$flagged_entity_field = $flagging_entity->get('flagged_entity')->getValue();
if ($flagged_entity_field) {
$tid = $flagged_entity_field[0]['target_id'];
$term = \Drupal::entityTypeManager()->getStorage('taxonomy_term')->load($tid);
dacă ($term) {
$flag = \Drupal::service('flag')->getFlagById('subscribe_term');
$flagging_entity = \Drupal::service('flag')->getFlagging($flag, $term);
dacă (!$flagging_entity) {
$flagging_entity = \Drupal::entityTypeManager()->getStorage('flagging')->create([
'uid' => \Drupal::currentUser()->id(),
'session_id' => NULL,
'flag_id' => $flag->id(),
'entity_id' => $term->id(),
'entity_type' => $term->getEntityTypeId(),
'global' => $flag->isGlobal(),
]);
}
$form_new = \Drupal::entityTypeManager()
->getFormObject('semnalizare', 'editare')
->setEntity($flagging_entity);
$form_build = \Drupal::formBuilder()->getForm($form_new);
$response->addCommand(new HtmlCommand($render_selector, $form_build));
}
}
dar primesc următoarea excepție: FormAjaxException
Deci, ce fac greșit și cum să reîmprospătează formularul folosind ajax?