양식에 사용자 정의 제출 핸들러 추가


19

사용자 정의 양식 제출 핸들러를 추가하려면 어떻게해야합니까?

$form['#submit'][] = 'mymodule_form_submit';또는 $form['actions']['submit']['#submit'][] = 'mymodule_form_submit';에 추가를 시도 했습니다 hook_form_alter().

use Drupal\Core\Form\FormStateInterface;
use Symfony\Component\HttpFoundation\Request;

function MYMODULE_form_alter(&$form, FormStateInterface $form_state, $form_id) {
  if ($form_id == 'node_trends_form' || $form_id == 'node_trends_edit_form') {
    foreach (array_keys($form['actions']) as $action) {
      if ($action != 'preview' && isset($form['actions'][$action]['#type']) && $form['actions'][$action]['#type'] === 'submit') {
        $form['actions']['submit']['#submit'][] = 'mymodule_form_submit';
      }
    }
  }
}
function mymodule_form_submit(array $form, FormStateInterface $form_state){
    //die("why won't this execute? :(");
    drupal_set_message("Why won't this message show?");
}

drupal_set_message()호출되지 않은 것 같습니다 . 캐시를 다시 작성하려고 시도했지만 함수가 여전히 호출되지 않았습니다.

Drupal 8.2.3을 사용하고 있습니다.


의 전체 구현을 보여 주어야합니다 hook_form_alter(). 또한 어떤 양식을 변경하려고하는지 말해야합니다.
kiamlaluno

@kiamlaluno 내 hook_form_alter를 추가합니다.
Yusef

코드가 여전히 $ form [ 'actions'] [ 'submit'] [ '# submit']입니까? [ 'submit']을 [$ action]으로 바꾸십시오.
MrD

답변:


25

예제 코드 를 사용할 hook_form_node_form_alter()수 있습니다 :

function mymodule_form_node_form_alter(&$form, FormStateInterface $form_state, $form_id) {
  foreach (array_keys($form['actions']) as $action) {
    if ($action != 'preview' && isset($form['actions'][$action]['#type']) && $form['actions'][$action]['#type'] === 'submit') {
      $form['actions'][$action]['#submit'][] = 'mymodule_form_submit';
    }
  }
}

기능 제출

function mymodule_form_submit(array $form, FormStateInterface $form_state){
    //die("I'm not getting run, why :(");
    drupal_set_message("Why won't this message show?");

}

1
$form['actions'][$action]['#submit'][]어떤 문서를보고 있습니까? 아니면 오타를 만들었습니까? 이 hook_form_alter doc에서라고 말합니다 $form['actions']['submit']['#submit'][].
No Sssweat


1
흥미 롭습니다. 아마도 그는 행동을 반복해야 할 것입니다. 그러나이 다른 Q 에서 hook_form_alter ()에서 사용자 정의 제출 핸들러를 어떻게 구현합니까? 그가하고있는 방식대로 일한다고 가정합니다.
No Sssweat

3
각 형태는 다른 구조를 가지고 있습니다. 따라서 구체적인 대답은 없습니다.
MrD

5
루프가 필요한 이유에 대한 자세한 내용은 drupal.org/node/1901216drupal.org/node/2068063 을 참조하십시오.
Berdir

18

drupal 8 용 사용자 정의 웹 양식 핸들러 플러그인 작성

이 문서는 이미 webform 및 webform-ui를 설치하고 활성화했다고 가정합니다.

1) 웹 양식을 작성하십시오. -구조-> 웹 양식으로 이동하여 "+ 웹 양식 추가"버튼을 누르십시오. -당신은 UI를 사용하거나 yaml을 사용할 수 있습니다, 그것은 당신에게 달려 있습니다. 이메일 주소를받는 하나의 필드 양식에 대한 yaml 예 :

email:
  '#type': email
  '#title': email
  '#title_display': invisible
  '#placeholder': 'ENTER YOUR EMAIL'
  '#attributes':
    class:
      - my-ip

들여 쓰기는 yaml에 중요하므로 올바르게 가져와야합니다. 들여 쓰기는 공백입니다.

이제 양식을 저장하십시오.

2) 웹 폼 핸들러 플러그인 만들기

다음으로 웹 양식을 편집 할 때 "이메일 / 핸들러"섹션에 나타날 새로운 플러그인을 만들 수 있습니다. myhandler라고 부르겠습니다. myhandler에 대한 모든 언급을 선택한 이름으로 바꾸면 원하는대로 부를 수 있습니다.

a) 플러그인의 새 폴더를 만들고 다음 하위 폴더의 drupal 루트 (여기서는 / var / www / html /)에서 수행하십시오. / var / www / html / modules / Custom / myhandler

b)이 파일에서 위의 myhandler.info.yml 디렉토리에 새 파일을 만듭니다.

name: My Form Handler
description: handles form submits, does something with them. 
package: Custom
type: module
version: 1.0
core: 8.x

3) 모듈 디렉토리에 src 디렉토리를 작성하십시오. 예 : / var / www / html / modules / Custom / myhandler / src in src create 플러그인의 플러그인 작성 WebformHandler

(이것은 한 번에 사용하여 달성 할 수 있습니다.

mkdir -p /var/www/html/modules/Custom/myhandler/src/Plugin/WebformHandler/ 

-p 플래그를 mkdir에 사용하여 전체 구조를 한 번에 만듭니다.)

4) 새 파일 만들기 /var/www/html/modules/Custom/myhandler/src/Plugin/WebformHandler/MyFormHandler.php

해당 파일에서 다음 PHP 코드로 이동합니다. 필요한 경우 플러그인을 구성하는 방법을 볼 수 있도록 구성 양식 설정을 그대로 두었습니다.

<?php
namespace Drupal\myhandler\Plugin\WebformHandler;

use Drupal\Core\Session\AccountInterface;
use Drupal\Core\Serialization\Yaml;
use Drupal\Core\Form\FormStateInterface;
use Drupal\webform\Plugin\WebformHandlerBase;
use Drupal\webform\webformSubmissionInterface;


/**
 * Form submission handler.
 *
 * @WebformHandler(
 *   id = "myhandler_form_handler",
 *   label = @Translation("MyHandler form handler"),
 *   category = @Translation("Form Handler"),
 *   description = @Translation("Do something extra with form submissions"),
 *   cardinality = \Drupal\webform\Plugin\WebformHandlerInterface::CARDINALITY_SINGLE,
 *   results = \Drupal\webform\Plugin\WebformHandlerInterface::RESULTS_PROCESSED,
 * )
 */
class MyFormHandler extends WebformHandlerBase {

     /**
       * {@inheritdoc}
       */

     public function defaultConfiguration() {
        return [
            'submission_url' => 'https://api.example.org/SOME/ENDPOINT',
        ];
    }

    /**
     * {@inheritdoc}
     */
    public function buildConfigurationForm(array $form, FormStateInterface $form_state) {
        $form['submission_url'] = [
            '#type' => 'textfield',
            '#title' => $this->t('Submission URL to api.example.org'),
            '#description' => $this->t('The URL to post the submission data to.'),
            '#default_value' => $this->configuration['submission_url'],
            '#required' => TRUE,
        ];
        return $form;
    }



  /**
   * {@inheritdoc}
   */
  public function submitForm(array &$form, FormStateInterface $form_state, WebformSubmissionInterface $webform_submission) {
    // Your code here.
        // Get an array of the values from the submission.

        $values = $webform_submission->getData();

        // Get the URL to post the data to.
        $post_url = $this->configuration['submission_url'];

        $message = "MyHandler got form data:".print_r($values,1); 
        \Drupal::logger('myformhandler')->error($message);

        return true;
 }
}   
?>

5) MyHandler 모듈 (drush 또는 extend 메뉴 사용)을 활성화 한 다음 drupal 캐시를 다시 빌드하십시오 (drushal 루트 아래의 아무 곳에서나 "drush cr"(/ var / www / html 여기에서 drush를 사용하는 경우))

6) 웹 양식을 편집하고 "이메일 / 핸들러"로 이동 한 후 "+ 핸들러 추가"버튼을 클릭하십시오. 플러그인이 표시되면 핸들러 추가를 클릭하면 제출 URL을 묻는 상자가 나타납니다. 저장 버튼을 클릭하십시오. 무언가가 제대로 보이지 않거나 작동하지 않으면 아파치 오류 로그를 확인하면 도움이 될 수 있습니다.

7) 양식을 테스트하십시오-양식을 제출 한 다음 감시 로그 (drush ws)를 확인하면 전송 된 값이 표시됩니다. 그들은 당신이 보는 출력에서 ​​잘릴 수 있습니다, 당황하지 마십시오. 지금 당신이하는 일은 당신에게 달려 있습니다.

이것이 누군가를 돕기를 바랍니다. 나는 그 장소에서 찾은 것들과 함께 그것을 묶어서 하나의 문서에 썼습니다. 나를 여기 데려온 다른 사람들에게 감사합니다.


1
올바르게 처리하면 처리기가 올바르게 작동하기 위해 위의 코드에서 누락 된 한 가지 사소한 것은 parent::submitConfigurationForm($form, $form_state);and 로 구성된 submitConfigurationForm () 메서드 parent::applyFormStateToConfiguration($form_state);입니다.
Hendrik

1
@ 헨드릭 아니, 당신은 필요하지 않습니다. submitForm()함수 만 사용하여 새 핸들러를 만들었 으며 작동합니다. 다른 모든 함수는 기본 클래스에 있으며 재정의 할 필요가 없습니다. 그건 그렇고 : 일단 알아 내면 아주 좋은 간단한 해결책 ;-)
RWAM

5

Drupal 8 코어 8.4.3에서 hook_form_BASE_FORM_ID_alter를 사용하는 경우 사용자 정의 제출 핸들러를 추가하는 방법이 작동하지 않는 것을 발견했습니다. 제출 핸들러 함수 이름을 추가하는 데 효과적이었습니다.

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

다른 상황에서 Drupal 8.4.5에서 hook_form_FORM_ID_alter를 사용하면 위의 내용이 사용자 정의 제출 핸들러를 추가하는 데 작동하지 않는다는 것을 알았습니다. 대신, 이것은 효과가 있었다 :

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

1

Drupal 8.7.7을 사용하여 search_api모듈 에서 양식에 제출 핸들러를 추가하려고 시도했지만 허용 된 답변이 작동하지 않았습니다 .

이 오류가 발생했습니다.

TypeError: Argument 2 passed to _my_module_search_api_form_submit() must be an instance of FormStateInterface, instance of Drupal\Core\Form\FormState given in ...

작동 시키려면 함수 서명을 인터페이스의 전체 네임 스페이스로 변경했습니다.

function _my_module_search_api_form_submit(array $form, Drupal\Core\Form\FormStateInterface $form_state) { ...
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.