Hier eine Sammlung von Erkenntnissen die das SEF unter VirtueMart 2.x betreffen.

 

Die Router-Scripte

Zunächst sollte man wissen, dass VirtueMart bemüht ist, sich an die J!2.5-Konventionen für das SEF zu halten. Das bedeutet ganz grob, dass durch den J!-Kern schon das SEF über die router.php bereitgestellt wird. Selbstverständlich kann J! nicht die möglichen URi-Parameter einer Komponenten kennen. Deshalb muss auch die Komponenten selbst sich um ihr Routing kümmern. Das passiert üblich ebenfalls über eine Scriptdatei router.php aber im jeweiligen Komponentenverzeichnis - bei Virtuemart z.B. in der /components/com_virtuemart/router.php.

 

Der ein-eindeutige Kategorie-Alias-Name in VirtueMart

Es gibt ein paar Automatismen die man mitunter beobachten kann und sich dann fragt, warum man bestimmt Dinge nicht so erreicht wie man es gerade wünscht.

Am Beispiel: In einem Kundenshop gibt es diverse Autoteile die zunächst in Baugruppen kategorisiert sind und innerhalb der Baugruppen dann nach Fahrzeugmarken. Deshalb kann es also die Kategorie mit dem Namen Porsche in verschiednen Bereichen des Kategoriebaumes geben. Schaut man sich jetzt das dann entstehende SEF an, stellt man fest, dass die SEF-Adressen, die ja aus den Alias-Bezeichnern der Kategorien gebildet werden, zusätzlichen Anhänge erhält. Das kann dann z.B. so aussehen: Aus dem Produktkategorienamen wird beim Speichern automatisch "porsche2012-04-23-14-44-29_". Es wird das Datum und die Uhrzeit angehängt. So eine Datumsangabe macht im SEF selten Sinn, weshalb man die weg haben möchte.



 

Verhindern lässt sich das, wenn man die Generierung des Alias nicht dem Automatismus überlässt, sondern selbst einträgt - aber dieser muss sich dann zwingend von einem evtl. schon existierenden identischem Alias unterscheiden, denn sonst greift der Automatismus sofort wieder korrigierend ein!

Über diese Verfahrensweise wird sichergestellt, dass es keine gleichlautenden SEF-URL für unterschiedliche Seiten gibt.

Leider hat sich Entmündigung auch ein paar Nachteile. Einer ist z.B. aufgetreten bei der Migration eines Projekte von J!1.5/VM1.1x zu J!2.5/VM2.x, bei dem ich zwingend die alten URi auch im neuen Projekt wieder verwenden verfügbar machen wollte, um den Suchmaschinen beim Zugriff auf indizierte Adressen nicht die Beine wegzuziehen. Gleiche Kategorien waren früher kein Problem, sind es aber jetzt. Dieser Sachverhalt lässt sich nicht konfigurieren und ändern - nur durch sehr harte Eingriffe in den Joomla-Core.

Um also diese alten Adressen weiterhin verfügbar zu haben muss man über die J!-SEF-Datenbankeinträge gehen, soll heißen über die J!-Core-Komponente "Umleitungen" diese Adressen weiterleiten auf ihre neue Entsprechungen.

 

Achtung SSL und SEF in VirtueMart 2

Wer gerne mal in der Konfigurationen herumklickt, sollte damit vorsichtig umgehen. Ich hatte in meinem Testprojekt auch mit der VM-Konfiguration experimentiert. Irgendwann stellt ich dann fest, dass bei bestimmten Seiten des Shop der Browser meldete, dass es diese Seite nicht gibt - hauptsächlich die Shop-Spezialseiten wie den Warenkorb oder die Verwaltungsseiten für die Adressen und Accounts etc. betreffem. Ich habe dann aufwändig nach der Ursache gesucht und irgendwann herausgefunden, dass VM versuchte diese Seiten als sichere Seiten aufzurufen, also mit dem Protokoll https://. Genau das brachte mich darauf, womit das zusammenhängen könnte. Ich hatte in meiner Experimentierfreude, den Shop kennenlernen zu wollen, in der VM-Konfiguation die Option "Aktivieren Sie SSL für sensible Bereiche (empfohlen)" aktiviert. Wie der Titel der Option verdeutlicht, es wird empfohlen - ja nur, dass dann sofort das SEF gestört wird. Ein Adresse wie beispielsweise https://www.domain.de/shop/cart.html wird dann nicht mehr gefunden.

Fazit: Zumindest bis VM Version 2.0.6 habe ich dieses (Fehl-)Verhalten feststellen können. Deshalb SEF und SSL vertragen sich nicht zwingend. Diese Option - auch wenn es empfohlen wird - nicht setzt!

 

Aufpassen bei Verwendung von Punkten in Produkt-/Kategoriename und Alias

Bei Erzeugen der Alias-Einträge in VM 2.x wird der Alias nicht sauber SEF-Konform erzeugt. Die VM-Entwickler sagen, dass sie sich hier an die Standards halten. Jedoch macht es Joomla selbst in Details anders. Genau das führt beim Aufruf solcher SEF-Adressen dann im Joomla zu 404-Fehlern. Werden z.B. Punkte im Titel von Produkten oder Kategorien verwendet, so werden diese nicht in "-" umgeschrieben. Die VM-Entwickler sagen, Punkte sind standard-konform. Das Joomla-Routing versteht diese Punkt jedoch nicht.

Wichtig ist, folglich dieses Problem beim Erstellen von Produkte, Kategorien, aber auch Herstellern etc. zu umgehen, in dem einfach keine Punkte verwendet werden oder diese zumindest im Alias / Slug dann überprüft und ggf. manuell ersetzt werden sollten!

Sollten sich doch solche Fehler eingeschlichen haben, dann ist die Korrektur per DB-SQL-Befehl schneller erledigt als eine nachträgliche manuelle Korrektur der Aliase über das VM-Backend.



So sieht die Collection der SQL-Befehle aus, wenn man z.B. einen mehrsprachigen Shop verwendet. Für jede Sprachtabelle müssen die Punkt gesucht und z.B. durch ein "-" ersetzt werden. Sollten auch Hersteller gepflegt worden sein, muss auch hier geprüft werden, ggf. auch in den Versandarten etc.:

update j2ms_virtuemart_products_en_gb set `slug` = replace(`slug`,'.','') where `slug` like '%.%';
update j2ms_virtuemart_products_de_de set `slug` = replace(`slug`,'.','') where `slug` like '%.%';
update j2ms_virtuemart_products_es_es set `slug` = replace(`slug`,'.','') where `slug` like '%.%';
update j2ms_virtuemart_products_it_it set `slug` = replace(`slug`,'.','') where `slug` like '%.%';
update j2ms_virtuemart_products_fr_fr set `slug` = replace(`slug`,'.','') where `slug` like '%.%';
update j2ms_virtuemart_products_nl_nl set `slug` = replace(`slug`,'.','') where `slug` like '%.%';
update j2ms_virtuemart_products_fi_fi set `slug` = replace(`slug`,'.','') where `slug` like '%.%';
update j2ms_virtuemart_products_da_dk set `slug` = replace(`slug`,'.','') where `slug` like '%.%';
update j2ms_virtuemart_products_el_gr set `slug` = replace(`slug`,'.','') where `slug` like '%.%';
update j2ms_virtuemart_products_cs_cz set `slug` = replace(`slug`,'.','') where `slug` like '%.%';
update j2ms_virtuemart_categories_en_gb set `slug` = replace(`slug`,'.','') where `slug` like '%.%';
update j2ms_virtuemart_categories_de_de set `slug` = replace(`slug`,'.','') where `slug` like '%.%';
update j2ms_virtuemart_categories_es_es set `slug` = replace(`slug`,'.','') where `slug` like '%.%';
update j2ms_virtuemart_categories_it_it set `slug` = replace(`slug`,'.','') where `slug` like '%.%';
update j2ms_virtuemart_categories_fr_fr set `slug` = replace(`slug`,'.','') where `slug` like '%.%';
update j2ms_virtuemart_categories_nl_nl set `slug` = replace(`slug`,'.','') where `slug` like '%.%';
update j2ms_virtuemart_categories_fi_fi set `slug` = replace(`slug`,'.','') where `slug` like '%.%';
update j2ms_virtuemart_categories_da_dk set `slug` = replace(`slug`,'.','') where `slug` like '%.%';
update j2ms_virtuemart_categories_el_gr set `slug` = replace(`slug`,'.','') where `slug` like '%.%';
update j2ms_virtuemart_categories_cs_cz set `slug` = replace(`slug`,'.','') where `slug` like '%.%';

.