Мы только начинали с Drupal 8 и очень быстро столкнулись с нашей первой проблемой.
Как мне изменить существующую форму в Drupal 8?
Нам нужно изменить метод сохранения для формы узла, чтобы сделать перенаправление на другую страницу. Мы хотим изменить форму узла, чтобы она стала чем-то вроде многошаговой формы. После того, как пользователь создает новый контент, он перенаправляется в новую форму (мы создали), чтобы получить больше информации.
Мы решили нашу проблему реализации hook_entity_type_alter()
.
function mymodule_entity_type_alter(&$entity_info) {
$handlers = $entity_info['node']->get('handlers');
$handlers['form']['default'] = 'Drupal\mymodule\Form\MyExtendedNodeForm';
$handlers['form']['edit'] = 'Drupal\mymodule\Form\MyExtendedNodeForm';
$entity_info['node']->set('handlers', $handlers);
}
Затем мы создали новый класс формы, который расширяет форму узла и изменяет метод сохранения.
class MyExtendedNodeForm extends NodeForm {
public function save(array $form, FormStateInterface $form_state) {
parent::save($form, $form_state);
$node = $this->entity;
$form_state->setRedirect('entity.regions.add_form', ['nid' => $node->id()]);
}
}
Это отлично работает, но хорошо ли это? Если другой модуль делает то же самое, наш код больше не выполняется.
save()
самом деле означает «изменить метод». Означает ли это изменение способа сохранения данных или просто перенаправление? В первом случае ответ более сложный.
hook_form_alter()
. Если вам просто нужно перенаправить форму, достаточно добавить обработчик отправки формы, который выполняет перенаправление.