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
- entweder nur den URI ausgeben ohne Tag
- 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...