Dynamische Rollen
Dynamische Rollen
Hallo zusammen,
ich habe im Moment leider nicht die Zeit mir selbst Lösungen auszudenken, daher folgende Frage an euch:
Ich würde gerne eine dynamische Rolle erzeugen, also eine Rolle, deren Mitglieder dynamisch anhand einer bestimmten Eigenschaft angelegt werden. In meinem Fall hätte ich gerne eine Rolle "Jugendliche" in der alle Mitglieder <18 Jahre sein sollen. Da wir häufig Infos lediglich für Jugendliche haben, wäre das für Briefe und E-Mails sehr hilfreich.
Hat jemand sowas schonmal umgesetzt? Oder gibt es eine schnelle Lösung dafür?
Herzlichen Dank für jede Hilfe und eure Erfahrungen!
ich habe im Moment leider nicht die Zeit mir selbst Lösungen auszudenken, daher folgende Frage an euch:
Ich würde gerne eine dynamische Rolle erzeugen, also eine Rolle, deren Mitglieder dynamisch anhand einer bestimmten Eigenschaft angelegt werden. In meinem Fall hätte ich gerne eine Rolle "Jugendliche" in der alle Mitglieder <18 Jahre sein sollen. Da wir häufig Infos lediglich für Jugendliche haben, wäre das für Briefe und E-Mails sehr hilfreich.
Hat jemand sowas schonmal umgesetzt? Oder gibt es eine schnelle Lösung dafür?
Herzlichen Dank für jede Hilfe und eure Erfahrungen!
Moinsen 
Ich weist nicht so genau was eine "schnelle" Loesung ist, aber eine Moeglichkeit waere:
Beim speichern eines Benutzers eine Funktion aufzurufen die das Alter ueberprueft und bei Bedarf in die entsprechende Gruppe zuweist.
Die benoetigten Codeteile sind ja großteils schon in Admidio enthalten, sollte also nicht so der Aufwand sein
MfG
D347h

Ich weist nicht so genau was eine "schnelle" Loesung ist, aber eine Moeglichkeit waere:
Beim speichern eines Benutzers eine Funktion aufzurufen die das Alter ueberprueft und bei Bedarf in die entsprechende Gruppe zuweist.
Die benoetigten Codeteile sind ja großteils schon in Admidio enthalten, sollte also nicht so der Aufwand sein

MfG
D347h
-
- Former team member
- Beiträge: 1087
- Registriert: 2. Sep 2007, 17:12
- Wohnort: Itzstedt
- Kontaktdaten:
Eine schnelle Lösung wirst Du hierfür nicht finden.
Du musst Dich schon mit der Materie auseinandersetzen...
Der Ansatz von D347h ist für die Zuweisung einer Rolle sicherlich gut, ich gabe aber zu bedenken, dass das lediglich für die Zuweisung der Rolle funktioniert. Zusätzlich müsste man sich überlegen, wie man die Mitglieder wieder aus der Rolle rauslöscht, wenn sie zu alt sind.
Mir fiele jetzt (für beide Varianten) eher die Lösung eines eigenen Scripts ein, das per Cronjob täglich losläuft...
Du musst Dich schon mit der Materie auseinandersetzen...
Der Ansatz von D347h ist für die Zuweisung einer Rolle sicherlich gut, ich gabe aber zu bedenken, dass das lediglich für die Zuweisung der Rolle funktioniert. Zusätzlich müsste man sich überlegen, wie man die Mitglieder wieder aus der Rolle rauslöscht, wenn sie zu alt sind.
Mir fiele jetzt (für beide Varianten) eher die Lösung eines eigenen Scripts ein, das per Cronjob täglich losläuft...

Re: Dynamische Rollen
Hat hier schon jemand eine Lösung gefunden, bevor ich das Rad neu erfinde? Sind ja immerhin schon 12 Jahre ins Land gegangen
Ich bräuchte auch so eine Lösung. Unsere Mitglieder haben im Profil Checkbox-Felder für verschiedene Tätigkeiten, die sie im Verein leisten können und ich hätte gerne, dass sie je nachdem in verschiedenen Gruppen landen.
Jetzt wird natürlich einer sagen: Dann weise sie doch gleich den Gruppen zu, statt im Profil Checkbox-Felder anzulegen. Aber erstens importiere ich die Mitglieder immer von einer Excel-Datei rein, wo die Infos über die Tätigkeiten drinnen stehen und zweitens ist es für die Verwaltung einfacher, ein Profil zu öffnen und dort die Tätigkeiten einer Person zu ändern, statt in mehreren Gruppen immer nach der Person zu suchen und dort dann den Haken rein ode raus zu nehmen. Birgt auch ein gewisses Fehlerpotential.

Ich bräuchte auch so eine Lösung. Unsere Mitglieder haben im Profil Checkbox-Felder für verschiedene Tätigkeiten, die sie im Verein leisten können und ich hätte gerne, dass sie je nachdem in verschiedenen Gruppen landen.
Jetzt wird natürlich einer sagen: Dann weise sie doch gleich den Gruppen zu, statt im Profil Checkbox-Felder anzulegen. Aber erstens importiere ich die Mitglieder immer von einer Excel-Datei rein, wo die Infos über die Tätigkeiten drinnen stehen und zweitens ist es für die Verwaltung einfacher, ein Profil zu öffnen und dort die Tätigkeiten einer Person zu ändern, statt in mehreren Gruppen immer nach der Person zu suchen und dort dann den Haken rein ode raus zu nehmen. Birgt auch ein gewisses Fehlerpotential.
-
- Beiträge: 1
- Registriert: 3. Sep 2024, 22:56
Re: Dynamische Rollen
Hallo zusammen! Die Frage ist auch heute noch aktuell. Hat jemand eine Lösung?emale999 hat geschrieben: ↑17. Okt 2023, 09:21 Hat hier schon jemand eine Lösung gefunden, bevor ich das Rad neu erfinde? Sind ja immerhin schon 12 Jahre ins Land gegangen![]()
Ich bräuchte auch so eine Lösung. Unsere Mitglieder haben im Profil Checkbox-Felder für verschiedene Tätigkeiten, die sie im Verein leisten können und ich hätte gerne, dass sie je nachdem in verschiedenen Gruppen landen.
Auf sweet bonanza slot erwartet Sie ein süßes Abenteuer! Spielen Sie das beliebte Sweet Bonanza und erleben Sie bunte Bonbon-Grafiken sowie spannende Gewinnchancen. Jetzt ausprobieren!
Jetzt wird natürlich einer sagen: Dann weise sie doch gleich den Gruppen zu, statt im Profil Checkbox-Felder anzulegen. Aber erstens importiere ich die Mitglieder immer von einer Excel-Datei rein, wo die Infos über die Tätigkeiten drinnen stehen und zweitens ist es für die Verwaltung einfacher, ein Profil zu öffnen und dort die Tätigkeiten einer Person zu ändern, statt in mehreren Gruppen immer nach der Person zu suchen und dort dann den Haken rein ode raus zu nehmen. Birgt auch ein gewisses Fehlerpotential.
Re: Dynamische Rollen
Bevor ich anfange, entschuldige ich mich für mein Montagmorgen-Deutsch: ich bin Holländer.
Ich leite einen Verein und unsere Mitglieder können durch Ankreuzen eines Checkbox in ihrem Profil angeben, ob sie für ihre Patenschaft eine Rechnung wünschen.
Um Mitglieder dynamisch in eine Rolle zu setzen, brauchen sie einen Eintrag in die adm_members Tabelle.
So einen Eintrag hat auch einen Anfangs- und Enddatum. Alle Eintrage in die verschiedenen Rollen habben das.
Ich kann eine Abfrage schreiben, um alle Datensätze der Mitglieder abzurufen, die diese Checkbox aktiviert haben (Tabelle adm_user_data), und diese problemlos in die Tabelle adm_members einfügen. Dann muss ich aber auch prüfen, ob ihre Mitgliedschaft noch nicht beendet wurde (Tabelle adm_members).
Also:
Ich leite einen Verein und unsere Mitglieder können durch Ankreuzen eines Checkbox in ihrem Profil angeben, ob sie für ihre Patenschaft eine Rechnung wünschen.
Um Mitglieder dynamisch in eine Rolle zu setzen, brauchen sie einen Eintrag in die adm_members Tabelle.
So einen Eintrag hat auch einen Anfangs- und Enddatum. Alle Eintrage in die verschiedenen Rollen habben das.
Ich kann eine Abfrage schreiben, um alle Datensätze der Mitglieder abzurufen, die diese Checkbox aktiviert haben (Tabelle adm_user_data), und diese problemlos in die Tabelle adm_members einfügen. Dann muss ich aber auch prüfen, ob ihre Mitgliedschaft noch nicht beendet wurde (Tabelle adm_members).
Also:
- Liste von usd_usr_id aus adm_user_data wo usd_usf_id einen bestimmten Wert hat (Tabelle adm_user_fields) und usd_value einen bestimmten Wert hat (1 oder 0, in meinem Fall). Diese Liste enthält auch ex-Mitglieder
- Kontrolliere ob diese usd_usr_id's noch immer MItglied sind (Vergleiche mem_end für mem_rol_id und mem_usr_id mit dem aktuellen Datum - wir löschen keine Mitglieder, wir beënden ihre Mitgliedschaft)
- Lösche alle Mitglieder aus der dynamischen Rolle
- Füge der dynamischen Rolle die richtige Mitgliederliste hinzu
Zuletzt geändert von pboosten am 2. Mär 2025, 20:46, insgesamt 1-mal geändert.
mfg,
Peter
Peter
Re: Dynamische Rollen
Doch nicht so schwierig wie ich dachte.
Man braucht zugriff zur Databasetabellen.
Zu erst braucht man die ID von der dynamischen Rolle, und die referenz Rolle (die Rolle wo alle Mitglieder stehen).
Die IDs findet man in die adm_roles Tabelle (rol_id). Für mich sind das 10 (dynamische Rolle) und 2 (Referenz Rolle).
Dan braucht man die ID des Feldes das man benützt um die dynamische Rolle zu füllen. Die ID findet man in adm_user_fields (usf_id). In meinem Fall ist das 42 ('Bekommt Rechnung')
Leider ist es mich noch nicht gelungen den Operator dynamisch zu machen (weiß noch nicht ob es möchlich ist), und meine Stored Procedure macht eine 'ist gleich an' (=), aber das kann man einfach änderen in ein '<' oder '>'. Der Operator steht zwichen a.usd_value und in_value.
Stored Procedure (die kann man so kopieren in mysql):
In meinem Beispiel ruf ich das an mit:
Man kann die Procedure auch statisch machen, iech habe sie so universal wie möchlich probieren zu machen.
Die Procedure kann man dan automatisch anrufen mit eine Event (in mysql) oder ein cron Eintrag.
Die Event könnte so aussehen:
Ich wird das aber nicht täglich machen, denn es gibt ein kleiner Nachteil: immer wenn man alte Rekords löscht, und neue erstellt, erhöht sich die primary Index von adm_members. Das ist eine unsigned int, und kann über 2 miljarden Werte enthalten. Für ein paar Rekords geht das, aber wenn man viele Rekords täglich löscht und erstellt kann das schnell gehen.
Man braucht zugriff zur Databasetabellen.
Zu erst braucht man die ID von der dynamischen Rolle, und die referenz Rolle (die Rolle wo alle Mitglieder stehen).
Die IDs findet man in die adm_roles Tabelle (rol_id). Für mich sind das 10 (dynamische Rolle) und 2 (Referenz Rolle).
Dan braucht man die ID des Feldes das man benützt um die dynamische Rolle zu füllen. Die ID findet man in adm_user_fields (usf_id). In meinem Fall ist das 42 ('Bekommt Rechnung')
Leider ist es mich noch nicht gelungen den Operator dynamisch zu machen (weiß noch nicht ob es möchlich ist), und meine Stored Procedure macht eine 'ist gleich an' (=), aber das kann man einfach änderen in ein '<' oder '>'. Der Operator steht zwichen a.usd_value und in_value.
Stored Procedure (die kann man so kopieren in mysql):
Code: Alles auswählen
DELIMITER ;;
create procedure p_dynamic_role (IN dynrole int unsigned, IN refrole int unsigned, IN in_field int unsigned, IN in_value varchar(4000))
BEGIN
DELETE from adm_members where mem_rol_id=dynrole;
INSERT INTO adm_members (mem_rol_id, mem_usr_id, mem_uuid, mem_begin, mem_end)
SELECT dynrole, a.usd_usr_id, uuid(), b.mem_begin, b.mem_end from adm_user_data as a join adm_members as b on a.usd_usr_id=b.mem_usr_id where (b.mem_end > curdate() and b.mem_rol_id=refrole) and a.usd_usf_id= in_field and a.usd_value = in_value;
END;;
DELIMITER ;
Code: Alles auswählen
call p_dynamic_role(10,2,42,'1');
Die Procedure kann man dan automatisch anrufen mit eine Event (in mysql) oder ein cron Eintrag.
Die Event könnte so aussehen:
Code: Alles auswählen
delimiter ;;
create event daily_maintenance on schedule every 1 day on completion preserve enable do BEGIN
call p_dynamic_role(10,2,42,'1');
END;;
delimiter ;
mfg,
Peter
Peter
Re: Dynamische Rollen
in meinem vorherigen Beispiel benützte ich eine Procedure die alle Records aus der Rolle löschte, and nachher wieder neu erstellte.
Das geht, aber ist unnötig in meinem Fall. Man kann auch einen update-Trigger benützen. Was der Trigger macht is bei eine Update auf einer Tabelle eine Aktion ausführen. Mein Trigger kuckt ob eine bestimmte Checkbox (42) ein- ('1') oder ausgeschaltet ('0') wurde. Eine Trigger kann keine Parameter haben (wie eine Procedure), und wird dan sehr statisch.
Es gibt noch eine weitere Einschränkung: eine Tabelle kann nur eine Update-Trigger haben. Wenn man mehrere Rollenupdates mit mehrere Checkbox-änderungen durchführen möchte, wird der Trigger komplex.
Meine Trigger:
Alle Werte sind statisch: 42 ist die Checkbox, '1' is eingeschaltet, 2 ist die Rolle mit alle Mitglieder, 10 ist die dynamische Rolle.
Ich checke nur noch ob das Mitglied noch Mitglied ist (end > curdate())
Das geht, aber ist unnötig in meinem Fall. Man kann auch einen update-Trigger benützen. Was der Trigger macht is bei eine Update auf einer Tabelle eine Aktion ausführen. Mein Trigger kuckt ob eine bestimmte Checkbox (42) ein- ('1') oder ausgeschaltet ('0') wurde. Eine Trigger kann keine Parameter haben (wie eine Procedure), und wird dan sehr statisch.
Es gibt noch eine weitere Einschränkung: eine Tabelle kann nur eine Update-Trigger haben. Wenn man mehrere Rollenupdates mit mehrere Checkbox-änderungen durchführen möchte, wird der Trigger komplex.
Meine Trigger:
Code: Alles auswählen
DELIMITER ;;
CREATE TRIGGER rechnung AFTER UPDATE ON adm_user_data
FOR EACH ROW
BEGIN
DECLARE begin, end DATE;
SELECT mem_begin, mem_end from adm_members WHERE mem_usr_id=NEW.usd_usr_id AND mem_rol_id = 2 INTO begin, end;
IF (NEW.usd_usf_id = 42)
THEN
IF (NEW.usd_value = '1')
THEN
IF (end > curdate())
THEN
INSERT INTO adm_members (mem_rol_id, mem_usr_id, mem_uuid, mem_begin, mem_end)
VALUES (10, NEW.usd_usr_id, uuid(), begin, end);
END IF;
ELSE
DELETE FROM adm_members WHERE mem_rol_id=10 AND mem_usr_id=NEW.usd_usr_id;
END IF;
END IF;
END;;
DELIMITER ;
Ich checke nur noch ob das Mitglied noch Mitglied ist (end > curdate())
mfg,
Peter
Peter