Dodaj niestandardową procedurę obsługi przesyłania do formularza

19

Jak mogę dodać niestandardową procedurę obsługi przesyłania formularzy?

Próbowałem dodać $form['#submit'][] = 'mymodule_form_submit';lub $form['actions']['submit']['#submit'][] = 'mymodule_form_submit';do 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?");
}

Wydaje się, że drupal_set_message()nie nazywa się. Próbowałem również odbudować pamięć podręczną, ale funkcja nadal nie jest wywoływana.

Używam Drupal 8.2.3.

Yusef
źródło
Powinieneś pokazać pełną implementację hook_form_alter(), lub nieco trudniej jest ci powiedzieć, co robisz źle. Powinieneś także powiedzieć, którą formę chcesz zmienić.
kiamlaluno
@kiamlaluno I add my hook_form_alter.
Yusef
jaki jest twój kod wciąż $ form ['akcji'] ['zgłoś'] ['# zgłoś']? Spróbuj zastąpić [„prześlij”] na [$ action].
Mr

Odpowiedzi:

25

Jeśli używasz, hook_form_node_form_alter()możesz użyć przykładowego kodu :

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

i przesłać funkcję

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?");

}
MrD
źródło
1
$form['actions'][$action]['#submit'][]jaką dokumentację przeglądasz? czy zrobiłeś literówkę? W tym dokumencie hook_form_alter jest napisane $form['actions']['submit']['#submit'][].
Bez Sssweat,
1
Interesujące, tak, może on musi przejrzeć działania. Chociaż w tym drugim Q Jak zaimplementować niestandardową procedurę obsługi przesyłania w hook_form_alter ()? przypuszczalnie działa tak, jak on to robi.
Bez Sssweat,
3
Każda forma ma inną strukturę. Więc nie ma konkretnej odpowiedzi.
Mr
5
Zobacz drupal.org/node/1901216 i drupal.org/node/2068063, aby uzyskać więcej informacji na temat tego, dlaczego ta pętla jest konieczna
Berdir,
18

Tworzenie niestandardowej wtyczki do obsługi formularzy internetowych dla drupal 8.

Ten dokument zakłada, że ​​już zainstalowałeś i włączyłeś webform i webform-ui

1) Utwórz swój formularz internetowy. - Przejdź do struktury -> formularze internetowe i naciśnij przycisk „+ Dodaj formularz internetowy”. - Możesz użyć interfejsu użytkownika lub yaml, to zależy od ciebie. przykład yaml dla formularza z jednym polem, który przyjmuje adres e-mail:

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

Wcięcie jest ważne dla yaml, więc upewnij się, że dobrze to zrobisz. wcięcia są spacjami.

Teraz zapisz formularz.

2) Tworzenie wtyczki modułu obsługi formularzy internetowych

Następnie możemy utworzyć nową wtyczkę, która pojawi się w sekcji „Wiadomości e-mail / handlery” podczas edycji formularza internetowego. Nazywam to myhandler, możesz nazwać to jak chcesz, pod warunkiem, że zastąpisz wszystkie wzmianki o myhandler wybraną nazwą.

a) Utwórz nowy folder dla swojej wtyczki, zrób to w swoim katalogu głównym drupal (określanym tutaj jako / var / www / html /) w następującym podfolderze: / var / www / html / modules / Custom / myhandler

b) Utwórz nowy plik w powyższym katalogu o nazwie myhandler.info.yml w tym pliku jest następujący:

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

3) Utwórz katalog src w katalogu modułów, np .: / var / www / html / modules / Custom / myhandler / src in src create Plugin in Plugin create WebformHandler

(można to osiągnąć za jednym razem, używając

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

co sprawi, że cała struktura za jednym razem użyje flagi -p do mkdir.)

4) Utwórz nowy plik /var/www/html/modules/Custom/myhandler/src/Plugin/WebformHandler/MyFormHandler.php

w tym pliku znajduje się następujący kod php, opuściłem konfigurację formularza konfiguracji, abyś mógł zobaczyć, jak skonfigurować wtyczkę w razie potrzeby.

<?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) Włącz moduł MyHandler (używając menu drush lub rozszerz), a następnie odbuduj pamięć podręczną drupal („drush cr” z dowolnego miejsca pod twoim rootem drupal (/ var / www / html tutaj) by to zrobił, jeśli używasz drush)

6) edytuj swój formularz internetowy, przejdź do „E-mail / handlerów” i kliknij przycisk „+ Dodaj moduł obsługi” Powinieneś zobaczyć swoją wtyczkę na liście, kliknij przycisk Dodaj moduł obsługi, powinieneś teraz zobaczyć pole z prośbą o podanie adresu URL przesyłania. kliknij przycisk Zapisz. Jeśli coś nie wygląda dobrze lub nie działa, sprawdź dziennik błędów apache, może tam być coś pomocnego.

7) Przetestuj formularz - prześlij formularz, a następnie sprawdź dziennik nadzoru (drush ws), powinieneś zobaczyć wartości przesłane do niego. Mogą one zostać obcięte na wyjściu, które widzisz, nie panikuj, to wszystko tam jest. To, co teraz z tym zrobisz, zależy od ciebie.

Mam nadzieję, że to komuś pomoże. Zebrałem go z rzeczy znalezionych w tym miejscu i zapisałem w jednym dokumencie. Dzięki innym, którzy mnie tu dostali.

CptnObvious
źródło
1
Jeśli dobrze to zrozumiem, jedyną drobną rzeczą, której brakuje w powyższym kodzie, aby moduł obsługi działał poprawnie, jest metoda submConfigurationForm (), składająca się z parent::submitConfigurationForm($form, $form_state);i parent::applyFormStateToConfiguration($form_state);.
Hendrik
1
@Hendrik Nie, nie potrzebujesz tego. Utworzyłem nowy moduł obsługi z tylko submitForm()funkcją i działa. Wszystkie pozostałe funkcje znajdują się w klasie bazowej i nie muszę ich zastępować. Nawiasem mówiąc: całkiem fajne proste rozwiązanie, gdy się
zorientujesz
5

jeśli korzystam z hook_form_BASE_FORM_ID_alter w Drupal 8 core 8.4.3, zauważyłem, że sposoby dodawania niestandardowego modułu obsługi przesyłania nie działały. Działa to w przypadku dodawania nazwy funkcji obsługi modułu wysyłania:

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

W innej sytuacji, używając hook_form_FORM_ID_alter w Drupal 8.4.5, stwierdziłem, że powyższe nie działało w przypadku dodawania niestandardowego modułu obsługi przesyłania. Zamiast tego zadziałało:

$form['actions']['submit']['#submit'][]  = 'mymodule_submit_handler';
Anthony Fournier
źródło
1

Przyjęta odpowiedź nie działała dla mnie przy użyciu Drupal 8.7.7, próbując dodać search_apimoduł obsługi przesłania do formularza z modułu.

Mam ten błąd:

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 ...

Aby to działało, zmieniłem sygnaturę funkcji na pełną przestrzeń nazw interfejsu:

function _my_module_search_api_form_submit(array $form, Drupal\Core\Form\FormStateInterface $form_state) { ...
użytkownik1359
źródło