Додайте до форми спеціальний обробник подання


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 Я додаю свій гачок_форма_алтер.
Юсеф

який ваш код ще $ form ['Actions'] ['submit'] ['# submit']? Спробуйте замінити ['submit'] на [$ action].
ГР

Відповіді:


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 документ він говорить $form['actions']['submit']['#submit'][].
Без зачистки


1
Цікаво, так, можливо, йому потрібно провести цикл дії. Хоча, в цьому іншому Q Як ви реалізуєте користувацький обробник подання у куці_форма_алтер ()? припустимо, працювати так, як він це робить.
Без зачистки

3
Кожна форма має різні структури. Тож конкретної відповіді немає.
MrD

5
Див. Drupal.org/node/1901216 та drupal.org/node/2068063 для отримання більш детального контексту про те, для чого потрібна ця петля
Бердір

18

Створення користувальницького плагіна для обробки веб-форм для drupal 8.

Цей документ передбачає, що ви вже встановили та включили веб-форму та веб-форму

1) Створіть свою веб-форму. - Перейдіть до структури -> веб-форм і натисніть кнопку "+ Додати веб-форму". - Ви можете або використовувати ui, або використовувати yaml, це залежить від вас. приклад yaml для форми однієї поля, яка містить електронну адресу:

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

Відступ важливий для ямла, тому переконайтеся, що ви його правильно. відступи - пробіли.

Тепер збережіть форму.

2) Створення плагіна для обробки веб-форм

Далі ми можемо створити новий плагін, який з’явиться у розділі «Електронна пошта / Обробники» під час редагування веб-форми. Я буду називати його myhandler, ви можете називати його, що хочете, за умови, що ви заміните всі згадки про myhandler на вибране ім'я.

a) Створіть нову папку для свого плагіна, зробіть це у вашому корінці drupal (згаданому тут / var / www / html /) у наступній підпапці: / var / www / html / module / 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 / module / Custom / myhandler / src in src create Plugin in Plugin 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" або "розширити"), а потім відновіть кеш Drupal ("drush cr" з будь-якого місця під вашим корінком drupal (/ var / www / html тут), це зробить, якщо ви використовуєте drush)

6) відредагуйте веб-форму, перейдіть до "Електронна пошта / Обробники" та натисніть кнопку "+ Додати обробник". Ви повинні побачити ваш плагін у списку, натисніть кнопку Додати обробник, тепер ви повинні побачити вікно із запитом URL для подання. натисніть кнопку Зберегти. Якщо щось не виглядає правильно, або воно не працює, перевірте журнал помилок apache, там ви можете знайти щось корисне.

7) Перевірте форму - зробіть подання до форми, а потім перевірте журнал сторожової собаки (drush ws), ви повинні побачити надіслані їй значення. Вони можуть бути врізані у висновок, який ви бачите, не панікуйте, це все є. Що ви робите з цим зараз, залежить від вас.

Сподіваюся, що це комусь допоможе. Я обмотав це разом із речей, які я знайшов навколо цього місця, і записав його в єдиний документ. Дякую іншим, хто мене тут завів.


1
Якщо я правильно це визнаю, для правильної роботи обробника, якого не вистачає у наведеному вище коді, є метод submitConfigurationForm (), що складається з parent::submitConfigurationForm($form, $form_state);та parent::applyFormStateToConfiguration($form_state);.
Гендрік

1
@Hendrik Ні, це вам не потрібно. Я створив нового обробника з лише submitForm()функцією, і він працює. Усі інші функції розташовані в базовому класі, і я не маю потреби їх перекривати. До речі: досить приємне просте рішення, як тільки ви це зрозумієте ;-)
RWAM

5

якщо за допомогою гачки_form_BASE_FORM_ID_alter в ядрі Drupal 8 8.4.3 я знайшов способи додавання користувальницького обробника подачі не працював. Це працювало для додавання назви функції обробника подання:

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

В іншій ситуації, використовуючи гачку_форма_FORM_ID_alter в Drupal 8.4.5, я виявив, що вищезгадане не працювало для додавання користувальницького обробника подачі. Натомість це спрацювало:

$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) { ...
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.