Das Örtchen RSS-Feed
Kategorie
Kategorie: Blog
Buttons & Statistiken
Neueste Kommentare

Drupal: Webform und bedingte E-Mail-Empfänger?!?

Heute stand ich im Rahmen eines Projektes vor dem Problem, daß ich gerne ein Formular mit einer einfachen Empfängerauswahl umgesetzt hätte. Leider ist dies mit dem Modul Webform nicht so einfach, wie es sich zunächst anhört (auch wenn alle meine Empfänger zur gleichen Domain gehören).

Das Problem

Theoretisch ist die ganze Sache laut Dokumentation extrem simpel, da Webform schon eine ganze Weile Bedingte E-Mail-Empfänger (engl. Conditional recipients) beherrscht. Wie in der Anleitung beschrieben, legt man einfach ein neues Feld vom Typ select als Pflichtfeld an, dessen Wert jedoch nicht per E-Mail verschickt wird. Als Optionen gibt man hierbei einfach zeilenweise Schlüssel-Wert-Paare an, welche durch eine Pipe getrennt werden und bei denen die E-Mail-Adressen die Werte vor der Pipe sind. Abschließend wählt man das entsprechende Feld lediglich noch bei den bedingten Empfängern aus und schon wäre man eigentlich fertig. Leider ist man dies nicht wirklich, da dummerweise alle E-Mail-Adressen im Klartext im HTML-Code des Formulars zu finden sind.

Die Recherche

Im Rahmen meiner Recherche habe ich mich mit den in den Kommentaren verlinkten Beiträgen beschäftigt:

  1. Please explain 'Conditional e-mail recipients' and 'E-mail a submission copy'
  2. Encode emails in select drop-downs to prevent email harvesting
  3. Multiple Options, Same Value in 'Select' Form Element (+ Protect from Spam Harvesters)

Beitrag 1

Der Beitrag enthielt leider keine brauchbaren Informationen außer dem Link zu Beitrag 3 und brachte mit somit nicht weiter.

Beitrag 2

Der eigentliche Beitrag enthält einen Patch, der jedoch seit über einem Jahr nicht ins Webform-Modul integriert wurde und somit für mich nicht in Frage kommt, da ein gepatchtes Modul nicht durch meine Kunden aktualisierbar ist.

Kommentar 10 enthält ein kleines Modul, welches für meine derzeitige Problemstellung mit nur einer Domain brauchbar wäre, jedoch nicht wirklich nach meinem Geschmack ist.

Beitrag 3

Kommentar 29 enthält eine Lösung in Form eines kleinen Moduls, welches vom Ansatz her vergleichbar mit Kommentar 10 aus Beitrag 2 ist und ebenfalls nicht ein Frage kommt, da der Kunde ein spezielles Format zur Eingabe der E-Mail-Adressen kennen müsste.

Kommentar 35 hörte sich ganz brauchbar an, das entsprechende Modul wird jedoch für Version 3 von Webform entwickelt und ist meines Wissens nach nicht im offiziellen Modul-Verzeichnis.

Kommentar 43 enthielt, dann endlich den Hinweis auf ein Modul nach meinem Geschmack. Das Modul ist schönerweise sehr allgemein gehalten und kann jegliche Schlüssel von Optionen aus dem HTML-Code entfernen. Es bleiben lediglich durchnummerierte Angaben. Leider gibt es für das Modul Private Choice noch keine direkte Anbindung an das Modul Webform. Deswegen habe ich mir die Einbauanleitung etwas genauer angesehen in der Hoffnung, dies mit einem kleinen Zusatz-Modul erledigen zu können.

Die Lösung?

Herausgekommen ist ein kleines Modul zur Verbindung von Webform und Private Choice, welches nach Webforms sucht und in diesen nachsieht, ob bedingte Empfänger in Form einer Select-Auswahl vorhanden sind.

function webform_privatechoice_in_form_alter(&$form, &$form_state, $form_id) {
  //identify forms made with the module webform
  if (
    isset($form['#theme']) &&
    is_array($form['#theme']) &&
    in_array('webform_form', $form['#theme'])
  ) {
    //identify webforms with additional emails
    if (
      isset($form['#parameters']) &&
      isset($form['#parameters'][2]) &&
      is_object($form['#parameters'][2]) &&
      isset($form['#parameters'][2]->webform['additional_emails']) &&
      is_array($form['#parameters'][2]->webform['additional_emails'])
    ) {
      $additional = $form['#parameters'][2]->webform['additional_emails'];
      foreach ($additional as $component_id) {
        $form_key = '';
        if (
          is_numeric($component_id) &&
          isset($form['#parameters'][2]->webform['components'][$component_id]) &&
          ($form['#parameters'][2]->webform['components'][$component_id]['type'] == 'select')
        ) {
          $form = $form['#parameters'][2]->webform;
          $form_key = $form['components'][$component_id]['form_key'];
          break;
        }
      }
      if (!empty($form_key)) {
        $form[submitted][$form_key]['#privatechoice'] = true;
      }
    }
  }
}

Hinweis: Das Modul webform_privatechoice_in aktiviert zwar zuverlässig die Unterstützung von Private Choice, doch leider verursacht Private Choice ein Validierungs-Problem. Sinnvollerweise ergänzt Webform nämlich eine Leerauswahl als erste Option, da meine Empfängerauswahl ein Pflichtfeld ist. Leider ändert Private Choice jedoch auch den Options-Wert dieser Leerauswahl, wodurch die Pflichtfeld-Validierung nicht mehr greift. Auch mit dem Modul Webform Validation habe ich leider keine Lösung für dieses Problem gefunden.

Fazit

Nachdem ich mich heute genug herumgeärgert habe und auch der Blog-Beitrag Non-Unique Conditional Email Addresses with Webform.Module keine neuen Erkenntnisse brachte, habe ich zur Billig-Lösung gegriffen und mit dem Modul Node clone einfach eine Kopie des Formulars für jeden Ansprechpartner angelegt.

Hallo! Bist du neu hier? Dann abonniere doch den RSS-Feed dieses nicht mehr ganz so stillen Örtchens, um über meine geistigen Ergüsse auf dem Laufenden zu bleiben. Alternativ besteht auch die Möglichkeit, sich von FeedBurner per E-Mail über meine Ausscheidungen benachrichtigen zu lassen.

Neuen Kommentar schreiben

Der Inhalt dieses Feldes wird nicht öffentlich zugänglich angezeigt.
Der Inhalt dieses Feldes wird öffentlich zugänglich angezeigt, aber als rel="nofollow" markiert.
Hinweis

Kommentare beleben den Blog! Ich freue mich über jeden Kommentar. Du kannst hier offen Deine Meinung zum Artikel sagen, aber bitte beachte die Netiquette und vermeide es andere zu beleidigen.

Bitte unterlasst es die Kommentare zu SEO-Zwecken zu missbrauchen. Kommentare mit Links, die nicht zu Blogs führen (oder zu Blogs mit Grauzonen-Themen) und/oder Keywords als Namen verwenden, sind nicht erwünscht!

Möchtest Du mir einen Blog-Artikel schmackhaft machen, dann schreib die URL ohne HTML-Tag in den Kommentarbereich und ich werde diesen bei Gefallen verlinken.