Редактирование узла с помощью AJAX
Я загружаю форму редактирования узла в блок и хочу использовать Ajax для сохранения узла.
class MyBLockNameBlock extends BlockBase{
public function build() {
//I find the $nid i want to display
$entity = Node::load($nid);
$form = \Drupal::service('entity.form_builder')->getForm($entity, 'default');
$form['actions']['#type'] = 'actions';
$form['actions']['submit'] = [
'#type' => 'submit',
'#value' => $this->t('Submit'),
'#ajax' => [
'wrapper' => $wrapper_id,
'callback' => '::ajaxCallback',
],
];
$block['form'] = $form;
$block['#markup'] = $this->t('<h3>Project Plan</h3>');
return $block;
}
public function validateForm(array &$form, FormStateInterface $form_state)
{
if($form_state->hasAnyErrors()){
return $form;
}
}
public function ajaxCallback(array &$form, FormStateInterface $form_state)
{
return $form;
}
}
Но это не работает. Если я изменю форму $['действия']['отправить'] на
$form['actions']['submit'] = [
'#type' => 'submit',
'#value' => $this->t('Submit'),
'#attributes' =>array('class' => array('btn btn-info use-ajax-submit')),
'#ajax' => [
'wrapper' => $wrapper_id,
'callback' => '::ajaxCallback',
],
];
Ajax работает, но он не проверяет форму. Должен ли я самостоятельно создавать проверку для каждого поля?
Также я попробовал модуль ajax_form_entity, но даже если ajax работает, перезагружает форму, не очищает поля после отправки и все еще не утверждать.
Также мне нужен дополнительный обработчик, когда пользователь нажимает кнопку "Отправить", чтобы обновить поле из другой формы.
Есть идеи?
1 answers
Вы не можете добавлять элементы в форму за пределами определения формы. Вы добавляете элементы формы в свой класс блоков, поэтому он работает не так, как вы ожидаете. Если вы хотите изменить форму сущности, вам нужно будет использовать функцию hook_form_alter() и добавить туда свой ajax.