hook_form_alter ()에서 사용자 정의 제출 핸들러를 어떻게 구현합니까?


16

Drupal 7 모듈 중 하나를 8로 업데이트했으며 양식 변경에 문제가 있습니다. 유효성 검사 기능과 제출 핸들러를 추가하고 있습니다. 유효성 검사 기능이 제대로 호출되었지만 제출 기능이 실행되지 않습니다. 이것이 제출 양식 핸들러를 기존 양식에 추가하는 데 필요한 Symfony 스타일의 접근 방법이 있는지 궁금합니다. 많은 검색을 수행했으며 예를 찾을 수 없습니다. 또한 진행중인 작업 D8 모듈을 살펴 보았지만 실제로 작동 예제를 찾지 못했습니다.

누구든지 올바른 Drupal 8 방법이 무엇인지 알고 있습니까?


2
기존 코드를 게시하여 사람들이 코드를보고 문제 / 가장 좋은 대안을 찾을 수 있도록해야합니다.
Yuriy Babenko

D8 베타 9부터 제출 핸들러에 대한 getter 및 setter가 있지만 작동하도록하고 아래 답변을 사용하지 못하는 것 같습니다. 후크를 사용하는 것보다 이벤트를 구독하기 때문에 노드 인터페이스가 미래에 일부 이벤트를 전달하기를 바랍니다.
Alex Finnarn

답변:


13

문서 의 예제에 따르면 Drupal 7과 동일합니다.

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

비슷한 (작동) 논리를 찾을 수 있습니다

그리고 다른 몇 가지.


1
API 문서와 논쟁 할 수 없습니다. 아마도 내 구현에 문제가있는 것 같습니다.
Arbee

$ form [ 'actions'] [ 'submit'] 외에도 제출 핸들러를 첨부 할 수있는 $ form [ 'actions'] [ 'publish'] 및 [ 'unpublish'] 섹션도 있습니다.
Arbee

제출 핸들러에 $ form [ 'actions'] [ 'submit'] [ '# submit'] [] 대신 $ form [ 'actions'] [ 'publish'] [ '# submit'] []을 사용해야했습니다. 노드가 게시되었을 때 작동합니다. 그러나 노드가 처음 게시되지 않은 상태로 저장되면 콜백이 작동하지 않는 것 같습니다.
Alex Finnarn

6

다음 코드를 사용하여 원하는 제출 핸들러 수를 추가 할 수 있습니다.

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

이후에 제출 핸들러를 추가하려는 경우기본 제출 핸들러 (제출 콜백 후에 호출 다음을 사용할 수 있습니다.

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

제출 핸들러를 제거하려면 다음을 수행하십시오.

unset($form["actions"]['submit']);

3

동작이 변경되거나 경우에 따라 다릅니다. 노드 여러 삭제 확인 양식 사용

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

@Clive의 코드는 Drupal이 메인 핸들러를 무시하도록합니다. 이 경우 핸들러를 $form['#submit']섹션에 추가 하십시오.

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

1

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...');
}

사용자 정의 제출 핸들러를 성공적으로 추가 할 수 없었 $form['#submit']으며 함수가 올바르게 실행되도록했습니다. 나는 있었다 명시 적으로에 첨부 저장 및 게시 새 글을 작성할 때 버튼을, 그리고에 첨부 저장 및 게시 계속 기존 문서를 편집 할 때 버튼을 누릅니다.

이외에도 publish사용할 수있는 다른 버튼 동작은 다음과 같습니다.

unpublish
preview
delete

나는 Drupal 8.7.3에 있고 my_module_node_article_form_submit($form, FormStateInterface $form_state나에게 주었다 TypeError: Argument 2 passed to _ccad_content_log_webform_submit() must be an instance of FormStateInterface, instance of Drupal\Core\Form\FormState given; _submit($form, $form_state)오류 를 수정하도록 변경하십시오 .
user1359
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.