Рейтинг:1

Как перезагрузить форму с пометкой через ajax?

флаг in

Моя задача - 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?

Jaypan avatar
флаг de
Вы не можете добавлять элементы формы в обратный вызов ajax - это будет включать всю форму. Возможно, этот модуль может помочь: https://www.drupal.org/project/ajaxifyforms

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.