falls jemand eine einfache Lösung sucht, wie man einem Nutzer nach Login direkt eine Währung passend zu seinem Land zuordnen kann - ich habe gerade sowas gebaut.
Das Ganze steckt bei mir noch testweise in core/oxuser.php (kommt natürlich später in ein eigenes Modul).
Genauer: In der Funktion login ab Zeile 1215, also nach dem “load from DB”-Abschnitt und direkt vor der schliessenden Klammer von “if ( $sPassword ) {” aus Zeile 1175:
// currencies
// 0 = EUR (default currency!)
// 1 = PLN
// 2 = SEK
// 3 = GBP
// 4 = CHF
// 5 = DKK
// set currency depending on country
switch ($this->oxuser__oxcountryid->value)
{
case "8f241f1109624d3f8.50953605":
// Poland
$setCur = 1;
break;
case "a7c40f6321c6f6109.43859248":
// Switzerland
$setCur = 4;
break;
case "a7c40f632848c5217.53322339":
// Sweden
$setCur = 2;
break;
case "8f241f110957e6ef8.56458418":
// Denmark
$setCur = 5;
break;
case "a7c40f632a0804ab5.18804076":
// UK
$setCur = 3;
break;
default:
// EUR as standard for remaining countries
$setCur = 0;
}
$myConfig->setActShopCurrency($setCur);
Die Nummern der Währungen und die IDs der Länder werden schätzungsweise bei jedem unterschiedlich ausfallen. Hier ist also Anpassungsarbeit angesagt…
Jetzt noch der übliche Disclaimer-Kram:
Keine Garantie für gar nichts, Benutzung auf eigene Gefahr.
Schöner und eleganter geht`s immer - über schicke Verbesserungen freue ich mich natürlich.
Ich wollte was ähnliches in die OXID-Version 4.8.4 einbauen, habe nun aber bemerkt, dass die Funktion “$myConfig->setActShopCurrency($setCur);” keine Auswirkung hat, wenn bereits eine andere Währung statt der Standard-Währung ausgewält ist und in der URL der Currency-Parameter (z.B. ?cur=1) bereits drin steht.
Weiss jemand mit welcher Funktion der Currency-Parameter in der URL gewechselt werden kann?
Mein Fall ist dieser:
Die Startwährung wird mit dem GeoIP-Modul gesetzt.
Die Anzeige der Währungsauswahl im Header ist deaktiviert.
Falls nun jemand bestellt und die angezeigte Währung nicht dem Nutzerland entspricht, soll nach der Adresseingabe auf die für das Nutzerland entsprechende Währung gewechselt werden.
Da setActShopCurrency($setCur) im Oxid 4.8.4 nur funktioniert wenn noch die Standardwährung angezeigt wird, habe ich nun die Anzeige von Bestellschritt 3 (payment.php) durch ein Modul wie folgt erweitert:
<?php
/**
* Modul erweitert payment.php - Basis OXID Version 4.8.4
*
*/
class my_payment_getactcurrency extends my_payment_getactcurrency_parent
{
protected $_sThisTemplate = 'page/checkout/payment.tpl';
public function render()
{
$myConfig = $this->getConfig();
if ($myConfig->getConfigParam( 'blPsBasketReservationEnabled' )) {
$this->getSession()->getBasketReservations()->renewExpiration();
}
parent::render();
// Wenn per GeoIP zugewiesene Waehrung nicht mit BenutzerLand uebereinstimmt, hier nun die Waehrung gem. BenutzerLand wechseln
if ( $this->getConfig()->getConfigParam( 'bl_perfLoadCurrency' ) ) {
$actcur = oxSession::getVar( 'currency' );
$usercur = $this->getusercurrency();
if ($actcur != $usercur){
oxRegistry::getUtils()->redirect( $myConfig->getShopHomeURL() .'cl=payment&cur='.$usercur, true, 302 );
}
}
return $this->_sThisTemplate;
}
// Zuordnung Waehrung zu Land
public function getusercurrency()
{
$setCur = 0;
$oUser = oxRegistry::getSession()->getUser();
$sCountryId = $oUser->getActiveCountry();
$CountryISO = $this->getCountryISO($sCountryId);
switch ($CountryISO)
{
case "CH":
// Switzerland
$setCur = 0;
break;
case "LI":
// Liechtenstein
$setCur = 0;
break;
default:
// EUR as standard for remaining countries
$setCur = 1;
}
return $setCur;
}
// Land nach ISO erkennbar
public function getCountryISO($sCountryId)
{
$sCountryISO = "";
$oDb = oxDb::getDb();
$sSql = "SELECT OXISOALPHA2 FROM oxcountry WHERE OXID = '" . $sCountryId . "' LIMIT 1";
$sCountryISO = $oDb->getOne($sSql);
return $sCountryISO;
}
}
Hätte das ganze aber lieber ohne Redirect umgesetzt. Weiss jemand wie?