Problembeschreibung / Fehler

Es ist schon eigenartig mit Virtuemart. Auch dieser hier beschriebene Fehler existiert seit mehreren Versionen, einschließlich der Version 1.1.9. Worum geht's:

Auf den Produkt-Detailseiten (Flypages) wird ein Link angeboten zum Versenden einer "Weiterempfehlen-Mail" (recommend-mail). Wird das Formular ausgefüllt, und abgesendet, wird die Mail auch korrekt versendet - nur im Text fehlt der Link zur HomePage - erst recht  zum Produkt das ich empfehlen will. Wem nützt eine solche Mail???
Nun ich vermute, der Grund warum dieser Bug seit einigen Versionen von VM noch nicht behoben ist, ist der, dass hierüber noch ein Disput geführt wird, ob es wohl besser wäre dieses Feature über das Joomla-Mainframe zu realisieren, oder durch VM selbst. Ziel sollte schon sein, dass VM möglichst viele J!-Werkzeuge verwendet ... Aber das kann noch dauern und deshalb wollen wir den Fehler wenigstens vorübergehend beheben:



Ursache für dieses Problem

Der Fehler ist ganz einfach der, dass beim Erzeugen des Mailtextes die Meldung einfach nicht mit diesem Link versehen wird. Hier gibt es ansich keinen Fehler, sondern dies wurde scheinbar schlichtweg noch nicht realisiert. Es besteht folglich Handlungsbedarf die dafür verantwortliche Methode sendRecommendation() im Klassen-Script ps_communication.php zu ergänzen. Um den Eingriff in dieses Core-Script gering zu halten wurden alle notw. Änderungen ausschließlich in dieser Methode vorgenommen, obwohl es bessere Möglichkeiten gäbe, wie z.B. das Durchreichen der notwendigen Parameter. Ebenfalls um eine Abwärtskompatibilität zu früheren Versionen zu behalten (In neuen Versionen von VirtueMart könnte man die Klassenmethode in eigenen Scripten überschreiben).

Lösung / Fehlerbehebung

Wie gesagt: Script classes/ps_communication.php öffnen und die Methode sendRecommendation() aufsuchen. Hier wird dann folgender Sequenz eingefügt (s. START - ENDE):

ps_communication.php
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
 function sendRecommendation( &$d ) {
 global $vmLogger, $VM_LANG, $vendor_store_name, $sess, $mosConfig_live_site;
 
 if (!$this->validate( $d )) return false;
 
 $subject = sprintf( $VM_LANG->_('VM_RECOMMEND_SUBJECT',false), $vendor_store_name );
 $msg = vmRequest::getVar( 'recommend_message', '', 'post' );
 
 // START: product url erzeugen und Link einfügen Mod. Steffen Kraft 2011-11-21
 $pid = $d['product_id'];
 $Itemid = $sess->getShopItemid();
 require_once(CLASSPATH.'ps_product.php');
 $flypage = ps_product::get_Flypage( $pid );
 require_once(CLASSPATH.'ps_product_category.php');
 $cid = ps_product_category::get_cid( $pid );
 $product_url = $mosConfig_live_site."/index.php?option=com_virtuemart&page=shop.product_details&flypage=$flypage&product_id=$pid&category_id=$cid&Itemid=$Itemid";
 $search[] = "/($vendor_store_name)/";
 $msg = preg_replace($search,"<a href=\"$product_url\">$1</a>",$msg);
# $msg = preg_replace($search,"<a href=\"$product_url\">$1</a>",$msg); Nur bei HTML-Mails
 $msg = preg_replace($search,"$product_url$1",$msg); # für plaintext-Mails
 // ENDE 
 
 $send = vmMail($d['sender_mail'], 
 $d['sender_name'],
 $d['recipient_mail'],
 $subject,
 $msg, ''
 );
 
 if ($send) {
 $vmLogger->info( $VM_LANG->_('VM_RECOMMEND_DONE',false) );
 }
 else {
 $vmLogger->warning( $VM_LANG->_('VM_RECOMMEND_FAILED',false) );
 return false;
 }
 
 unset($_REQUEST['sender_name']);
 unset($_REQUEST['sender_mail']);
 unset($_REQUEST['recipient_mail']);
 unset($_REQUEST['recommend_message']);
 
 return true; 
 }
 

Kurz kommentiert: Geholt wird schon vorher der Vendor-Name und im Meldungstext verbaut. Um diesen herum wollen wir unseren Shop-Produkt-Link bauen. Außer der Produkt-ID die wir im Array $d zur Verfügung haben, fehlen uns für den Link alle anderen notwendigen Angaben. Diese müssen wir uns zunächst besorgen. Konkret betrifft das die Flypage und die Kategorie-ID. Wir binden als zusätzliche Voraussetzung $sess und $mosConfig_live_site als globale Variablen ein.

So können wir unseren Link $product_url erzeugen. Per preg_replace() kapseln wir unsern Vendor-Name mit den A-Tag.

Das war der notwenige Eingriff.

Dazu noch folgende Anmerkung: 100%ig fertig ist es so noch nicht, denn die Mail die hiermit verschickt wird, ist eine reine Text-Mail ohne HTML. Insofern ist ein A-Tag nicht sehr hübsch, weil diese eben als plaintext ausgegeben wird. Es gäbe zwei Möglichkeiten

  1. entweder nur den URI ausgeben ohne Tag
  2. oder eine HTML-Mail erzeugen, was an dieser Stelle für eine schnellen Bugfix zu aufwändig wäre.

Die Vollendung wäre selbstverständlich konsequent ein Mail-Template-Script zu erstellen, so wie an anderen Stellen im VM auch und dieses hier sauber zu fetchen. Auch sollte der Link SEF konform umgeschrieben werden - sähe einfach freundlicher aus. Mal sehen, vielleicht finde ich die Zeit dafür mal...