Cronjob für Gruppen Updates

  • Ich habe einen Cronjob für die Synchronisierung von InGame zu Woltlab nun habe ich aber ein paar untergruppen die ich nicht entfernen möchte bzw. möchte ich das die teammitglieder diese " untergruppe" behalten.


    Die Gruppen setze ich so:

    Code
    $userAction = new UserAction([$userID], 'addToGroups', $data);
    $userAction->executeAction();

    wenn das ausgeführt wird werden Ihm alle Gruppen entfernt und die Gruppe 1,2 & eben die neue Gruppe gesetzt...


    kann man das jetzt so einstellen das wenn der user z.B. die Gruppe 14, 15, 16 & 17 hat das diese Gruppen bleiben? (Weil diese Gruppen existieren nur für extra Berechtigung zu verschiedenen Foren)


    und 'deleteOldGroups' => false möchte ich auch nicht nutzen weil ja dann die alten Gruppen behalten würde was ja auch blöd wäre :(


    Ich hoffe ich habe mich verständlich ausgedrückt ;)


    Mit freundlichen Grüßen


    David Katalinic

  • Du kannst über das User-Objekt auf die Funktion getGroupIDs() zugreifen. Darüber kannst du prüfen, zu welchen Benutzergruppen der Benutzer gehört.


    Die zu behaltenden Benutzergruppen-IDs des Benutzers speicherst du dir in ein Array ab, zu welchem du noch die synchronisierte(n) Benutzergruppen-ID(s) hinzufügst. Dieses Array nutzt du dann als Wert für den Schlüssel groups in deiner Variable $data.

  • Alternativ eine Kombination aus add groups mit dem keep-Parameter und remove groups.

    Dann untergräbst du nicht manuell oder per automatischer Zuordnung gesetzte Gruppen.

  • Du kannst über das User-Objekt auf die Funktion getGroupIDs() zugreifen. Darüber kannst du prüfen, zu welchen Benutzergruppen der Benutzer gehört.

    Kann ich WCF::getUser()->getGroupIDs(); überhaupt bei Cronjobs benutzen?


    Beim wcfDebug erhalte ich folgende arrays obwohl ich mehrere Gruppen habe als nur 1 & 2? muss ich in Cronjobs anders vorgehen mit Userabfragen?


    Code
    Argument 0 (array)
    Array
    (
        [0] => 1
        [1] => 2
    )
  • Alternativ eine Kombination aus add groups mit dem keep-Parameter und remove groups.

    Wie meinst du das genau? So oder ungefähr oder wie? 'deleteOldGroups' => [14, 15, 16, 17, 18] => false, ?


    Aber das wird so denke ich mal nicht funktionieren oder?

  • Kann ich WCF::getUser()->getGroupIDs(); überhaupt bei Cronjobs benutzen?


    Beim wcfDebug erhalte ich folgende arrays obwohl ich mehrere Gruppen habe als nur 1 & 2? muss ich in Cronjobs anders vorgehen mit Userabfragen?


    Code
    Argument 0 (array)
    Array
    (
        [0] => 1
        [1] => 2
    )

    Du müsstest dir vorher das Benutzer obiekt holen, z.b. Über den UserRuntimeCache und auf diese Objekt kannst du dies dann aufrufen.

  • Du müsstest dir vorher das Benutzer obiekt holen, z.b. Über den UserRuntimeCache und auf diese Objekt kannst du dies dann aufrufen.

    $groupIDHasAll = UserRuntimeCache::getInstance()->getObjects($userID); so oder wie? hiermit bekomme ich einen Fehler bei der wcfDebug ausgabe ;(



  • $groupIDHasAll = UserRuntimeCache::getInstance()->getObjects($userID); so oder wie?

    Nein, so: $user = UserRuntimeCache::getInstance()->getObject($userID);


    Wie meinst du das genau?

    Ich glaube, gn5VmUKCtv6ekrMf meinte mit „remove groups“ folgende Funktion: https://github.com/WoltLab/WCF…UserEditor.class.php#L254

  • Nein, so: $user = UserRuntimeCache::getInstance()->getObject($userID);

    Ja das geht aber... [groupIDs:protected] ?


    Edit: $user->getGroupIDs einfach nutzen dann geht's ;)


    Ich glaube, MysteryCode meinte mit „remove groups“ folgende Funktion: https://github.com/WoltLab/WCF…UserEditor.class.php#L254

    Hmmm :/ dann müsste ich aber trotzdem alle groupIDs bekommen um dann die, die der User nicht mehr hat zu entfernen.

  • So, habe es mal geschafft das ich einen Array habe mit den Gruppen die ich behalte und mit der neuen Gruppe... die sieht jetzt so aus mit dem wcfDebug;


    Array 3 - 13 sind Gruppen die die User für zusätzliche Berechtigung brauchen 0-1 sind ja Jeder & Gast und 2 ist die Gruppe die ja im Forum etc. Angezeigt wird und immer Synchronisiert wird nur wenn ich das jetzt ausführe wird mir jeder rang entfernt ;(


    Code
                    wcfDebug($groupIDNew);
    
                    $data = [
                        'groups' => [$groupIDNew]
                    ];                
    
                    if ($groupID != $groupIDHas) {
                        $userAction = new UserAction([$userID], 'addToGroups', $data);
                        $userAction->executeAction();
                    }

    zwar kommt kein Fehler aber es entfernt mir alle gruppen ;(

  • zwar kommt kein Fehler aber es entfernt mir alle gruppen

    Entspricht $groupIDNew einem / deinem obigen Array? Wenn ja, dann wird es vermutlich daran liegen, dass du ein Array in ein Array verschachtelst. Du könntest es dann wie folgt umsetzen:

    PHP
    $userAction = new UserAction([$userID], 'addToGroups', [
        'groups' => $groupIDNew
    ]);
    $userAction->executeAction();

Participate now!

Don’t have an account yet? Register yourself now and be a part of our community!