Versandregeln nach PLZ

Hallo zusammen,
wir beschäftigen uns mit einem regionalen Shop eines Kunden. Hier benötigen wir eine Versandregel, die nach Postleitzahlen der Lieferadresse referenziert.
Kurzes Bsp.:

Kunde trägt eine Lieferadresse in seinem Konto ein. Füllt den Warenkorb und hat nun die Möglichkeit persönliche Anlieferung auszuwählen, da seine Liferadresse den PLZ bereich YYYYYY hat.
Bei einem andren Kunden mit der PLZ XXXXXX in der Lieferadresse taucht diese Möglichkeit nicht auf. Er kann nur DHL, DPD und Spedition auswählen.
Meine Frage also: Kann ich in der Versandregeleinstellung die Bedingung auch auf PLZ der Lieferadresse stellen, oder hat hierzu jeman einen anderen Ansatz.

Gruß, Holger

Hallo Holger,

sehr interessante Sache. Wie immer gibt es aber mehrere Möglichkeiten das zu realisieren.

-Direkt im Template die Versandart anzeigen könnte funktionieren?
Wäre relativ einfach zu realisren

-Bei der Registrierung direkt einen Kunden mit PLZ xxxxxxx in eine Bestimmte Gruppe
verschieben welcher ausschließlich die Versandart zugewiesen ist.
(Das wohl die saubere Variante dies zu realisieren)

Gruß,
Marcel

Hallo Marcel,
vielen Dank für die schnelle Antwort.
Wenn ich richtig verstehe, ist Punkt 1 aber eine feste Lieferart, bzw. wenn man es hier mit einer IF Abfrage realisiert, habe ich das Problem, das ich im Shop hinterher keine Auswertungen machen kann.

Der zweite Punkt funktioniert manuell? DH. der Kunde meldet sich an und wird dann vom Admin in eine Benutzergruppe geschoben? Ist dies der Fall, muß der Admin ja blitzschnell reagieren, da vielleicht auch ein Kunde nachts bestellen möchte und dann die verschiedenen Lieferarten ja noch zur Verfügung stehen. Oder kann ich das automatisieren? Kunde mit dieser PLZ in der Lieferanschrift wird automatisch dieser Kundengruppe zugeordnet. Das habe ich nämlich noch nicht gefunden.

Gruß, Holger

Hallo Holger,

also manuell ist natürlich schwachsinn.

Wenn du es automatisieren willst musst du die klasse erweitern welche die registrierung des Users vornimmt.

Hab mal kurz geschaut und das wird in oxuser gemacht.

Am besten du schreibst eine erweiterung für diese Klasse inwelcher du die Funktion:
addUserAddress( $oUser ) überlagerst, welche die Adresse eines Benutzers abspeicherst.

Dort die abfrage machen mit einer bestimmten PLz und mit addToGroup ($sGroupID) der speziellen Gruppe hinzufügen.

Wünsch dir viel Spaß :slight_smile:

Gruß,
Marcel

Hallo Marcel,
vielen Dank für die ausführlicheAntwort, ich werde dies mal testen und dann berichten.
Gruß, Holger

Hallo,

habe dieses Thema gerade gefunden, weil ich so eine Lösung brauche. Habe folgendes probiert, aber es tut sich nix:

    public function addUserAddress( $oUser )
    {
        if ( $this->_hasUserAddress( $oUser->getId() ) ) {
            return false;
        }

        $oAddress = oxNew( 'oxaddress' );
        $oAddress->oxaddress__oxuserid        = new oxField($this->getId(), oxField::T_RAW);
        $oAddress->oxaddress__oxaddressuserid = new oxField($oUser->getId(), oxField::T_RAW);
        $oAddress->oxaddress__oxfname         = new oxField($oUser->oxuser__oxfname->value, oxField::T_RAW);
        $oAddress->oxaddress__oxlname         = new oxField($oUser->oxuser__oxlname->value, oxField::T_RAW);
        $oAddress->oxaddress__oxstreet        = new oxField($oUser->oxuser__oxstreet->value, oxField::T_RAW);
        $oAddress->oxaddress__oxstreetnr      = new oxField($oUser->oxuser__oxstreetnr->value, oxField::T_RAW);
        $oAddress->oxaddress__oxcity          = new oxField($oUser->oxuser__oxcity->value, oxField::T_RAW);
        $oAddress->oxaddress__oxzip           = new oxField($oUser->oxuser__oxzip->value, oxField::T_RAW);
        $oAddress->oxaddress__oxcountry       = new oxField($oUser->oxuser__oxcountry->value, oxField::T_RAW);
        $oAddress->oxaddress__oxcountryid     = new oxField($oUser->oxuser__oxcountryid->value, oxField::T_RAW);
        $oAddress->oxaddress__oxcompany       = new oxField($oUser->oxuser__oxcompany->value, oxField::T_RAW);
        
        $plz2 = "84359";
        
        if ($oAddress->oxaddress__oxzip == $plz2 ) {
        	$oAddress->addToGroup("96c58073640668ac0534bdb820c00c72");
        }

Wo liegt mein (Denk-)Fehler?

Danke schonmal.

Viele Grüße,

Robert

Hallo, wir möchten ebenfalls Kunden abhängig von der PLZ unterschiedliche Versandkosten berechnen.
Wir haben nur registrierte Kunde. Das automatische Verschieben in eine Benutzergruppe wäre die einfachste Lösung. Wie machen wir das? Hatte jemand in der Zwischenzeit hierfür eine Lösung?

[B]Wäre auch an einer solchen Lösung interessiert![/B] Am sinnvollsten wäre eine Lösung mittels eines Moduls damit’s “Update sicher” ist… Wäre doch mal eine interessante Aufgabe für die Oxid Modul-Entwickler (Aggrosoft, D3, ect.) :slight_smile:

[QUOTE=rkleinert;54684]

  
        
        $plz2 = "84359";
        
        if ($oAddress->oxaddress__oxzip == $plz2 ) {
        	$oAddress->addToGroup("96c58073640668ac0534bdb820c00c72");
        }

Wo liegt mein (Denk-)Fehler?[/QUOTE]

Hi Robert,

versuchs mal so:

  
        
        $plz2 = "84359";
        
        if ($oAddress->oxaddress__oxzip->value == $plz2 ) {
        	$oAddress->addToGroup("96c58073640668ac0534bdb820c00c72");
        }

Du musst auf die Properties “value” oder “rawValue” von oxaddress__oxzip (oxField) zugreifen.

Hallo zusammen

Wo finde ich den diese Funktion “addUserAddress” im aktuellen Shop mit Azure Theme? In der oxuser hab ich das nicht gesehen. Vielleicht sehe ich ja auch den Wald vor lauter Bäumen nicht mehr… :slight_smile:
Hat jemand einen Tipp?

Besten Dank.
Pasquale

Laut Dokumentation ist die Funktion addUserAddress( $oUser ) deprecated.

jupp - hier auch:

Hallo…

Hoppla! Hab erst jetzt gesehen das dieser Beitrag ja “uralt” ist :slight_smile:
Nun, der Ansatz zur Lösung der Versandregeln nach PLZ finde gut und darum möchte ich mir eine solche Funktion in meinen Shop einbauen (Montageservice). Leider habe ich noch kein solches Modul gesehen resp. gefunden. :frowning:
In/mit welcher Datei wird den der Benutzer registriert resp. in die DB geschrieben??? Dort könnte ich die Klasse ja so erweitern wie hier beschrieben und den Benutzer mit der/den richtigen PLZ in die “Montageservice” Gruppe zuordnen…
Oder hat jemand eine bessere Idee…

Besten Dank.
Pasquale

Hallo Zusammen

Habe mal versucht mein Vorhaben umzusetzen. Ich habe in der Datei application/models/oxuser.php die Klasse CreateUser erweitert aber es funktioniert nicht :confused:… Mein Code:

public function createUser()
{
$oDb = oxDb::getDb();
$sShopID = $this->getConfig()->getShopId();

    // check if user exists AND there is no password - in this case we update otherwise we try to insert
    $sSelect = "select oxid from oxuser where oxusername = " . $oDb->quote( $this->oxuser__oxusername->value ) . " and oxpassword = '' ";
    if ( !$this->_blMallUsers ) {
        $sSelect .= " and oxshopid = '{$sShopID}' ";
    }
    $sOXID = $oDb->getOne( $sSelect, false, false );

    // user without password found - lets use
    if ( isset( $sOXID ) && $sOXID ) {
        // try to update
        $this->delete( $sOXID );
    } elseif ( $this->_blMallUsers ) {
        // must be sure if there is no dublicate user
        $sQ = "select oxid from oxuser where oxusername = " . $oDb->quote( $this->oxuser__oxusername->value ) . " and oxusername != '' ";
        if ( $oDb->getOne( $sQ, false, false ) ) {
            $oEx = oxNew( 'oxUserException' );
            $oLang = oxRegistry::getLang();
            $oEx->setMessage( sprintf( $oLang->translateString( 'EXCEPTION_USER_USEREXISTS', $oLang->getTplLanguage() ), $this->oxuser__oxusername->value ) );
            throw $oEx;
        }
    }

    $this->oxuser__oxshopid = new oxField( $sShopID, oxField::T_RAW );
    if ( ( $blOK = $this->save() ) ) {
        // dropping/cleaning old delivery address/payment info
        $oDb->execute( "delete from oxaddress where oxaddress.oxuserid = " . $oDb->quote( $this->oxuser__oxid->value ) . " " );
        $oDb->execute( "update oxuserpayments set oxuserpayments.oxuserid = " . $oDb->quote( $this->oxuser__oxusername->value ) . " where oxuserpayments.oxuserid = " . $oDb->quote( $this->oxuser__oxid->value ) . " " );
    } else {
        $oEx = oxNew( 'oxUserException' );
        $oEx->setMessage( 'EXCEPTION_USER_USERCREATIONFAILED' );
        throw $oEx;
    }
     /** User mit entsprechender PLZ in Kurierkunden-Gruppe zuordnen */
    $plzKurier="8869";
    /** Kurierkunden GruppenID in DB = "b673a96dfe19ed06cded8ede40ba8241" */
    if ($this->oxuser__oxzip->value == $plzKurier)
    {
        $this->addToGroup("b673a96dfe19ed06cded8ede40ba8241");
    }
    return $blOK;
}

Was mache ich falsch? Oder besser ist das überhaupt der Richtige Ort. Habe mir auch überlegt das ganze in die AddToGroup Klasse zu integrieren aber hier weiss ich nicht genau wie…

Hat jemand einen Tipp?

Danke schon zum Voraus.
Pasquale

Moin Moin

Stundenlanges ausprobieren und tüfteln hat bei mir folgende Lösung zu Tage gefördert:

Den Eintrag muss in die Funktion _setAutoGroups in der oxuser.php. Am ende der Klasse habe folgenden Code eingefügt:

/** User mit entsprechender PLZ in Kurierkunden-Gruppe zuordnen /
$plzKurier= array (" 8873’,‘8777’,‘8872’,‘8865’,‘8767’,‘8765’,‘8750’,‘8773’,‘8775’,‘8774’,‘8783’,‘8766’,‘8756’,‘8753’); /
* ect, ect. */

/** Kurierkunden GruppenID in DB = “b673a96dfe19ed06cded8ede40ba8241” */

$gesucht= $this->oxuser__oxzip->value ;

   foreach ($plzKurier as $einzel) {
        if ($einzel === $gesucht) {
            $this->addToGroup('b673a96dfe19ed06cded8ede40ba8241');
        }
    }

So funktionierts…

Grüsse Pasquale

Nun mal Hallo Zusammen,

ich knabbere gerade am selben Problem.
Nur: Ist da nicht ein riesen Denkfehler drin?
=> Ein und der selbe Kunde kann sich mehrere Lieferadressen anlegen!

Wenn der Kunde sich jetzt an PLZ 12345 liefern lässt, bei der Registrierung aber eine PLZ 54321 angegeben hat und entsprechender Usergruppe zugeordnet wurde, dann fällt das Konzept mit der Usergruppe doch voll auf die Nase!

… oder?