Manuelle Benutzerregistrierung mit Dateneinspeisung in Joomla Tabellen

  • Guten Tag zusammen.


    Ich benötigen eine ziemlich individuelle Benutzerregistrierung im Frontend. Sowohl Mitglieder als auch Unternehmen sollen sich mit zwei unterschiedlichen Masken registrieren können.


    Nun habe ich überlegt, wie ich das umsetzen möchte. Die Lösung über Fields sagt mir nicht so richtig zu, da Sie meine Anforderungen auch nicht komplett erfüllt. Letztlich überlege ich nun, mir mittels PHP eine eigene individuelle Lösung zu bauen.


    Mein Gedankengang ging in die Richtung, dass ich jeweils eine eigene Tabelle für natürliche sowie für juristische Personen anlege, mir eigene Formularmasken baue und die Daten in meinen eigenen Tabellen speichere. Soweit erstmal nichts schwieriges und besonderes. ABER: Was ganz sinnvoll wäre, wenn z. B. eine Person, die sich als natürliche Person registriert, dass einerseits die Daten in meiner eigenen Tabelle gespeichert werden, andererseits aber auch in der Joomla eigenen "users" Tabelle mit diesen Daten ein neuer User manuell angelegt wird. Soweit halte ich das erstmal auch nicht für wahnsinnig wirklich schwierig, aber einige Spalten sind für mich nicht ganz klar.


    Meine Fragen sind nun wie folgt:


    1. Wenn ich Joomla-Nutzer manuell über die Tabelle anlege, reicht dann wirklich das einfügen von Daten in die User Tabelle aus, oder sind noch weitere Tabellen für die User betroffen? Wahrscheinlich ist auch die Tabelle "usergroups" wegen der Userrechte betroffen, oder? Gibt es noch weitere Tabellen zu füttern, um manuell User anzulegen?
    2. Wenn ich mir die Spalten in Tabelle User anschaue: name, username, email und registerdate sind für mich klar. Aber zu den anderen Spalten habe ich Fragen:
      1. password: Welche Verschlüsselung ist verwendet? MD5?
      2. Was besagt die Spalte "block" und Welche Werte sind hier möglich?
      3. sendemail ist mir eigentlich auch klar, aber Welche Werte sind hier möglich? Sendemail ja= 1 und nein = 0?
      4. lastvisitdate wird ja später wahrscheinlich automatisch upgedated, oder?
      5. activation: Welche Werte sind hier möglich?
      6. params: Das stellt für mich derzeit das größte Fragezeichen. Was ist hier möglich/erforderlich?
      7. lastresettime: Muss ich hier was eingeben?
      8. resetcount: Ist das die Anzahl der passwort resets? Wird das automatisch aktualisiert?
      9. optkey: Was verbirgt sich hier hinter und was für Werte sind möglich?
      10. otep: Was verbirgt sich hier hinter und was für Werte sind möglich?
      11. Requirereset: Was verbirgt sich hier hinter und was für Werte sind möglich?
    3. Wenn ich mir die Spalten in Tabelle usergroup anschaue, stellen sich mir folgende Fragen:
      1. Wie muss parent_id, lft und rgt mit Daten bestückt werden? Welche Werte sind hier möglich?
    4. Sind noch weitere Tabellen für das anlegen eines Users betroffen? Wenn ja, welche?

    Ich hoffe, mir kann und will jemand mit meinen Fragen helfen...

    Im Voraus schon mal besten Dank!


    Beste Grüße


    Sven

  • Hi,


    Zitat

    Ich benötigen eine ziemlich individuelle Benutzerregistrierung im Frontend. Sowohl Mitglieder als auch Unternehmen sollen sich mit zwei unterschiedlichen Masken registrieren können.

    Hast du dich schon mit overrides und alternativen layouts sowie user plugins beschäftigt? Ich persönlich halte das für den einfacheren und sicheren Weg deine Anforderungen umzusetzen, dadurch brauchst du keine eigene App bauen und erst recht nicht doppelt die Daten zu halten etc.


    Als zweite Alternative gibt es auch die Möglichkeit ein Joomla Auth Plugin zu bauen (Beispiele) dadurch würde man sich auch die doppelte Datenhaltung sparen.


    Wenn du aber wirklich den Weg mit einer externen Anwendung gehen möchtest würde ich dir dringend davon abraten selber via SQL Einträge in core Tabellen zu machen.


    Ich würde empfehlen in dem eigenen Programm die Joomla Klasse: \Joomla\CMS\User\User zu laden und dort die save Methode zu benutzen. Dadurch werden u.a. auch die nötigen plugin trigger etc ausgelöst, Passwörter richtig gehashed, Benutzergruppen und parameter hinterlegt etc.


    Eine weitere Klasse ist diese hier: https://github.com/joomla/joom…s/models/registration.php da kannst du dir ansehen wie im Core die Sachen gemacht werden.



    Zu deinen Fragen

    Zitat

    password: Welche Verschlüsselung ist verwendet? MD5?

    Bitte nicht MD5 das hat nichts mehr mit Verschlüsselung zutun ;D In der save method händelt das Joomla selbstständig. Siehe \Joomla\CMS\User\UserHelper

    Zitat

    Was besagt die Spalte "block" und Welche Werte sind hier möglich?

    Ist der Benutzer geblockt Ja (1) / Nein (0)

    Zitat

    sendemail ist mir eigentlich auch klar, aber Welche Werte sind hier möglich? Sendemail ja= 1 und nein = 0?

    Richtig. Die option besagt ob systemmails aktiviert sind oder nicht. d.h. i.d.R. steht dies auf Nein (0)

    Zitat

    lastvisitdate wird ja später wahrscheinlich automatisch upgedated, oder?

    ja.

    Zitat

    activation: Welche Werte sind hier möglic

    Das Aktivierungstoken. Da der Joomla Registrierungsprozess aber übersprungen wird kann dieses Feld leer gelassen werden.

    Zitat

    params: Das stellt für mich derzeit das größte Fragezeichen. Was ist hier möglich/erforderlich?

    Die Parameter des Benutzers JSON encoded.

    Zitat

    lastresettime: Muss ich hier was eingeben?

    Nacht Joomla :)

    Zitat

    resetcount: Ist das die Anzahl der passwort resets? Wird das automatisch aktualisiert?

    Ja

    Zitat

    optkey: Was verbirgt sich hier hinter und was für Werte sind möglich?
    otep: Was verbirgt sich hier hinter und was für Werte sind möglich?

    Hier liegt die 2FA Konfiguration des Benutzers.

    Zitat

    Requirereset: Was verbirgt sich hier hinter und was für Werte sind möglich?

    Man kann einen Joomla Benutzer dazu zwingen sein PW zu ändern, wenn dieser Wer auf 1 gesetzt wird erzwingt Joomla einen PW reset :)

    Zitat

    Wie muss parent_id, lft und rgt mit Daten bestückt werden? Welche Werte sind hier möglich?

    Wie gesagt ich würde hier dringend davon abraten und dafür plädieren hier die Joomla API (addUserToGroup) dazu zu benutzen.

  • Also erst einmal danke für die ausführliche Antwort zero24 .


    Ich glaube, es macht an dieser Stelle einmal sinn, genauer zu beschreiben, was ich benötige, denn ich wüsste derzeit nicht, wie ich meine Anforderung mit overrides, alternativen Layouts oder Plugins lösen könnte. Da ich in Joomla aber immer noch weit davon entfernt bin, mich als Spezialisten zu bezeichnen und ich viele Dinge immer noch nicht weiß, lasse ich mich zur Lösung meiner Anforderung gerne eines besseren belehren.


    Also ich brauche zunächst einmal eine eine Frontend-Registrierung sowohl für Privatkunden als auch für Geschäftskunden (daher natürliche und juristische Personen).


    Die Formularmasken für diese beiden Kundentypen müssen unterschiedlich sein.


    So muss in der Privatkundenmaske zum Beispiel Vorname und Nachname getrennt abgefragt werden (Nicht wie in der normalen User-Registrierung einfach nur mit Namen). Außerdem müssen jede Menge weitere Daten zum Privatkunden abgefragt werden, die in der Standardregistrierung logischerweise nicht hinterlegt sind.

    In der Geschäftskundenmaske hingegen muss bei Registrierung zum Beispiel der Firmenname abgefragt werden. Auch Bankdaten etc. sind hier erforderlich.


    Ich habe versucht, das ganze mittels Fields zu lösen, indem ich zur Standard-User-Registrierung einfach weitere Formularfelder hinzugefügt habe. Problem daran war insbesondere der Name, der für Privatkunden zwingend in Vor- und Nachname getrennt sein muss.

    Ebenfalls habe ich das ganze bereits mittels einem Plugin (visforms) zu lösen. Das Problem hier war aber, dass das visforms logischerweise keinerlei Einfluss auf die tatsächlichen User nimmt. Es ist ein reines Formular-Plugin, jedoch kein User Management Plugin.

    Andere für meine Anforderung brauchbare Plugins habe ich - zumindest kostenfrei - nicht gefunden. Daher die Idee, selbst etwas zu bauen.


    Wie ich das ganze mit Overrides lösen könnte, weiß ich ehrlich gesagt nicht, lasse mich aber gerne belehren.


    Ein eigenes Joomla Auth Plugin scheidet glaube ich aus. Ich habe zwar PHP Kenntnisse, bin aber sicherlich weit davon entfernt, das derart professionell zu bauen. Ich bin Hobbyist, nicht professioneller Entwickler... ;)


    Übrigens, ich wollte eigentlich gar nicht richtig extern gehen, sondern für mein Vorhaben durchaus in Joomla bleiben. Mit dem Plugin DirectPHP kann man nahezu alles innerhalb Joomla umsetzen.

  • denn ich wüsste derzeit nicht, wie ich meine Anforderung mit overrides, alternativen Layouts oder Plugins lösen könnte.

    in einer Kombination :)


    Also ich brauche zunächst einmal eine eine Frontend-Registrierung sowohl für Privatkunden als auch für Geschäftskunden (daher natürliche und juristische Personen).

    Umsetzbar über einen layout override + fields oder alternativ layout override + ein plugin welches die Felder einbaut.


    Ich habe versucht, das ganze mittels Fields zu lösen, indem ich zur Standard-User-Registrierung einfach weitere Formularfelder hinzugefügt habe. Problem daran war insbesondere der Name, der für Privatkunden zwingend in Vor- und Nachname getrennt sein muss.

    Ich persönlich würde hier drei Felder anlegen und dann beim Speichern die Werte für den Joomla Benutzer zusammenführen.


    Ein eigenes Joomla Auth Plugin scheidet glaube ich aus. Ich habe zwar PHP Kenntnisse, bin aber sicherlich weit davon entfernt, das derart professionell zu bauen. Ich bin Hobbyist, nicht professioneller Entwickler...

    Das wäre auch nur notwendig wenn du eine externe Benutzerverwaltung / Registrierung bauen würdest da du dir dann das manuelle anlegen der ganzen Benutzer sparst.


    Übrigens, ich wollte eigentlich gar nicht richtig extern gehen, sondern für mein Vorhaben durchaus in Joomla bleiben. Mit dem Plugin DirectPHP kann man nahezu alles innerhalb Joomla umsetzen.

    hmm ich behaupte jetzt mal alles was du mit DirectPHP machen würdest kannst du auch in einen Layout Override hinterlegen, hängst dich damit nicht an das Plugin und nutzt den Core Standard weg und die Core Registrierung.


    Grober Ablauf der Implementierung wäre der folgende:

    - Felder für die unterschiedlichen Benutzer identifizieren

    - Die User Felder im Backend in zwei unterschiedlichen Feld Kategorien anlegen

    - Einen Template Override für diese Datei anlegen: https://github.com/joomla/joom…stration/tmpl/default.php in der dann die unterschiedlichen Formulare implementiert werden. z.B. indem man mit einem Schalter zwischen Geschäftskunde und Privatkunde wechselt und dann entsprechend die Fields aus der Kategorie anzeigt welche benötigt werden.

    - Optional könnte in einem Plugin welches auf das Event "onUserBeforeSave" hört noch die beiden Felder für den Namen zusammengefügt werden sowie weitere Validierung wenn gewünscht. Alternativ zeigt man in dem override das Feld "Name" für den Nachnamen an und hat dort auch alle werte vorhanden.


    Alternativ würde es auch gehen in der Kombination von Overrides und einem eigenen Form Plugin das Formular sehr individuell umzuschreiben und dann auch Felder zusammen zu fügen und Validierungen zu implementieren. Bei letzterem könnte ich mir auch vorstellen das man das "showon" feature benutzen kann. Also alle Felder definieren und als erste Auswahl "Geschäftskunde vs Privatkunde" und dann bei allen Felder zu hinterlegen, dieses Feld anzeigen wenn ich ein Geschäftskunde bin und diese wenn ich Privatkunde bin.


    Um eigenes Programmieren wird man nicht herum kommen, DirektPHP ist bestimmt für einige Zwecke geeignet an dieser Stelle sehe ich es nicht da es hier schon um etwas mehr geht als nur um ein bisschen PHP code zur Ausgabe.

  • Und als kleine Anmerkung zu Tobias fantastischer Erläuterung:

    Wenn die Overrides richtig gelöst sind, kann man Felder vorausfüllen lassen, indem man z.B. URL-Parameter mitgibt. Da dies aber relativ unschön aussieht wäre nun der Clou, die Weiterleitungskomponente zu verwenden, indem man z.B. als URL "/kundenanmeldung" anlegt und dann intern auf die parametrisierte URL weiterleitet. (siehe auch hier)

    Dann bekommt die ganze Lösung auch ein super Gesicht.


    Mittels Overrides sind viele Sachen nur mit der Core-Registrierung möglich, z.B.:

      

  • - Einen Template Override für diese Datei anlegen: https://github.com/joomla/joom…stration/tmpl/default.php in der dann die unterschiedlichen Formulare implementiert werden. z.B. indem man mit einem Schalter zwischen Geschäftskunde und Privatkunde wechselt und dann entsprechend die Fields aus der Kategorie anzeigt welche benötigt werden.

    - Optional könnte in einem Plugin welches auf das Event "onUserBeforeSave" hört noch die beiden Felder für den Namen zusammengefügt werden sowie weitere Validierung wenn gewünscht. Alternativ zeigt man in dem override das Feld "Name" für den Nachnamen an und hat dort auch alle werte vorhanden.


    Um eigenes Programmieren wird man nicht herum kommen, DirektPHP ist bestimmt für einige Zwecke geeignet an dieser Stelle sehe ich es nicht da es hier schon um etwas mehr geht als nur um ein bisschen PHP code zur Ausgabe.


    Hallo zero24,


    erstmal noch nachträglich Danke für deine Hilfe und sorry für meine späte Antwort. Ich war vorher nicht dazu gekommen, mich damit weiter zu beschäftigen.


    Nun aber bin ich wieder mitten im Geschehen und würde auch gerne deinen Vorschlag umsetzen wollen, auch wenn ich noch nicht so ganz weiß, wie ich vorgehen muss. Aber ich hoffe da einfach auf deine Unterstützung, denn ich will ja auch dazu lernen.


    Die erforderlichen Felder habe ich soweit alle angelegt und zwei Kategorien zugeordnet (Kategorie Privatkunden und Geschäftskunden). Das hatte ich ohnehin auch schon so vor.


    Nun habe ich aber erstmal noch 3 Fragezeichen über meinem Kopf schweben:


    1. Du schreibst von "Template Override einer bestimmten Datei (default.php) anlegen". Hier bin ich mir nicht sicher, wie und wo das geschehen muss. Ich war unter "Erweiterungen->Templates->Templates in meinem entsprechenden Template. Darin habe ich den Reiter "Overrides erstellen" ausgewählt und habe dann unter Komponenten den Ordner com_users aufgeklappt. Darunter finde ich dann aber keine Unterordner "views", "registration" und "tmpl" und auch keine default.php. Da ist lediglich direkt ein Verzeichnis "registration". Wenn ich darauf aber klicke, bekomme ich die Meldung "Das Verzeichnis konnte nicht erstellt werden". Suche ich an der falschen Stelle? Wie genau lege ich ein Template Override dieser besagten default.php an? Muss ich dazu vielleicht direkt auf dem Server via ftp eine Datei erstellen?


    2. Wenn ich dann das Template Override angelegt habe, wie genau muss ich das Formular implementieren?


    3. Deinen optionalen Vorschlag habe ich überhaupt nicht kapiert.


    Hast du vielleicht ein Beispiel. Ich bin wie gesagt kein professioneller Entwickler, sondern mache das mehr als Hobby mit fortgeschrittenen PHP Kenntnisse. Ich lerne immer am besten anhand von Beispielen. Ich will nicht, dass du mir etwas fertig entwickelst, aber wenn du mir visuell den Pfad, den ich gehen muss, zeigen könntest, würde mir das wahrscheinlich schon ungemein helfen.


    Ich scheue mich grundsätzlich nicht vor PHP Programmierung. Ich bin wie gesagt kein Profi, aber ich habe bisher alles irgendwie hinbekommen, Mein Coding ist sicherlich auch nicht so, dass ein Profi begeistert wäre, aber wie gesagt, ich habe bisher außerhalb Joomla alles hinbekommen, was ich für mich gebraucht habe.


    Vielen Dank im Voraus für deine Mühen, so du mit den helfen kannst und auch möchtest.

  • Hallo,

    Ich war unter "Erweiterungen->Templates->Templates in meinem entsprechenden Template. Darin habe ich den Reiter "Overrides erstellen" ausgewählt und habe dann unter Komponenten den Ordner com_users aufgeklappt. Darunter finde ich dann aber keine Unterordner "views", "registration" und "tmpl" und auch keine default.php. Da ist lediglich direkt ein Verzeichnis "registration".

    Glaub, Du musst dort mehr klicken :)


    com_users > registration > html > com_users > registration


    Ergebnis:


    Liebe Grüße

    Christine

  • Bei deinen Fragen 2 und 3 kann ich dir leider auch nicht helfen, aber ein Override kannst auch ohne FTP erstellen. Du brauchst nur auf "registration" zu klicken ;)


    Nein, das geht leider nicht. Dann bekomme ich besagte Fehlermeldung, wie von mir auch in Post 8 bereits erwähnt.


    "Da ist lediglich direkt ein Verzeichnis "registration". Wenn ich darauf aber klicke, bekomme ich die Meldung "Das Verzeichnis konnte nicht erstellt werden"."

  • Hallo Anka

    ... aber ein Override kannst auch ohne FTP erstellen. Du brauchst nur auf "registration" zu klicken ;)

    Jo :) - hatte aber den Klickweg in # 9 beschrieben gehabt:

    Zitat

    com_users > registration > html > com_users > registration

    Hatte mich dann eh gewundert, warum es bei Sven nicht sichtbar ist. Hab ich halt 2. Variante geliefert.


    Liebe Grüße

    Christine


    Edit: Aha. Posts haben sich überschnitten.

  • Nein, das geht leider nicht. Dann bekomme ich besagte Fehlermeldung, wie von mir auch in Post 8 bereits erwähnt.


    "Da ist lediglich direkt ein Verzeichnis "registration". Wenn ich darauf aber klicke, bekomme ich die Meldung "Das Verzeichnis konnte nicht erstellt werden"."

    Oh, sorry! Ich hätte mir mehr Zeit beim Lesen nehmen sollen...


    Diese Meldung kommt oft vor, wenn die Besitzerrechte auf dem Server falsch gesetzt sind oder wenn die Pfadangaben in der configuration.php nicht stimmen. Das wäre dann aber ein anderes, sozusagen "eigenständiges" Problem, das gelöst werden sollte.

  • Oh, sorry! Ich hätte mir mehr Zeit beim Lesen nehmen sollen...


    Diese Meldung kommt oft vor, wenn die Besitzerrechte auf dem Server falsch gesetzt sind oder wenn die Pfadangaben in der configuration.php nicht stimmen. Das wäre dann aber ein anderes, sozusagen "eigenständiges" Problem, das gelöst werden sollte.

    Kein Problem! Danke für deine Hilfe.


    Ich werde Pfad und Rechte nochmal prüfen, bin mir aber eigentlich ziemlich sicher, dass die korrekt eingestellt sind. Aber wie gesagt, wäre für mich jetzt auch kein großes Übel, "den Weg zu Fuß" per FTP zu gehen... ;)

  • So, liebe Leute,


    Override dürfte wohl nun korrekt angelegt sein - wie ich hoffe (Siehe Bild).


    Wie gesagt, meine Formularfelder sind soweit auch in zwei unterschiedlichen Kategorien (Privatkunden und Geschäftskunden) angelegt. Für mich stellt sich allerdings nun immer noch die Frage, wie ich das Formular in das Override implementieren muss und wie das mit dem Umschalter funktionieren soll.


    Hierzu benötige ich nochmals bzw. immer noch Hilfe, damit ich es einmal verstehe.


    Vielleicht darf ich dich, lieber zero24 nochmals um Hilfe fragen. Ich bin aber auch über jede Hilfe von anderen dankbar.


    Beste Grüße an alle!

  • Sofern ich mich nicht irre kann man z.B. so vorgehen:

    In obiger Override-Datei ist ja schon ein Registrierungs-Formular. Dieses eben abändern und ergänzen(z.B. nur für Firmenkunden) mit den gewüschten Custom Fields.

    Vermutlich ähnlich wie es dort z.B. für das Kontaktformular mit den Custom Fields beschrieben ist:

    https://www.wicked-software.de…ormular-mit-auswahlfelder


    Für zweites Registrierungs-Formular(Privatkunde) eventuell zusätzlich eben ein Alternativ-Layout obiger Override-Datei im gleichen Dateiodner anlegen. z.B. privatkunde.php sowie eine


    privatkunde.xml

    mit z.B. folgendem Inhalt in dieser xml-Datei (11Zeilen):

    siehe übrigens auch: https://github.com/joomla/joom…stration/tmpl/default.xml


    Und dann anschließend per neuem Menüeintrag

    mit dem Menüeintragstyp -> Benutzer -> COM_USER_REGISTRATION_VIEW_DEFAULT_TITLE_PRIVAT


    das Alternativ-Layout zur Verfügung stellen.

  • Danke, Sieger66 !!!


    Das war mal sehr hilfreich für mich. Ich werde mich damit nun nochmal beschäftigen und schauen, ob ich so mein Formular, wie von mir gewünscht, auf den Bildschirm bekomme. Ich melde mich, ob es geklappt hat, oder nicht.


    Eine kleine Frage dazu vielleicht noch: Den Link von dir habe ich mir angeschaut. Das dort aufgeführte Formular ist für mich soweit auch verständlich und wie ich das Formular implementieren muss, ist mir nun wahrscheinlich auch klar. Das einzige, was ich nicht zuordnen kann, sind die Klassen "control-group", "control-label" und "controls". Kannst du mir vielleicht kurz sagen, was diese Klassen genau ansprechen bzw. ansteuern, damit ich das auf die Registrierung entsprechend anwenden kann? Mir ist zwar klar, was Label und Input ist, aber was die Klassen genau bewirken, ist mir unklar.