Como você implementa um manipulador de envio personalizado em hook_form_alter ()?

16

Estou atualizando um dos meus módulos do Drupal 7 para 8 e estou tendo um problema com meu formulário alterado. Estou adicionando uma função de validação e um manipulador de envio. A função de validação está sendo chamada muito bem, mas a função de envio não está sendo acionada. Gostaria de saber se isso significa que existe uma abordagem no estilo Symfony que precisa ser usada para adicionar manipuladores de envio aos formulários existentes. Pesquisei bastante e não consigo encontrar nenhum exemplo. Também observei alguns módulos D8 em andamento, mas também não encontrei nenhum exemplo de trabalho.

Alguém tem alguma idéia de qual é a maneira correta de Drupal 8 fazer isso?

Arbee
fonte
2
Você deve postar seu código existente para que as pessoas possam dar uma olhada nele e identificar quaisquer problemas / sugerir alternativas.
Yuriy Babenko
No D8 beta9, existem getters e setters para manipuladores de envio, mas não consegui fazê-los funcionar e usei a resposta abaixo. Espero que a interface do nó receba alguns eventos despachados no futuro, pois prefiro me inscrever em um evento do que usar um gancho.
Alex Finnarn

Respostas:

13

De acordo com o exemplo em documentação , é o mesmo que para o Drupal 7:

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

Você pode encontrar lógica (de trabalho) semelhante em

E mais alguns outros.

Clive
fonte
1
Não posso discutir com os documentos da API. Provavelmente algo estranho com a minha implementação, vou aprofundar.
Arbee
Veja minha atualização acima, além de $ form ['actions'] ['submit'], também existem $ form ['actions'] ['publish'] e ['unpublish'] seções que podem ter manipuladores de envio anexados.
Arbee #:
Eu tive que usar $ form ['actions'] ['publish'] ['# submit'] [] em vez de $ form ['actions'] ['submit'] ['# submit'] [] para meu manipulador de envio funcionar quando o nó foi publicado. No entanto, não consigo fazer o retorno de chamada funcionar quando o nó é salvo pela primeira vez como não publicado.
Alex Finnarn
6

Você pode adicionar quantos manipuladores de envio deseja usando o seguinte código:

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

Se você deseja adicionar um manipulador de envio após o manipulador de envio padrão (um manipulador de envio que será chamado após o retorno de chamada), você pode usar o seguinte.

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

Para remover o manipulador de envio:

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

O comportamento é alterado ou difere de caso para caso. Com o formulário de confirmação Excluir vários nós

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

O código do @ Clive faz com que o Drupal ignore o manipulador principal. Nesse caso, adicione o manipulador à $form['#submit']seção:

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

Veja como anexar um manipulador de envio personalizado ao formulário de adição / edição do nó do artigo no 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...');
}

Não foi possível anexar com êxito um manipulador de envio personalizado $form['#submit']e ter a função acionada corretamente. Eu tive que anexá-lo explicitamente ao botão Salvar e publicar ao criar um novo artigo, e ao botão Salvar e manter publicado ao editar um artigo existente.

Além disso publish, aqui estão algumas das outras ações de botão disponíveis:

unpublish
preview
delete
tyler.frankenstein
fonte
Estou no Drupal 8.7.3 e my_module_node_article_form_submit($form, FormStateInterface $form_stateme deu TypeError: Argument 2 passed to _ccad_content_log_webform_submit() must be an instance of FormStateInterface, instance of Drupal\Core\Form\FormState given; alterá-lo para _submit($form, $form_state)corrigir os erros.
User1359