Mitgliedercheck bei Kundenregistration

Hallo liebes Forum,

ich bin erst vor kurzem auf dieses tolle Shopsystem gestoßen. Bin aber schon sehr begeistert. :slight_smile:
Ich bin für die Webseite des Verband Sonderpädagogik e.v. verantwortlich und nutze dort schon Contenido als CMS. Kenne mich recht gut mit PHP und Datenbanken aus. Grafik und Design überasse ich lieber anderen :))

Ich habe da auch direkt eine Frage, ob und wie ich die Kundenregistration bei Shopware anpassen kann:

Ich würde sehr gerne wenn ein Kunde eine Privatperson ist, die eventuell vorhandene Mitgliedsnummer abfragen und gegen eine Datenbank/CSV Datei checken ob der Kunde wirklich Mitglied ist und dem Kunden dann die Kundengruppe “Mitglied” mit den vergünstigten Preisen zuordnen.

Ist das prinzipiell Möglich ?

Könnt ihr mir die grobe Richtung aufzeichnen, dann kann ich mich da reinwühlen

 

Danke und lieben Gruß aus Alsdorf

Georg

> Könnt ihr mir die grobe Richtung aufzeichnen, dann kann ich mich da reinwühlen

Klar. Wenn man den Service RegisterService dekoriert, kann man in dem eigene Service alle Prüfungen machen, die du möchtest und den Kunden anschließend in eine bestimmte Kundengruppe verschieben.

Hi Waldicom,

danke für den Hinweis, dann werde ich mich mal in die Richtung schlau machen. Das ist dann aber wahrscheinlich nicht so einfach updatefest oder ?

Wäre es sinnvoller sich in die Pluginprogrammierung einzuarbeiten ?

G

Klar. Sehr guter Einstieg ist hier: Developing plugins

Ach, hätte ich bei objektorientierter Programmierung nur besser aufgepasst :slight_smile:

Ich hätte jetzt einfach von der Klasse RegisterService geerbt und die entsprechenden Methoden überschrieben. Wusste nicht das das Dekorieren heißt

Aber ok, der Weg zeichnet sich ab:

  • Versthen wie der RegisterService (“engine/Shopware/Bundel/AccountBundle/Servide/RegisterService.php”) funktioniert

  • Plugin in der 5.2 Methode 

  • Dekorieren  des RegisterService 

Gut das Wochenende ist :slight_smile:

 

@CTSchorsch schrieb:

Ach, hätte ich bei objektorientierter Programmierung nur besser aufgepasst :)

Ich hätte jetzt einfach von der Klasse RegisterService geerbt und die entsprechenden Methoden überschrieben. Wusste nicht das das Dekorieren heißt

 

In object-oriented programming, the  decorator pattern  (also known as Wrapper, an alternative naming shared with the Adapter pattern) is a design pattern that allows behavior to be added to an individual object, either statically or dynamically, without affecting the behavior of other objects from the same class.[1] The decorator pattern is often useful for adhering to the Single Responsibility Principle, as it allows functionality to be divided between classes with unique areas of concern.[2]  (https://en.wikipedia.org/wiki/Decorator\_pattern)

Ja, danke langnickel, ich sag ja, hätte ich da mal besser zugehört :slight_smile:

Zurück zu meinem Problem:

Würde es nicht reichen den Validator anzupassen ? Da werden ja eh schon Felder geprüft. Oder bekomme ich das zusätzliche Feld nur über den RegisterService rein ?

Georg

Hallo zusammen,

ich bin jetzt schon so weit, das ich die Mitgliedsnummer als zusätzliches Kundenattribut bei der Registrierung Abfrage und in die Datenbank eintragen kann. Auch im Backend kann dieses Feld bearbeitet werden. Ich habe eine Plugin 5.2 Struktur gewählt.

meine Bootstrap sieht so aus:

container->get('shopware_attribute.crud_service');
            $service->update('s_user_attributes', 'ctech_clubnumber', 'string', [
                    'label' => 'Mitgliedsnummer',
                    'displayInBackend' => true
                ]);

  Shopware()->Models()->generateAttributeModels(
             array('s_user_attributes')   );
    }

    public static function getSubscribedEvents()
    {
            return ['Enlight_Controller_Action_PostDispatchSecure_Frontend' => 
                      'onFrontendPostDispatch',
            ];
    }

    public function onFrontendPostDispatch(\Enlight_Controller_ActionEventArgs $args)
    {
            $args->getSubject()->View()->addTemplateDir($this->getPath() . '/Resources/Views');
        }
}
?>

unter Resources/Views habe ich die entsprechend tpls abgelegt. Soweit so gut :slight_smile:

Jetzt stehe ich aber auf dem Schlauch, wo ich meine RegisterService.php ablegen soll ? Im Hauptverzeichnis des Plugins ? Oder muß ich die Bundle/AccountBundle Struktur übernehmen ?

Ich würde auch gerne erst mal einfach die Originalfunktionalität übernehmen. Ginge das mit folgender Klasse ?

service = $ service;
    }

}
?>

und folgender Resources/service.xml:
 

 

Lieben Gruß

Georg

Hallo zusammen,

ich bin ein kleines Stückchen weiter :slight_smile:

Mein Plugin läuft soweit, dass ich den RegisterServie abgreifen kann und meine eigene register Methode aufgerufen wird:

public function register (Shop $shop, Customer $customer, Address $billing, Address $shipping = null)
        {
                $customerAttris = $customer->getAttribute() ;
                $clubnumber=$customerAttris->getCtechClubnumber(1);
           
                // TODO: Mitgliedsnummer gegen csv checken

                if ($istMitglied) {
                    //TODO Plugin config für GroupID
                    $group = Shopware()->Models()->find('Shopware\Models\Customer\Group', 3);
                    $customer->setGroup($group);
                    $this->service->register($shop, $customer, $billing, $shipping);
                } else {
                   //TODO Zeige Fehler das Mitgliedsnummer unbekannt
                }
}

Wie kann ich im Fehlerfall, also der Kunde ist kein Mitglied, den Fehler an das Formular geben ? Ich hab versucht mich durch die Validatoren zu kämpfen, aber wüßte jetzt auch nicht,wie ich die Prüfung da untergebracht bekäme

Georg

 

Hallo Georg,

ich glaube an der Stelle gar nicht. Die Fehlerbehandlung findet im Register Controller schon vorher statt. Und zwar in Zeile 116:

        $errors = [
            'personal' => $this->getFormErrors($customerForm),
            'billing' => $this->getFormErrors($billingForm),
            'shipping' => []
        ];

Ich hoffe das hilft dir etwas weiter.

Hi,

ja, aber an welcher Stelle werden die Fehler im $customerForm gesetzt ? Wie ist die Verbindung zwischen Service und Controller ?

Im Service wird ja der Validator aufgerufen und der setzt ja auch einen Fehler wenn die Emailadresse schon bekannt ist. Aber ich seh nicht wo :slight_smile:

Georg

Sorry. So tief bin ich da auch nicht drin.