Właśnie zaczynamy od Drupala 8 i bardzo szybko natrafiliśmy na nasz pierwszy problem.
Jak powinienem zmienić istniejący formularz w Drupal 8?
Musimy zmienić metodę zapisu formularza węzła, aby przekierować na inną stronę. Chcemy zmienić formę węzła, aby stała się czymś w rodzaju wieloetapowej. Gdy użytkownik utworzy nową treść, zostaje przekierowany do nowego formularza (utworzyliśmy), aby uzyskać więcej informacji.
Rozwiązaliśmy nasz problem z implementacją 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);
}
Następnie stworzyliśmy nową klasę formularzy, która rozszerza formę węzła i zmienia metodę zapisu.
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()]);
}
}
Działa to doskonale, ale czy jest dobre? Jeśli inny moduł zrobi to samo, nasz kod nie będzie już wykonywany.
save()tak naprawdę oznacza „zmiana metody”. Czy to oznacza zmianę sposobu zapisywania danych, czy po prostu przekierowanie? W pierwszym przypadku odpowiedź jest bardziej złożona.
hook_form_alter(). Jeśli wystarczy przekierować formularz, wystarczy dodać moduł obsługi przesyłania formularzy, który przekierowuje.