Dynamische Rollen

Alles, was nicht in die anderen Foren passt, kannst du hier loswerden.
Antworten
admmik
Beiträge: 23
Registriert: 28. Mai 2011, 13:55

Dynamische Rollen

Beitrag von admmik »

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!
D347h
Beiträge: 30
Registriert: 15. Jun 2011, 18:34
Wohnort: Linz
Kontaktdaten:

Beitrag von D347h »

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
matzman2000
Former team member
Beiträge: 1087
Registriert: 2. Sep 2007, 17:12
Wohnort: Itzstedt
Kontaktdaten:

Beitrag von matzman2000 »

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... :wink:
admmik
Beiträge: 23
Registriert: 28. Mai 2011, 13:55

Beitrag von admmik »

Hmm... das habe ich mir so schon gedacht.
Hatte jetzt ehrlich gesagt gehofft, dass das schon mal jemand umgesetzt hat und mir den Code postet. :lol:

Werde das Thema dann auf Ende des Jahres verschieben (da habe ich wieder etwas mehr Zeit).

Aber dennoch danke für eure schnellen Antworten!
emale999
Beiträge: 3
Registriert: 22. Sep 2023, 19:23

Re: Dynamische Rollen

Beitrag von emale999 »

Hat hier schon jemand eine Lösung gefunden, bevor ich das Rad neu erfinde? Sind ja immerhin schon 12 Jahre ins Land gegangen :mrgreen:

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.
ronpackard
Beiträge: 1
Registriert: 3. Sep 2024, 22:56

Re: Dynamische Rollen

Beitrag von ronpackard »

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 :mrgreen:

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.
Hallo zusammen! Die Frage ist auch heute noch aktuell. Hat jemand eine Lösung?
pboosten
Beiträge: 8
Registriert: 31. Okt 2023, 21:47

Re: Dynamische Rollen

Beitrag von pboosten »

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:
  • 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
Nicht unmöglich, aber auch nicht leicht. Das alles kann entweder mit einem externen Script (cron), oder mit eine Stored Procedure in mysql.
Zuletzt geändert von pboosten am 2. Mär 2025, 20:46, insgesamt 1-mal geändert.
mfg,

Peter
pboosten
Beiträge: 8
Registriert: 31. Okt 2023, 21:47

Re: Dynamische Rollen

Beitrag von pboosten »

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):

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 ;
In meinem Beispiel ruf ich das an mit:

Code: Alles auswählen

call p_dynamic_role(10,2,42,'1');
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:

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 ;
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.
mfg,

Peter
pboosten
Beiträge: 8
Registriert: 31. Okt 2023, 21:47

Re: Dynamische Rollen

Beitrag von pboosten »

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:

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 ;
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())
mfg,

Peter
Antworten