Bir forma özel gönderim işleyicisi ekleme


19

Özel form gönderme işleyicisi nasıl ekleyebilirim?

Ben ekleyerek çalıştı $form['#submit'][] = 'mymodule_form_submit';ya $form['actions']['submit']['#submit'][] = 'mymodule_form_submit';kadar 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?");
}

Öyle görünmüyor drupal_set_message(). Ayrıca önbelleği yeniden oluşturmayı denedim, ancak işlev hala çağrılmadı.

Drupal 8.2.3 kullanıyorum.


Uygulamanın tamamını göstermelisiniz, hook_form_alter()yoksa neyi yanlış yaptığınızı söylemek biraz daha zor. Ayrıca, hangi formu değiştirmeye çalıştığınızı söylemelisiniz.
kiamlaluno

@kiamlaluno hook_form_alter'ımı ekledim.
Yusef

kodun hala ne? $ form ['actions'] ['gönder'] ['# gönder']? ['Gönder'] ifadesini [$ action] ile değiştirmeyi deneyin.
MrD

Yanıtlar:


25

Kullanıyorsanız örnek kodhook_form_node_form_alter() kullanın :

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

ve gönderme fonksiyonu

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'][]hangi belgeleri görüntülüyorsunuz? ya da bir yazım hatası yaptın mı? Bu hook_form_alter belgesinde diyor $form['actions']['submit']['#submit'][].
Hayır Sssweat


1
İlginç, evet belki de eylemler arasında dolaşması gerekiyor. Bununla birlikte, bu diğer Q'da hook_form_alter () içine özel bir gönderici nasıl uygularsınız? onun yaptığı gibi çalıştığını varsayalım.
Hayır Sssweat

3
Her formun farklı yapıları vardır. Yani özel bir cevap yok.
MrD

5
Bkz drupal.org/node/1901216 ve drupal.org/node/2068063 o döngü neden gerekli olduğunu konusunda daha fazla bağlam için
Berdir

18

Drupal 8 için özel bir webform handler eklentisi oluşturma.

Bu belgede, web formunu ve webform-ui'yi zaten yüklediğinizi ve etkinleştirdiğiniz varsayılmaktadır

1) Web formunuzu oluşturun. - Yapı -> web formlarına gidin ve "+ Web formu ekle" düğmesine basın. - Kullanıcı arayüzünü kullanabilir veya yaml kullanabilirsiniz, bu size kalmış. e-posta adresi alan bir alan formu için örnek yaml:

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

Girinti yaml için önemlidir, bu yüzden doğru aldığınızdan emin olun. girintiler boşluktur.

Şimdi formunuzu kaydedin.

2) Webform işleyici eklentisi oluşturma

Ardından, web formunu düzenlerken "E-postalar / İşleyiciler" bölümünde görünecek yeni bir eklenti oluşturabiliriz. Benim işleyici olarak adlandıracağım, benim işleyicimin tüm sözlerini seçtiğiniz adla değiştirirseniz, istediğiniz şeyi arayabilirsiniz.

a) Eklentiniz için yeni bir klasör oluşturun, bunu aşağıdaki alt klasörde drupal kökünüzde (/ var / www / html / olarak anılır) yapın: / var / www / html / modules / Custom / myhandler

b) Yukarıdaki dizinde bu dosyada myhandler.info.yml adlı yeni bir dosya oluşturun:

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

3) Modül dizininizde bir src dizini oluşturun, örneğin: / var / www / html / modules / Custom / myhandler / src in src eklentisinde eklenti oluşturun WebformHandler oluşturun

(bu tek seferde kullanarak elde edilebilir

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

bu da mpdir'e -p bayrağını kullanarak tüm yapıyı tek seferde yapacak.)

4) Yeni bir dosya oluşturun /var/www/html/modules/Custom/myhandler/src/Plugin/WebformHandler/MyFormHandler.php

Bu dosyada aşağıdaki php kodu gider, ben gerekirse eklenti yapılandırmak nasıl görebilirsiniz görebilirsiniz yapılandırma formu kurulum bıraktım.

<?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 modülünüzü etkinleştirin (drush veya expand menüsünü kullanarak) ve drupal önbelleğinizi (drupal kökünüzün altındaki herhangi bir yerden "drush cr" yeniden oluşturun (/ var / www / html burada drush kullanırsanız)

6) web formunuzu düzenleyin, "E-posta / İşleyiciler" e gidin ve "+ İşleyici Ekle" düğmesini tıklayın Eklentinizin listelendiğini, İşleyici Ekle'yi tıklayın, şimdi gönderim URL'sini soran bir kutu görmelisiniz. Kaydet düğmesine tıklayın. Bir şey düzgün görünmüyorsa veya çalışmıyorsa, apache hata günlüğünü kontrol edin, orada yararlı bir şeyler bulabilirsiniz.

7) Formunuzu test edin - forma gönderin ve ardından gözlem günlüğünü (drush ws) kontrol edin, kendisine gönderilen değerleri görmelisiniz. Gördüğünüz çıktıda kesilmiş olabilirler, panik yapmayın, hepsi orada. Bununla şimdi ne yapacağınız size kalmış.

Umarım bu birine yardımcı olur. Yeri çevresinde bulduğum şeylerden bir araya getirdim ve tek bir belgeye yazdım. Beni buraya getiren diğerlerine teşekkürler.


1
Ben doğru alırsanız, işe işleyicisi için yukarıdaki kodda eksik bir küçük şey doğru oluşan submitConfigurationForm () yöntemidir parent::submitConfigurationForm($form, $form_state);ve parent::applyFormStateToConfiguration($form_state);.
Hendrik

1
@Hendrik Hayır, ihtiyacın yok. Ben sadece bir submitForm()fonksiyonu ile yeni bir işleyici yarattım ve işe yarıyor. Diğer tüm işlevler temel sınıfta bulunmaktadır ve bunları geçersiz kılmaya gerek yoktur. Bu arada: bir kez sen anlamaya oldukça güzel bir basit çözüm ;-)
RWAM

5

Drupal 8 çekirdeği 8.4.3'te hook_form_BASE_FORM_ID_alter kullanılıyorsa, özel gönderme işleyicisini eklemenin yollarını bulmadım. Bu, gönderici işleyici işlev adını eklemek için çalıştı:

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

Başka bir durumda, Drupal 8.4.5'te hook_form_FORM_ID_alter kullanarak, yukarıdaki özel gönderme işleyicisi eklemek için işe yaramadı bulundu. Bunun yerine, bu işe yaradı:

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

1

Kabul edilen cevap, search_apimodülden bir forma bir gönderme işleyicisi eklemeye çalışarak, Drupal 8.7.7'yi kullanarak benim için çalışmadı .

Bu hatayı aldım:

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

Çalışmasını sağlamak için işlev imzamı arayüzün tam ad alanına değiştirdim:

function _my_module_search_api_form_submit(array $form, Drupal\Core\Form\FormStateInterface $form_state) { ...
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.