Einzugsbereich als eigenes Land definieren und per PLZ automatisch zuteilen

Wir verkaufen 90% unserer Artikel in unserem Umkreis. Dafür bieten wir auch einen eigenen Lieferservice.

Die restlichen 10% werden deutschlandweit verkauft. Über die Kategorie “Deutschlandweit” kann ich die Artikel, die so verkauft werden, entsprechend filtern. Kauft ein Kunde einen solchen Artikel, bekommt er zusätzlich zu unserem lokalen Lieferservice auch eine deutschlandweite Liefermöglichkeit per Spedition angeboten.

Nun haben natürlich einige überregionale Kunden die Idee gehabt, den lokalen Lieferservice auszuwählen, weil der ja billiger ist. Das möchte ich in Zukunft vermeiden.

Nun habe ich ein zusätzliches “Land” im Shop erstellt, das ich “Lokaler Umkreis” getauft habe.

Es existieren nun also zwei Länder in meinem Shop:

  • Deutschland
  • Lokaler Umkreis

Wählt der Kunde im Bestellprozess das korrekte “Land” aus, werden alle Liefermöglichkeiten korrekt gefiltert und dargestellt. Das läuft soweit also wie es soll. :slight_smile:

Jetzt der Knackpunkt:
Ich habe in einem Modul bereits ein Array mit den PLZ hinterlegt, die als “Lokaler Umkreis” gelten sollen.

Nun hätte ich gerne, dass das Land automatisch anhand der PLZ eingestellt wird. Das Dropdown für die Länderauswahl hätte ich im Template auf “hidden” gesetzt - der Shop weiß besser, in welchem Land der Kunde wohnt. :smiley:

Meiner Meinung nach wäre der korrekte Ansatzpunkt der Controller payment.php, da der Kunde dort ja in jedem Fall vorbei muss.

Wie mache ich das? Wie komme ich in dem Controller an die oxOrder->billcountryid und oxOrder->delcountryid?

Okay, ich habe mich mal fleißig weiter durch die Source Code Documentation gehangelt und folgende arbeitende Lösung gebaut:

  1. Ich erweitere das Model oxuser.php um die Funktion setCountryidAccordingToZip():

     class pfl_aundo_oxuser extends pfl_aundo_oxuser_parent  {
    
     /**
      * Updating countryid according to user's zipcode.
      */
     public function setCountryidAccordingToZip()
     {
         // TODO: Get zips and IDs from config
         $aLocalZips         = array('69469', '69483', '64625');
         $sCountryIdLocal    = '0fc28f0cbd1f06d0dbc7e117fecb6ecd';
         $sCountryIdGermany  = 'a7c40f631fc920687.20179984';
    
         // adjust user's address in oxuser
         if(in_array($this->oxuser__oxzip->Value, $aLocalZips))
         {
             $this->oxuser__oxcountryid->rawValue = $sCountryIdLocal;
         }
         else
         {
             $this->oxuser__oxcountryid->rawValue = $sCountryIdGermany;
         }
         $this->save();
    
    
         // adjust all additional addr. of user in oxaddress
         $aAddresses = $this->getUserAddresses();
         foreach($aAddresses as $oAddress)
         {
             if(in_array($oAddress->oxaddress__oxzip->rawValue, $aLocalZips))
             {
                 $oAddress->oxaddress__oxcountryid->rawValue = $sCountryIdLocal;
             }
             else
             {
                 $oAddress->oxaddress__oxcountryid->rawValue = $sCountryIdGermany;
             }
             $oAddress->save();
         }
     }
    

    }

  2. Ich erweitere den Controller payment.php. Genauer: Seine Funktion init():

     class pfl_aundo_payment extends pfl_aundo_payment_parent
     {
         /**
          * Executes parent method parent::init().
          * Changes the user's countryid based on user's zipcode to enable local delivery.
          */
         public function init()
         {
             parent::init();
    
             // adjust country id according to zip
             if($oUser = $this->getUser())
             {
                 $oUser->setCountryidAccordingToZip();
             }
         }
     }
    

Das funktioniert prima mit den Adressen in oxaddress. Aber das Land des oxuser ändert sich leider nicht, trotz des Aufrufes $this->save(); im Model.

Was verstehe ich hier falsch?

// Copy&Paste-Fehler in Code behoben. Problem bleibt.
/// value zu rawValue geändert, s.u. --> solved.

Okay, hätte ich auch gleich drauf kommen können:

Aus

$this->oxuser__oxcountryid->value

muss

$this->oxuser__oxcountryid->rawValue

werden, dann funktioniert alles.

Ich bin mal so ehrlich, dass ich nicht ganz verstehe, wo genau der Unterschied ist. 8| Aber hey, funktioniert. Falls jemand aufklärende Worte dazu hat: Immer her damit. :slight_smile:

–> solved.