Ми тільки починаємо з 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()
. Якщо вам просто потрібно перенаправити форму, достатньо додати обробник форми подання форми, який виконує переадресацію.