Ergebnis 1 bis 19 von 19

Thema: Registrierungs-Modul mit eigenen Bedingungen

  1. #1
    Contao-Nutzer
    Registriert seit
    16.09.2012.
    Beiträge
    59

    Frage Registrierungs-Modul mit eigenen Bedingungen

    Hallo zusammen,

    ich setze gerade eine Website für einen Verein auf. Hier möchten wir bestimmte Inhalte nur für registrierte Nutzer zeigen.
    Die Nutzer teilen sich in 2 Contao Mitglieder-Gruppen auf: Standard und Premium

    Jetzt würde ich das gerne in _einem_ Registrierungs-Formular abdecken.
    Die normalen User = Gruppe Standard füllt aus: Vorname, Name, usw. und lander in der Standardgruppe
    Gruppe Premium füllt aus: Vorname, Name, usw. + Mitgliedsnummer = Wenn "Name" und "Mitgliedsnummer" übereinstimmen, dann landet dieser User in der Premium Gruppe.

    Habt ihr einen Hinweis für mich, an welcher Stelle ich hier am sinnvollsten ansetzen kann?

    Man könnte es ja in 2 Registrierungsformularen unterteilen und diese entsprechenden Mitgliedergruppen zuweisen. Das würde aber noch nicht meine Prüfung der Felder für die Premium Gruppe lösen.

  2. #2
    Contao-Urgestein Avatar von zonky
    Registriert seit
    19.03.2010.
    Ort
    Berlin, Rdf
    Beiträge
    9.719
    User beschenken
    Wunschliste

    Standard

    Du könntest vllt. den Hook nehmen https://docs.contao.org/dev/referenc...createNewUser/

    Im Modul als Gruppe "Standard" einstellen und in dem Hook Deine Bedingung prüfen und den Member in die Premiumgruppe umschaufeln...

    ... so als Idee

  3. #3
    Contao-Nutzer
    Registriert seit
    16.09.2012.
    Beiträge
    59

    Standard

    okay bin hier noch etwas unsicher unterwegs. Ich bin in Contao 4.13.

    hier habe ich die Datei: CreateNewUserListener.php
    im Verzeichnis: /src/EventListener erstellt.
    Registriert wird die Datei automatisch, soweit ich die Doku (https://docs.contao.org/dev/framework/hooks/) verstehe.

    PHP-Code:
    <?php
    // src/EventListener/CreateNewUserListener.php
    namespace App\EventListener;

    use 
    Contao\CoreBundle\ServiceAnnotation\Hook;
    use 
    Contao\Module;

    /**
     * @Hook("createNewUser") 
     */
    class CreateNewUserListener
    {
        public function 
    __invoke(int $userId, array $userDataModule $module): void
        
    {

                if (
    $userData['mitgliedsnummer'] == '1234') {
                
    $objUser = \FrontendUser::getInstance();
                
    $objUser->groups = array(3); 
                
    $objUser->save();
                }

        }
    }
    Bin ich hier auf dem richtigen Weg?

  4. #4
    Community-Moderator
    Wandelndes Contao-Lexikon
    Avatar von Spooky
    Registriert seit
    12.04.2012.
    Ort
    Scotland
    Beiträge
    34.112
    Partner-ID
    10107

    Standard

    Zitat Zitat von 1gluecksgriff Beitrag anzeigen
    Bin ich hier auf dem richtigen Weg?
    Mit der Registrierung des Hooks ja. Aber dein Code wird so nicht funktionieren. Du holst dir den Frontend User - aber zu diesem Zeitpunkt ist der User ja noch gar nicht eingelogged (er registriert sich ja bloß). Du musst dir das MemberModel für diesen User holen, also
    PHP-Code:
    $user MemberModel::findById($userId);
    $user->;
    $user->save(); 
    » sponsor me via GitHub or PayPal or Revolut

  5. #5
    Contao-Urgestein Avatar von zonky
    Registriert seit
    19.03.2010.
    Ort
    Berlin, Rdf
    Beiträge
    9.719
    User beschenken
    Wunschliste

    Standard

    das sieht doch ganz gut aus... ich würde gleich zum Start der Methode mal dumpen, was da so ankommt... mit

    PHP-Code:
    dd($userId$userData$module); 
    dd ist dump&die

    Debugmodus anmachen und registrieren

  6. #6
    Contao-Nutzer
    Registriert seit
    16.09.2012.
    Beiträge
    59

    Standard

    Zitat Zitat von zonky Beitrag anzeigen
    das sieht doch ganz gut aus... ich würde gleich zum Start der Methode mal dumpen, was da so ankommt... mit

    PHP-Code:
    dd($userId$userData$module); 
    dd ist dump&die

    Debugmodus anmachen und registrieren
    oh gott, ich glaub das braucht noch ein paar Schritte zum verstehen der ganzen Geschichte.
    Den Dump müsste ich dann im Profiler sehen oder?

    und müsste hier meinedomain.com/_profiler/b5fda0?panel=events nicht mein gerade erstellter CreateNewUserListener.php auftauchen?

    ich kann gerade garnicht verifizieren ob der Hook überhaupt aktiv ist.
    Geändert von 1gluecksgriff (23.05.2023 um 10:44 Uhr)

  7. #7
    Contao-Urgestein Avatar von zonky
    Registriert seit
    19.03.2010.
    Ort
    Berlin, Rdf
    Beiträge
    9.719
    User beschenken
    Wunschliste

    Standard

    eigentlich dürftest Du von Deiner Seite nicht mehr viel sehen durch das "die" und dur den "dump"

    wenn da nix passiert, wird ggf. dein Event nicht geladen - mach mal ein "composer install"

  8. #8
    Contao-Nutzer
    Registriert seit
    16.09.2012.
    Beiträge
    59

    Standard

    Zitat Zitat von zonky Beitrag anzeigen
    eigentlich dürftest Du von Deiner Seite nicht mehr viel sehen durch das "die" und dur den "dump"

    wenn da nix passiert, wird ggf. dein Event nicht geladen - mach mal ein "composer install"
    jetza hab ich dem dump gesehen!
    okay also nachdem der Hook angelegt wurde Composer install durchlaufen lassen -> Check!

  9. #9
    Contao-Urgestein Avatar von zonky
    Registriert seit
    19.03.2010.
    Ort
    Berlin, Rdf
    Beiträge
    9.719
    User beschenken
    Wunschliste

    Standard

    prima - dann siehst Du ja, auf was Du zugreifen kannst und kannst damit Deine Logik in dem Event bzw. in der Methode aufbauen... also sowas wie

    PHP-Code:
    if (meine BedingungMitgliedernummer und Name da und beide gleich) {
        
    entferne Standardgruppe;
        
    füge Premiumgruppe hinzu;
        
    speichere;


  10. #10
    Contao-Nutzer
    Registriert seit
    16.09.2012.
    Beiträge
    59

    Standard

    Zitat Zitat von zonky Beitrag anzeigen
    prima - dann siehst Du ja, auf was Du zugreifen kannst und kannst damit Deine Logik in dem Event bzw. in der Methode aufbauen... also sowas wie

    PHP-Code:
    if (meine BedingungMitgliedernummer und Name da und beide gleich) {
        
    entferne Standardgruppe;
        
    füge Premiumgruppe hinzu;
        
    speichere;

    also Bedingung klappt nun. Nun ist nur die Frage nach dem Membergroup wechsel.
    per SQL Befehl oder per Contao. Den Hinweis von Spooky kann hier nicht genau einschätzen.

  11. #11
    Contao-Urgestein Avatar von zonky
    Registriert seit
    19.03.2010.
    Ort
    Berlin, Rdf
    Beiträge
    9.719
    User beschenken
    Wunschliste

    Standard

    Zitat Zitat von 1gluecksgriff Beitrag anzeigen
    per SQL Befehl oder per Contao
    m.E. egal solange man nicht hardcodet SQL anflanscht... guck was dir leichter von der Hand geht

    mit dem was Spooky schrieb, sollte das doch leicht per "Contao" gehen

  12. #12
    Contao-Nutzer
    Registriert seit
    16.09.2012.
    Beiträge
    59

    Standard

    okay prima ich denke so funktioniert es, hier der volständige Code, falls das mal jemand anders braucht

    PHP-Code:
    <?php
    // src/EventListener/CreateNewUserListener.php
    namespace App\EventListener;

    use 
    Contao\CoreBundle\ServiceAnnotation\Hook;
    use 
    Contao\Module;

    /**
     * @Hook("createNewUser") 
     */
    class CreateNewUserListener
    {
        public function 
    __invoke(int $userId, array $userDataModule $module): void
        
    {

            if (
    $userData['mitgliedsnummer'] == 'test') { //Wenn Mitglidesnummer _test_ ist
               
    $user = \MemberModel::findById($userId); //User laden
               
    $user->groups '3'//Vereins Mitglieder Gruppe
               
    $user->save(); //Speichern
            
    }


        }
    }
    jetzt muss ich noch den test Parameter auflösen

  13. #13
    Contao-Urgestein Avatar von zonky
    Registriert seit
    19.03.2010.
    Ort
    Berlin, Rdf
    Beiträge
    9.719
    User beschenken
    Wunschliste

    Standard

    Vergleiche möglichst typsicher machen

    PHP-Code:
    if ('test' === $userData['mitgliedsnummer']) 
    also "drei Zeichen"

  14. #14
    Community-Moderator
    Wandelndes Contao-Lexikon
    Avatar von Spooky
    Registriert seit
    12.04.2012.
    Ort
    Scotland
    Beiträge
    34.112
    Partner-ID
    10107

    Standard

    Zitat Zitat von 1gluecksgriff Beitrag anzeigen
    PHP-Code:
    $user->groups '3'
    groups ist ein serialisiertes Array aus Group IDs. Also zB
    PHP-Code:
    $user->groups serialize([3]); 
    » sponsor me via GitHub or PayPal or Revolut

  15. #15
    Contao-Nutzer
    Registriert seit
    16.09.2012.
    Beiträge
    59

    Standard

    Hallo nochmal zu diesem Thema.

    das mit dem EventListener CreateNewUserListener.php funktioniert nun wunderbar.
    Ich habe hier eine JSON Abfrage (REST-Webservice) dazwischen geschalten die mir 3 Felder meines Formulars abfrägt und wenn diese übereinstimmen, wird mein Member in die richtige Gruppe geschoben. soweit so gut.

    Wenn nun die 3 Parameter aber nicht passen, dann wird ja trotzdem ein User erstellt und der weiß garnicht, das er in der falschen Gruppe gelandet ist.

    Jetzt ist meine Überlegung mit dem EventListener ValidateFormFieldListener.php die 3 Felder bereits in der Eingabe zu prüfen und hier gleich eine Meldung an den User zu geben, damit er nochmal seine Daten checken soll, bevor er weiterkommt. Oder eben diese 3 Felder auszulassen, dann wird er ein Standard Member innerhalb von Contao.

    Dann durchläuft der User allerdings immer 2 mal die JSON Abfrage. Das erscheint mir nicht so effizient. Gibt es einen Hook / Eventlistener in dem ich beides machen kann?

    Oder ich erstelle vom ValidateFormFieldListener einen Parameter "bereitsvalidiert", der dann vom CreateNewUserListener ausgelesen und nur die Gruppen Zuordnung macht.

    vielen dank fürs mithirnen.

  16. #16
    Contao-Nutzer
    Registriert seit
    16.09.2012.
    Beiträge
    59

    Standard

    Ein bisschen weiter geforscht und ausprobiert.
    Der ValidateFormFieldListener.php ist nur für normale Contao Formulare und bringt mir das Registrierungs Modul anscheinend nichts.
    Liege ich da richtig?

    Dann habe ich jetzt probiert:
    PHP-Code:
    // src/EventListener/ExtendRegistrationModuleListener.php

    namespace App\EventListener;

    use 
    Contao\CoreBundle\ServiceAnnotation\Callback;
    use 
    Contao\ModuleRegistration;
    use 
    Symfony\Component\HttpFoundation\RequestStack;

    /**
     * @Callback(table="tl_module", target="config.onload")
     */
    class ExtendRegistrationModuleListener
    {
        private 
    $requestStack;

        public function 
    __construct(RequestStack $requestStack)
        {
            
    $this->requestStack $requestStack;
        }

        public function 
    __invoke(ModuleRegistration $module): void
        
    {
            if (
    $module->type === 'registration') {
                
    $GLOBALS['TL_HOOKS']['validateFormField'][] = array('App\EventListener\ValidateLastNameListener''validate');
            }
        }

    zusammen mit dieser Datei:
    PHP-Code:
    // src/EventListener/ValidateLastNameListener.php

    namespace App\EventListener;

    use 
    Contao\CoreBundle\ServiceAnnotation\Callback;
    use 
    Contao\Form;
    use 
    Symfony\Component\HttpFoundation\RequestStack;
    use 
    Symfony\Component\Validator\Constraint;
    use 
    Symfony\Component\Validator\ConstraintValidator;

    /**
     * @Callback(table="tl_form_field", target="fields.options.validate.lastname")
     */
    class ValidateLastNameListener extends ConstraintValidator
    {
        private 
    $requestStack;

        public function 
    __construct(RequestStack $requestStack)
        {
            
    $this->requestStack $requestStack;
        }

        public function 
    validate($valueConstraint $constraint): void
        
    {
            
    $form $this->requestStack->getCurrentRequest()->get('form_id');

            if (
    $form === 'registration' && $value !== '1000') {
                
    $this->context->buildViolation($constraint->message)
                    ->
    setParameter('{{ value }}'$value)
                    ->
    addViolation();
            }
        }

    Allerdings greift die Datei "ExtendRegistrationModuleListener.php" garnicht.

    Also irgendwo habe ich da noch ein Verständnis Problem mit der Modul Erweiterung.

  17. #17
    Contao-Nutzer
    Registriert seit
    16.09.2012.
    Beiträge
    59

    Standard

    okay nochmal ein paar Stunden später ...

    Der CreateNewUser Hook kommt für meinen Zweck zu spät. Der user ist ja bereits generiert egal was ich in dem Hook noch angebe oder ändern lasse. Könnte den User höchstens wieder löschen, wenn meine Prüf-Parameter nicht passen. Das kommt mir aber nicht sinnvoll vor.

    Der validateFormField Hook ist nur für Contao Formulare gedacht, aber nicht für das Registierungsformular - stimmt das?
    Meine Tests haben das zumindest nahe gelegt.

    PHP-Code:
    <?php

    namespace App\EventListener;

    use 
    Contao\CoreBundle\ServiceAnnotation\Hook;
    use 
    Contao\MemberModel;
    use 
    Contao\ModuleRegistration;
    use 
    Contao\Widget;

    class 
    RegistrationHookListener
    {
        
    /**
         * @Hook("validateFormField")
         */
        
    public function onValidateFormField(Widget $widgetstring $formId, array $formDataModuleRegistration $form): Widget
        
    {
            exit(
    'test');
     ...
        }
    }
    ?>

  18. #18
    Contao-Nutzer
    Registriert seit
    16.09.2012.
    Beiträge
    59

    Standard

    2ter Ansatz:
    User Registriert sich. Aktiviert seinen Account mit dem E-Mail link. Nun ist er Standarduser.
    und kommt dann auf die Seite mit seinen persönlichen Daten. Hier gibt er nun die zu prüfenden Felder ein.
    Jetzt kann man mit updatePersonalData Hook arbeiten. Die Prüfung machen und den User in die Gruppe 3 heben. Hier scheint es aber auch das Problem mit der Validierung im Formular zu geben. ... :-(

    3ter Ansatz:
    User Registriert sich. Aktiviert seinen Account mit dem E-Mail link. Nun ist er Standarduser.
    mit der Aktivierung kommt er auf eine Seite mit einem Standard Contao Formular "Premium Freischalten".
    Jetzt kann ich mit der validateFormField Hook arbeiten und den User in die Gruppe 3 heben. Das sollte doch klappen oder?

    Am einfachsten und Userfreundlichsten wäre natürlich schon die Validierung und sofortige Rückmeldung im Registrierungs-Formular.
    Das muss doch irgendwie serverseitig möglich sein?

    Letzer Versuch für heute damit:
    PHP-Code:
    <?php

    namespace App\EventListener;

    use 
    Contao\CoreBundle\ServiceAnnotation\Hook;
    use 
    Contao\ModuleRegistration;

    class 
    RegistrationFormDataProcessor
    {
        
    /**
         * @Hook("processFormData")
         */
        
    public function onProcessFormData(array $submittedData, array $formData, ?array $files, array $labelsModuleRegistration $module): void
        
    {
            exit(
    'test');
            if (
    $module instanceof ModuleRegistration && isset($submittedData['lastname']) && $submittedData['lastname'] !== 'Müller') {
                
    $module->Template->message 'Sie heißen nicht Müller, deshalb können Sie unseren Service nicht benutzen.';
                
    $module->Template->class 'error';
                
    $module->Template->addError true;
                
    $module->Template->hasError true;
                throw new \
    RuntimeException('Invalid lastname');
            }
        }
    }

    ?>
    use Contao\ModuleRegistration;
    Greift irgendwie garnicht :-(

  19. #19
    Contao-Urgestein Avatar von zonky
    Registriert seit
    19.03.2010.
    Ort
    Berlin, Rdf
    Beiträge
    9.719
    User beschenken
    Wunschliste

    Standard

    bei den Hooks https://docs.contao.org/dev/reference/hooks/ steht üblicher Weise immer dabei, wann diese aufgerufen werden - das Registrierungsmodul ist für Contao nicht zwangsweise ein Formular(-Modul) auch wenn es technisch gesehen natürlich ein Formular ist.

Aktive Benutzer

Aktive Benutzer

Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)

Lesezeichen

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •