Usermanagement erweitern

Das Forum soll der Ablage von Lösungen für immer wieder auftauchende Problemstellungen dienen. // This forum contains solutions to problems that frequently occur.
Antworten
Benutzeravatar
dave
Beiträge: 903
Registriert: 04.02.2011, 19:03:57
Wohnort: Berlin
Kontaktdaten:

Usermanagement erweitern

Beitrag von dave » 02.03.2011, 14:10:32

Hallo zusammen,


ich möchte nun mein Usermanagement-Modul ein klein wenig erweitern. Nachdem sich ein User registriert hat, muss sein Konto durch einen Bestätigungslink aktiviert werden.

Dazu habe ich 2 neue Felder in der Tabelle ent_user eingefügt: Activationcode und Activated.

Wenn ich nun mit meiner saveUser($user) Methode die Daten speichern will, erhlate ich mehrer Fehlermeldungen:
Undefined index: Activationcode
Undefined index: Activated
Wo muss ich die denn definieren? Was mich aj auch verwundert: Die Daten kommen in der DB ja auch an udn werden auch korrekt gespeichert.

Muss ich mich jetzt mit Generic OR Mapper befassen? Hats damit was zu tun?

Ist meine Vorgehensweise, die Tabelle ent_user einfach zu erweitern, eigentlich sinnvoll? Wie würdet ihr das machen?

Megger
Beiträge: 1233
Registriert: 04.11.2008, 10:57:37

Re: Usermanagement erweitern

Beitrag von Megger » 02.03.2011, 16:54:35

Du musst die *objects.ini bearbeiten und deine beiden Felder dort auch hinzufügen. Diese liegt normalerweise unter config/modules/usermanagement/<CONTEXT>/<ENVIRONMENT>_umgt_objects.ini

Ich persönlich würde mit einem eigenen Activation Objekt arbeiten.
Dort kannst du dann deine Informationen hinterlegen und das Objekt mit dem User Objekt verknüpfen. Das hat den Vorteil, dass du über den CreationTimestamp die Aktivierung begrenzen kannst, sodass sich die Leute zum Beispiel innerhalb von 24 Stunden aktivieren müssen.
Tutorial: Browsergame mit dem APF (Die ersten Parts handeln von Installation und Inbetriebnahme des APFs, deswegen sicherlich auch für alle Nicht-Browsergame-Programmierer interessant)

APF-Version
  • Entwicklung: 2.0
  • Produktiv: 1.15

Benutzeravatar
Screeze
Beiträge: 1920
Registriert: 05.08.2009, 09:49:04
Kontaktdaten:

Re: Usermanagement erweitern

Beitrag von Screeze » 02.03.2011, 16:55:15

Jep der GORM ist der schlüssel.
Das Umgt nutzt den GORM ja als Datenquelle, dafür hat es config dateien (*_relations.ini, *_objects.ini) in denen die Tabellen definiert sind. Dort musst du in der section
[User]
noch deine 2 neuen Felder einfügen.

Ich würde die Daten nicht in der DB direkt editieren, sondern erst in die config dateien packen, und aschließend das GORM-Update tool laufen lassen, das aktualisiert die datenbank automatisch.Beim hinzufügen von feldern ist das einfach - wenn du jedoch felder umbenennst o.ä. vorsicht, dann wird das alte komplett gelöscht und ein neues angelegt - Datenverlust wenn bereits Daten vorhanden sind in den Feldern.

Benutzeravatar
dave
Beiträge: 903
Registriert: 04.02.2011, 19:03:57
Wohnort: Berlin
Kontaktdaten:

Re: Usermanagement erweitern

Beitrag von dave » 02.03.2011, 21:02:22

Also ich habe mich jetzt den gesamten nachmittag mit dem GORM beschäftigt und daran rum gebastelt. Allein 2 Stunden habe ich für die Konfiguration gebraucht, bis ich das alles überhaupt ein wenig gerafft habe :roll:


Im Moment scheitere ich aber an einer Beziehung bzw. Verbindung.

Und zwar folgendes:
Ich habe mir (vollautomatisiert mit GenericORMapperUpdate) eine neue Tabelle ent_activation als Object sowie eine neue Tabelle ass_activation2user als Relation erstellt.
Damit möchte ich einfach den Aktivierungskey, der in der Tabelle ent_activation steht, einem User mit einer ID über die Tabelle ass_activation2user verknüpfen.

Diese Verknüpfung bekomme ich leider nicht hin. Den Aktivierungskey in der Tabelle zu speichern, war nicht so der Hit (obwohl ich denke, dass das keine elgenate Lösung ist) aber die Beziehung zwischen User und Key schaffe ich nicht.

Ich habe das jetzt mal mit

Code: Alles auswählen

$act->addRelatedObject('Activation2User',$user);
versucht, aber so bekomme ich nur Fehlermeldungen:
Call to a member function addRelatedObject() on a non-object
Ich bin ja schon am überlegen, dass einfach selbst über ein Sql-Query zu machen, aber wenn ich den GORM auch in den Grundzügen schonmal verstehe, wäre ich sehr zufriedne und glücklich ;).
Habt ihr Lösungsansätze oder Tipps?

Benutzeravatar
Screeze
Beiträge: 1920
Registriert: 05.08.2009, 09:49:04
Kontaktdaten:

Re: Usermanagement erweitern

Beitrag von Screeze » 02.03.2011, 21:05:11

Call to a member function addRelatedObject() on a non-object
Was sit $act? Offenbar KEIN objekt

Benutzeravatar
dave
Beiträge: 903
Registriert: 04.02.2011, 19:03:57
Wohnort: Berlin
Kontaktdaten:

Re: Usermanagement erweitern

Beitrag von dave » 02.03.2011, 21:15:34

Das ist $act:

Code: Alles auswählen

$act = $orm->loadObjectByID('Activation',1);
Ich glaube, ich habs verstanden, woran es liegt:
Und zwar wird die Relation zur Activation mit der ID hergestellt. Nur, die ID 1 gibt es noch nicht, daher der Fehler. Die wird erst im Anschluss durch ein

Code: Alles auswählen

$orm->saveObject($app);
angelegt ...

Nur das ist doch irgendwie unlogisch ... da müsste ich ja zwei mal ein saveObject() durchführen. Ich möchte das gleich alles in einem Rutsch machen ...

Benutzeravatar
Screeze
Beiträge: 1920
Registriert: 05.08.2009, 09:49:04
Kontaktdaten:

Re: Usermanagement erweitern

Beitrag von Screeze » 02.03.2011, 21:22:46

Dann machs so:

Code: Alles auswählen

$act = new GenericDomainObject('Activation');
$act->addRelatedObject(...)
$GORM->saveObject($act);
du brauchst es ja nicht extra zu laden, du kannst das objekt ja beim neu erstellen gleich verbinden

Benutzeravatar
dave
Beiträge: 903
Registriert: 04.02.2011, 19:03:57
Wohnort: Berlin
Kontaktdaten:

Re: Usermanagement erweitern

Beitrag von dave » 02.03.2011, 21:42:46

Jaaaa, jetzt hab ichs auch richtig zusammen gewurschtelt ;). Ist zu viel durcheiander im Quellcode ... durch das viele probieren ... :lol: :roll:

Oh man, ist glaube ich zu viel heute ...

Danke dir, jetzt klappt es wunderbar. Langsam machts echt Spass, mit dem APF zu arbeiten. Es kann verdammt viel für mich erledigen, das ist echt unglaublich!

Einzig am Ende meiner Seite wird mit folgendes noch ausgeworfen:

Code: Alles auswählen

Fatal error: Exception thrown without a stack frame in Unknown on line 0
Was solll/will mir das sagen?

Prost! :ugeek:

Benutzeravatar
dave
Beiträge: 903
Registriert: 04.02.2011, 19:03:57
Wohnort: Berlin
Kontaktdaten:

Re: Usermanagement erweitern

Beitrag von dave » 08.03.2011, 21:44:38

Ich bins mal wieder,

habe mich jetzt etwas tiefer ins UMGT vor gearbeitet und bin dabei, Rechtevergabe mit Rollen zu erstellen.

Ich habe drei Rollen (Benutzer, Moderator, Administrator) angelegt und beim Registrieren wird der neue User auch gleich der Rolle 'Benutzer' zugewiesen. Das ist soweit schon schön und klappt wunderbar!

Nun möchte ich aber an anderer Stelle die Rollen des Users wieder laden. Dazu gibt es ja auch die Methode:

Code: Alles auswählen

loadRolesWithUser($user) 
Wenn ich das nun allerdings ausführe, bekomme ich eine Uncaught exception:
[GenericDomainObject::loadRelatedObjects()] The data component is not initialized, so related objects cannot be loaded! Please use the or mapper's loadRelatedObjects() method or call setDataComponent($orm), where $orm is an instance of the or mapper, on this object first!
Habe mir das auch schon ein wenig in der API und im UmgtManager.php angesehen, werde aber leider nicht schlauer. Was mache ich falsch?

Benutzeravatar
Screeze
Beiträge: 1920
Registriert: 05.08.2009, 09:49:04
Kontaktdaten:

Re: Usermanagement erweitern

Beitrag von Screeze » 08.03.2011, 21:56:13

dein user objekt wurde scheinbar nicht mit dem GORM geladen, sondern vermutlich selber erstellt oder aus einer session geladen.

Das Problem bei letzteren Methoden ist, dass das User objekt den GORM nicht kennt, welche nötig ist um entsprechende Beziehungsfunktionen zu verwenden.
Wenn du ein Objekt speicherst oder mit dem GORM lädst injiziert der GORM selber eine referenz auf sich in das User-Objekt.
Wenn das nicht der Fall ist musst du das selber manuell machen mit "$user->setDataComponent($GORM)" wobei $GORM dann eine instanz des GenericORRelationMapper sein muss.

Benutzeravatar
dave
Beiträge: 903
Registriert: 04.02.2011, 19:03:57
Wohnort: Berlin
Kontaktdaten:

Re: Usermanagement erweitern

Beitrag von dave » 08.03.2011, 22:08:03

Ah ja,

Da ich fast überall die Daten aus der Session hole (Ist das nun eher gut oder eher schlecht?) behandle ich meinem $user also überall erstmal mit

Code: Alles auswählen

$user->setDataComponent($orm);
Da geh ich weiteren Problemen aus dem Weg ^^.

Vielen Dank für das Snippet!

Benutzeravatar
Screeze
Beiträge: 1920
Registriert: 05.08.2009, 09:49:04
Kontaktdaten:

Re: Usermanagement erweitern

Beitrag von Screeze » 08.03.2011, 22:11:06

Wenn du das etwas vereinfachen willst, würde ich eine FrontcontrollerAction erstellen, diese statisch in der index.php beim FC registrieren, und darin dann den user aus der session holden, den GORM injizieren, und wieder zurück in die Session speichern, dann brauchst du das nicht immer manuell machen.
Sollte klappen ;)

Benutzeravatar
dave
Beiträge: 903
Registriert: 04.02.2011, 19:03:57
Wohnort: Berlin
Kontaktdaten:

Re: Usermanagement erweitern

Beitrag von dave » 08.03.2011, 22:16:48

Gute Idee, das probiere ich gleich mal aus! Erspart Schreibartbeit.

Werde gleich auch mal schauen, was das

Code: Alles auswählen

setDataComponent
genau macht ...

Antworten

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 1 Gast