¿Cómo implementar un controlador de envío personalizado en hook_form_alter ()?

16

He estado actualizando uno de mis módulos Drupal 7 a 8 y tengo un problema con mi formulario alter. Estoy agregando una función de validación y un controlador de envío. La función de validación se llama muy bien, pero la función de envío no se activa. Me pregunto si esto significa que hay un enfoque de estilo Symfony que debe tomarse para agregar controladores de envío a los formularios existentes. He buscado mucho y no puedo encontrar ningún ejemplo. También examiné algunos módulos D8 de trabajo en progreso, pero tampoco he encontrado ejemplos de trabajo allí.

¿Alguien tiene alguna idea de cuál es la forma correcta de Drupal 8 para hacer esto?

Arbee
fuente
2
Debe publicar su código existente para que las personas puedan verlo y detectar cualquier problema / sugerir alternativas.
Yuriy Babenko
Hay, a partir de D8 beta9, getters y setters para los controladores de envío, pero parece que no pude hacer que funcionen y utilicé la respuesta a continuación. Espero que la interfaz de nodo obtenga algunos eventos enviados en el futuro, ya que prefiero suscribirme a un evento que usar un gancho.
Alex Finnarn

Respuestas:

13

Según el ejemplo en la documentación , es lo mismo que para Drupal 7:

$form['actions']['submit']['#submit'][] = 'mymodule_upload_enabled_types_submit';

Puede encontrar una lógica (de trabajo) similar en

Y algunos otros además.

Clive
fuente
1
No puedo discutir con los documentos de la API. Probablemente sea algo complicado con mi implementación, profundizaré más.
Arbee
Vea mi actualización anterior, aparte de $ form ['actions'] ['submit'] también hay secciones de $ form ['actions'] ['Publique'] y ['Unublish'] que pueden tener adjuntos controladores de envío.
Arbee
Tuve que usar $ form ['actions'] ['publicar'] ['# submit'] [] en lugar de $ form ['actions'] ['submit'] ['# submit'] [] para mi controlador de envío para trabajar cuando se publicó el nodo. Sin embargo, parece que no puedo hacer que la devolución de llamada funcione cuando el nodo se guarda por primera vez como no publicado.
Alex Finnarn
6

Puede agregar cuántos manejadores de envío desea utilizando el siguiente código:

 $form['actions']['submit']['#submit'][] = 'mymodule_what_ever_function';

Si desea agregar un controlador de envío después del controlador de envío predeterminado (un controlador de envío que se llamará después de la devolución de llamada de envío), puede utilizar lo siguiente.

$form['#submit'][1] = test_function;

Para eliminar el controlador de envío:

unset($form["actions"]['submit']);
DEVARAJ JOHNSON
fuente
3

El comportamiento cambia o difiere de un caso a otro. Con el formulario Nodo Eliminar confirmación múltiple

$form['actions']['submit']['#submit'][] = 'mymodule_upload_enabled_types_submit';

El código de @ Clive hace que Drupal ignore el controlador principal. En este caso, agregue el controlador a la $form['#submit']sección:

$form['#submit'][] = 'mymodule_upload_enabled_types_submit';
codificador de vida
fuente
1

Aquí le mostramos cómo adjuntar un controlador de envío personalizado al formulario de agregar / editar nodo del artículo en Drupal 8:

<?php

use Drupal\Core\Form\FormStateInterface;

/**
 * Implements hook_form_alter().
 */
function my_module_form_alter(&$form, FormStateInterface $form_state, $form_id) {

  // Use this to reveal the form id.
  //drupal_set_message($form_id);

  // Use this with the devel module to inspect the button action(s).
  //kint($form['actions']);

  switch ($form_id) {

    case 'node_article_form':      // New article nodes.
    case 'node_article_edit_form': // Existing article nodes.

      // Attach our custom submit handler.
      $form['actions']['publish']['#submit'][] = 'my_module_node_article_form_submit';
      break;

  }

}

function my_module_node_article_form_submit($form, FormStateInterface $form_state) {
  drupal_set_message('Running custom submit handler...');
}

No pude agregar con éxito un controlador de envío personalizado $form['#submit']y hacer que la función se active correctamente. Yo tenía para fijar de forma explícita al guardar y publicar botón cuando se crea un nuevo artículo, y adjuntarlo a la Guardar y mantener publicada botón al editar un artículo existente.

Además publish, estas son algunas de las otras acciones de botón disponibles:

unpublish
preview
delete
tyler.frankenstein
fuente
Estoy en Drupal 8.7.3, y my_module_node_article_form_submit($form, FormStateInterface $form_stateme lo dio TypeError: Argument 2 passed to _ccad_content_log_webform_submit() must be an instance of FormStateInterface, instance of Drupal\Core\Form\FormState given; cambiándolo a _submit($form, $form_state)corregido los errores.
user1359