Problem Mailversand aus ME heraus

Grundlagen

Verantw. für das Versenden der Mails aus dem Kontaktformular der Objektdetailseite heraus sind die beiden Komponenten-Scripte components/com_misterestate/misterestate.php und das Template-Script components/com_misterestate/gui/templates/THEMA/detail.php. In misterestate.php ist die Funktion sendMail() enthalten, die die Formulardaten entgegennimmt, und das Mail-Senden vornimmt. Hier wird auch die Übereinstimmung der Captcha-Nutzereingabe geprüft. In der detail.php eingebettet ist das Script zur Validierung der Formulardaten und das Formular selbst.



Anpassung Formular

Das Formular in der detail.php ist als Tabellen-Layout aufgebaut und zudem sehr weitläufig gestaltet. Hier empfiehlt sich eine tabellenlose Umsetzung.

Hinzugefügt wurde ebenfalls ein Checkbox-Feld [ ] Kopie an mich selbst schicken, so wie es auch im J!-Kontaktformular angeboten wird. Entspr. müssen Eintragungen im Validierungsscript vorgenommen werden und in der misterestate.php dieses neue Feld behandelt werden.

(TODO: In der Kontakteverwaltung gibt es bei den Kontakten unter den Parameter E-Mail-Parameter die Option E-Mail-Kopie. Die Anzeige des Feldes „Kopie an Absender“ im Formular auf der Objekte-Detailseiten sollte davon abhängig gemacht werden.)

Das Validierungs-JavaScript

Fehlerbehebung

Das Script funktioniert per Ajax-Funktion. Dabei werden die Pflicht-Formularfelder zunächst auf Vollständigkeit geprüft. Danach erfolgt das Senden der Formulardaten, in dem diese zu einem PostString zusammengesetzt werden und dieser per makeRequest(url, poststr) gesendet wird an folgenden URL: /index.php?option=com_misterestate&view=object&task=mail.

Das Script ist jedoch nicht vollständig und korrekt umgesetzt. Es wird nämlich die Checkbox „Besichtigung erwünscht“ nicht korrekt verarbeitet. Das Feld mit form.inspect.value auszulesen ist wenig sinnvoll, weil der Value nicht den Zustand widergibt, sondern den evtl. gesetzt Value, der aber eigentlich für den Zustand unbedeutend ist. Eingefügt wurde deshalb eine Zeile, die den value vorher abhängig vom Checkzustand belegt:

if ( form.inspect.checked ) { form.inspect.value = 1 } else { form.inspect.value = 0 };
Erweiterung durch Email-Copy

Dem Formular wurde ein zusätzliches Checkbox-Feld email_copy hinzugefügt. Damit dieses durch das JS beim Senden mit berücksichtigt werden kann müssen zwei Zeilen eingefügt werden.

Wie oben bei inspect schon erwähnt, muss auch das Checkzustand von email_copy dem Value zugewiesen werden.

if ( form.email_copy.checked ) { form.email_copy.value = 1 } else { form.email_copy.value = 0 };

Der nun vorhandene Value muss dem poststr hinzugefügt werden

+ "&inspect=" + form.inspect.value
+ "&message=" + form.message.value
+ "&email_copy=" + form.email_copy.value;

Der Funktion-validate()-Konflikt

Auch nach Korrektur obiger Sachverhalte ist das Senden von Mails noch immer nicht zuverlässig mgl. Hierfür stellte sich ein weiterer Grund heraus: Das Anfrage-Formular und auch das Quicksearch-Formular verwenden jeweils eigene Scripte und darin  eine jeweils gleichlautende Funktion validate(). Je nach Seitenaufbau kann das gut gehen, oder eben zu dem Konflikt führen, da die falsche validate-Funktion sich für die Prüfung der Formulardaten verantwortlich fühlt.

Das Problem lässt sich nur durch Umbenennen der Funktion ein validateContactForm() und validateQuicksearchForm() beheben.

Das Quicksearch-Formular und Validate-Script befindet sich in modules/mod_me_quicksearch/tmpl/default.php. Hier müssen Definition und Aufruf der Funktion validate() gleichnamig umbenannt werden.

Für das Kontaktformular ist das Script components/com_misterestate/gui/templates/THEME/detail.php veranwortlich und im Projektfall das an gleicher Stelle liegende ausgelagerte Script contacform.js. Die validate()-Funktion wurde umbenannt in validateContactForm().

Auslagerung in externes Script

Richtigerweise wird das Script komplett in das HTML-Dokument eingebettet. Der Grund dafür ist, dass im Script z.B. auch Meldungen im Fehlerfall oder bei Unvollständigkeit ausgegeben werden. Diese sind sprachabhängig und werden folglich per JText::_(‘TEXT‘) eingelinkt werden. Wenn das Script allerdings aus Seiten ausgeführt wird, welche eh nur in Deutsch angeboten werden ist es aus Daten-Performance-Gründen sinnvoll das Script fertig übersetzt auszulagern und dann nur als Link aufzurufen. Ein kleiner Nachteil besteht dann allerdings noch: die URL kann dann nicht abhängig vom Joomla-URL-Pfad angepasst werden, es sei denn diese wird in einem verbliebenen Mini-Script dem eigentlichen Script als Variable verfügbar gemacht.

Beide Dinge, sowohl die Sprach-Fehler-Meldungen als auch die livesite wird nun über Hidden-Felder im Formular als livesite, NoName, NoValidMail, NoMsg übergeben und können sich vom nun neutralen JS aus dem Formular geholt werden. Das Script kann somit kompl. ausgelagert werden.

Das Einbinden erfolgt mit einem Fetch-Script, welches auch in der Lage ist ggfl. zu komprimieren. Dieses wurde hergeholt von VirtueMart und nannte sich dort themes/fetchscript.php. Dieses Script wurde umbenannt in gzip_fetchscript.php und in die Joomla-Wurzel gelegt, damit es allen J!Komponenten gemeinsam einfach zur Verfügung steht. Eingelinkt wird es so – in zwei mgl. Varianten an einer beliebigen Stelle in der datail.php, weil das Script sowieso in den Seiten-Header platziert wird:

Variante 1 mit JHTML::script() und ohne gzip_fetchscript:
JHTML::script('contactform.js', $this->livesite.'components/com_misterestate/gui/templates/themis/');
 
Variante 2 mit addCustomHeadTag() und mit gzip_fetchscript:
$mainframe->addCustomHeadTag('<script type="text/javascript" src="'.$this->livesite.'gzip_fetchscript.php?gzip=1&amp;subdir[0]=/components/com_misterestate/gui/templates/themis/&amp;file[0]=contactform.js" charset="utf-8"></script>');  

Die Nutzung von fetchscript hat den Vorteil, dass mehrere Scripte mit einem Mal im Array supdir[] und file[] übergeben werden können, die dann als ein Stück komprimiert gleaden werden können. Variante 2 hat außerdem den Vorteil, das die CharSet-Anweisung mit übergeben werden kann.

Mail-Textausgaben

Leider sind auch diese nicht konsequent und korrekt ausgeführt in misterestate.php. So wird z.B. für die Mail-Kopie an den Absender eine J!-SprachText „Copy of“ verwendet. Das entspricht in Schreibweise nicht der Regel, wird auch in keinen Sprachdateien gefunden und es wird in der falschen Reihenfolge JText() und sprintf() verwendet. Ein Leerzeichen sollte es im Bezeichner nicht geben!

„Copy of“ wurde in der de-DE.com_misterestate.themis.ini als MET_COPY_OF aufgenommen als =‘Mailkopie von‘ (Achtung! Das ist projektspezifisch!)

Weitere Anpassungen

  • detail.php wurde das komplette Formular tabellenfrei umgesetzt und diverse kleine Änderungen vorgenommen.
  • misterestate.php wurde die sendMail-Funktion durch die J!mail-Funktion ersetzt, die ordnungsgemäß mit SMTP zusammenarbeitet. Dabei wurde auch eine getrennte Funktion für mail_copy an Absender und an Administrator eingefügt. Die Admin-Mail-Copy ist allerdings noch nicht vollendet und ausgeprüft.
  • Die Mails gehen nur als Textmails raus, könnten später nach dem Virtuemart-Prinzip noch als HTML-Variante versendet werden.
  •  weitere Dinge wurden aus Zeitgründen nicht kommentiert oder noch nicht gemacht.


+ "&inspect=" + form.inspect.value

+ "&message=" + form.message.value

+ "&email_copy=" + form.email_copy.value;