Recién comenzamos con Drupal 8 y muy rápidamente nos encontramos con nuestro primer problema.
¿Cómo debo alterar un formulario existente en Drupal 8?
Necesitamos alterar el método de guardar el formulario de nodo para hacer una redirección a otra página. Queremos modificar la forma del nodo para que se convierta en algo así como una forma de varios pasos. Después de que el usuario crea nuevo contenido, es redirigido a un nuevo formulario (que creamos) para obtener más información.
Resolvimos nuestro problema de implementación 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);
}
Luego creamos una nueva clase de formulario que extiende el formulario de nodo y altera el método de guardar.
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()]);
}
}
Esto funciona perfectamente, pero ¿es bueno? Si otro módulo hace lo mismo, nuestro código ya no se ejecuta.
save()
método". ¿Significa cambiar la forma en que se guardan los datos, o simplemente hacer una redirección? En el primer caso, la respuesta es más compleja.
hook_form_alter()
. Si solo necesita redirigir el formulario, es suficiente agregar un controlador de envío de formulario que redirija.