Shop-Sprache auf IP-Basis umstellen

Hallo zusammen, wir leiten einige Domains auf eine Hauptdomain um und möchten dabei gerne auf Basis der IP-Adresse des Besuchers bereits die (hoffentlich) korrekte Sprache voreinstellen. Mein bisheriger Lösungsansatz sieht vor, eine Funktion zu implementieren, welche bei Aufruf jeder URL checkt, ob es bereits eine Session für die Shop-ID gibt und wenn nicht, diese entsprechend der passenden Sprache zu setzen. Das Problem hierbei ist: ich weiß nicht, wo ich mein Plugin nachher „einhaken“ soll. Ich konnte bisher keine Stelle finden, welche vor dem Redirect auf die Hauptdomain greift, wodurch eine gesetzte Session nach dem Redirect nicht mehr vorhanden ist und dementsprechend auch nicht korrekt ausgewertet wird. Wo genau findet denn diese Umleitung statt? Ich hatte engine/Shopware/Plugins/Default/Core/Router/onRouteStartup im Verdacht, aber auch davor wurde der Redirect bereits abgesetzt. Ich hoffe, einer von euch hat den richtigen Hinweis für mich…

Und deine Umleitung macht sicher Shopware, nicht Einträge in der .htaccess? Denn die greifen weit bevor der Shop überhaupt was von der ganzen Sache mitbekommt.

mh … eigentlich müsstest du dich doch „nur“ in den Enlight_Controller_Action_PreDispatch_Frontend_Index einhaken oder? Und dann deine Aktion durchführen.

@msslovi0 An htaccess liegt es nicht. Die Umleitung wird durch den Shop verursacht, wenn ich innerhalb der shopware.php ein ‚die;‘ ausführe bevor der Kernel das Handling übernimmt, findet keine Weiterleitung statt. @kayyy Danke für deinen Hinweis. Aber diese Aktion gilt, wenn ich das richtig verstanden habe, ja nur für die Hauptseite. Wenn nun jemand mit der 2. Domain direkt auf eine Unterseite navigiert, würde es nicht funktionieren.

Eigentlich nicht nein. Du speicherst ja den Cookie oder die Session. Und bevor der frontend Controller ausgeführt wird wird jedes Mal überprüft ob der Cookie gesetzt ist. Alternativ könnte man das auch direkt in die shopware.php schreiben. Wäre natürlich unsauber aber würde auch funktionieren.

Innerhalb der shopware.php wird leider nicht funktionieren, da die Session und Cookies Domain-bezogen gespeichert werden. Wenn nun jemand über die 2. Domain auf den Shop kommt wird die Session zwar korrekt gesetzt, kann von der Hauptdomain allerdings nicht verwendet werden. Die PreDispatch-Methode scheint schon mal der richtige Anhaltspunkt zu sein. Einziges Problem, wie befürchtet, ist, dass das tatsächlich nicht für Unterseiten gilt. Ich habe zum Test hierzu einfach direkt in der Datei Engine/Shopware/Controllers/Frontend/index.php ein “die;” eingefügt. Und das greift dann nur auf der Hauptseite. Nach einem PreDispatch für alle Routes im Frontend suche ich noch.

Mit dem Anstoß in die richtige Richtung ist eigentlich alles ganz einfach :slight_smile: Wenn man “index” beim subscribeEvent weglässt, passt es auf alle Routes. Cookie setzen, noch mal auf die aufgerufene URL umleiten (da der Shop zu diesem Zeitpunkt bereits initialisiert ist) und fertig. public function install() { $this-\>subscribeEvent( 'Enlight\_Controller\_Action\_PreDispatch', 'onFrontendPreDispatch' ); return true; } public function onFrontendPreDispatch(Enlight\_Event\_EventArgs $args) { $request = $args-\>getSubject()-\>Request(); $response = $args-\>getSubject()-\>Response(); $host = gethostbyaddr($\_SERVER['REMOTE\_ADDR']); $domain = substr($host, strrpos($host,'.')+1); if ($domain == 'li' && ! $request-\>getCookie('shop')) { $response-\>setCookie('shop', 5); $response-\>setRedirect($request-\>get('REQUEST\_URI')); } }