Lösung für: Startwährung nach Nutzerland

Hallo zusammen,

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.

Ansonsten - viel Spaß! :cool:

Grüße
floko

Das Ganze kann man etwas besser lesbar (und pflegbar) machen mit dieser kleinen Helfer-Funktion:


    public function getCountryISO($sCountryId)
    {
      $sCountryISO = "";
      
      $oDb = oxDb::getDb();
      
			$sSql = "SELECT OXISOALPHA2 FROM oxcountry 
      WHERE OXID   = '" . $sCountryId . "' 
      LIMIT 1
      ";
			$sCountryISO = $oDb->getOne($sSql);            
      
      return $sCountryISO;
    }    

Die Auswahl der Währung wird dann abweichend von oben so vorgenommen:


            switch ($this->getCountryISO($this->oxuser__oxcountryid->value)) 
            {
                case "PL":
                    // Poland
                    $setCur = 1;
                    break;
                case "CH":
                    // Switzerland
                    $setCur = 4;
                    break;      
               case "SE":
                    // Sweden
                    $setCur = 2;
                    break;         
               case "DK":
                    // Denmark
                    $setCur = 5;
                    break;      
               case "GB":
                    // UK
                    $setCur = 3;
                    break;                                                               
                default:
                   // EUR as standard for remaining countries
                   $setCur = 0;
            }                      
            $myConfig->setActShopCurrency($setCur);   

So muss man nicht die IDs der Länder in der Datenbanktabelle nachsehen, sondern kann direkt mit den geläufigen ISO-Abkürzungen arbeiten…

Hallo zusammen

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?

Gruss claudia