Моя задача - ajaxify сложную форму флага (с дополнительными полями).
Мне это нужно, потому что флаг ajax по умолчанию не дублирует поля.
Мне нужно иметь форму пометки для создания флага, а затем обновить ее, когда пометка будет создана.
Я хочу поместить пользовательскую форму с пометкой ajaxified в свой шаблон
Сначала я получаю сборку формы:
$term = $переменные['term'];
$flag = \Drupal::service('flag')->getFlagById('subscribe_term');
$flagging_entity = \Drupal::service('flag')->getFlagging($flag, $variables['term']);
если (!$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(),
'глобальный' => $flag->isGlobal(),
]);
}
$form = \Drupal::entityTypeManager()
->getFormObject('отмечать', 'редактировать')
->setEntity($flagging_entity);
$variables['flag'] = \Drupal::formBuilder()->getForm($form);
Форма работает нормально.
Затем я изменяю форму и добавляю обратный вызов ajax:
$form['actions']['submit']['#ajax'] = [
'обратный вызов' => 'mymodule_flag_form_ajax_callback',
'эффект' => 'исчезновение',
];
И затем в обратном вызове ajax я пытаюсь получить ту же форму:
$render_selector = ".flag-form-wrapper";
$response = новый AjaxResponse();
$form_object = $form_state->getFormObject();
$flagging_entity = $form_object->getEntity();
$flagged_entity_field = $flagging_entity->get('flagged_entity')->getValue();
если ($flagged_entity_field) {
$tid = $flagged_entity_field[0]['target_id'];
$term = \Drupal::entityTypeManager()->getStorage('taxonomy_term')->load($tid);
если ($ срок) {
$flag = \Drupal::service('flag')->getFlagById('subscribe_term');
$flagging_entity = \Drupal::service('flag')->getFlagging($flag, $term);
если (!$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(),
'глобальный' => $flag->isGlobal(),
]);
}
$form_new = \Drupal::entityTypeManager()
->getFormObject('отмечать', 'редактировать')
->setEntity($flagging_entity);
$form_build = \Drupal::formBuilder()->getForm($form_new);
$response->addCommand(новая HtmlCommand($render_selector, $form_build));
}
}
но я получаю следующее исключение: FormAjaxException
Итак, что я делаю неправильно и как обновить форму с помощью ajax?