Contao-Camp 2024
Ergebnis 1 bis 9 von 9

Thema: Event bei Datensatzaktualisierung

  1. #1
    Contao-Nutzer
    Registriert seit
    07.07.2016.
    Beiträge
    65

    Standard Event bei Datensatzaktualisierung

    Guten Morgen/Mittag

    Ich habe ein Metamodel "mm_company", das eine 1:n-Beziehung mit Mitglieder hat, also 1 Firma, n Mitglieder. Die Mitglieder eines Unternehmens müssen alle in der selben Mitgliedergruppe (z.B. Aktivmitglied) mit Berechtigungen. Die Zuweisung zur Firma findet mittels SELECT-Feld in der Mitgliedsmaske statt, die Mitgliedergruppe werden dem Unternehmen im BE von mm_company zugewiesen (SELECT-Feld der Mitgliedergruppe). Klappt alles wunderbar.

    Der einzige Punkt, an dem ich festhänge: Sobald die Mitgliedergruppe im SELECT-Feld von mm_company geändert wird, sollte dies automatisch bei den Mitgliedern (also Personen), die mit Firma in Beziehung stehen auch aktualisiert werden. Denn die Personen loggen sich ja ein und nicht die Firma. Die Firma aber definiert die Mitgliedergruppe.

    Was ich weiss, ist, dass Metamodels Events und nicht Callbacks verwendet. Habe mal einen gefundenen Snippet einfach mal zum Testen unter app/Resources/contao/config/event_listeners.php eingefügt, aber da passiert nichts (egal ob ich einen neuen Eintrag erstelle oder einen bestehenden aktualisiere). Ich weiss auch nicht, ob der Event für mein Anliegen der richtige ist. Vermutlich nicht.

    PHP-Code:
    $GLOBALS['TL_EVENTS']['dc-general.model.pre-create[mm_company]'][] = function ($event) { 
               
        
    //ausgabe event 
        
    dump($event); 
             
    }; 
    Vielleicht kann mir da jemand auf die Sprünge helfen. Danke schon mal herzlich für die Unterstützung!

  2. #2
    Contao-Urgestein
    Registriert seit
    29.10.2009.
    Ort
    Magdeburg
    Beiträge
    2.020
    Partner-ID
    626
    User beschenken
    Wunschliste

    Standard

    1. Die mit dem Dateinamen suffixed Events gibt es schon länger nicht mehr. Stattdessen musst du das eigentliche Event nehmen und im EventListener unterscheidn, ob du darauf reagieren möchtest
    2. Das GLOBALS Array $GLOBALS['TL_EVENTS'] ist zumindest deprecated. Nutze am besten die Möglichkeiten des Symfony-Containers zum registrieren von Events
    3. pre-create klingt für mich nach dem falschen Event, Da du dies ja bei jeder Änderung machen möchtest und nicht nur wenn ein neuer Datensatz erstellt wurde

  3. #3
    Contao-Nutzer
    Registriert seit
    07.07.2016.
    Beiträge
    65

    Standard

    Hallo Webstar

    Danke dir!

    Okay, ich meine, das verstehe ich nun. Ich habe in Bezug auf PreEditModelEvent was aktuelleres gefunden, was ich - glaube ich - gut adaptieren kann.

    PHP-Code:
    use ContaoCommunityAlliance\DcGeneral\Event\PreEditModelEvent

    return [ 
       
    PreEditModelEvent::NAME => [ 
           function (
    PreEditModelEvent $event) { 
           ....
           }, 
       ], 
    ]; 
    Was für mich aber noch unklar ist: Welchen Event soll ich denn wählen? ActionEvent? Ich versuche mich mal durch...

  4. #4
    Contao-Urgestein Avatar von zonky
    Registriert seit
    19.03.2010.
    Ort
    Berlin, Rdf
    Beiträge
    9.682
    User beschenken
    Wunschliste

    Standard

    Zitat Zitat von DanEi Beitrag anzeigen
    Der einzige Punkt, an dem ich festhänge: Sobald die Mitgliedergruppe im SELECT-Feld von mm_company geändert wird, sollte dies automatisch bei den Mitgliedern (also Personen), die mit Firma in Beziehung stehen auch aktualisiert werden.
    Frage ist, wann soll die Aktualisierung stattfinden? z.B. nach dem Speichern des Datensatzes? dann wäre PostPersistModelEvent Dein Freund

  5. #5
    Contao-Nutzer
    Registriert seit
    07.07.2016.
    Beiträge
    65

    Standard

    Hi Zonky,

    Ja, das habe ich tatsächlich herausgefunden ;-). Hier mal mein bisheriger Lösungsweg. Funktioniert soweit ganz gut.

    PHP-Code:
    use ContaoCommunityAlliance\DcGeneral\Event\PostPersistModelEvent

    return [ 
      
       
    PostPersistModelEvent::NAME => [ 

           function (
    PostPersistModelEvent $event) { 
             if (
    'BE' !== TL_MODE || 'mm_company' !== $event->getEnvironment() 
                     ->
    getDataDefinition() 
                     ->
    getBasicDefinition() 
                     ->
    getDataProvider()) { 
               return; 
             } 

             
    $model $event->getModel();
             
    $companyid $model->getItem()->get('id');
             
    $objMember = \MemberModel::findBy('assoccompany',$companyid);
               
             while(
    $objMember->next()){ 
               if(
    $objMember->groups){
                 
                 
    //Gruppen-Array wird pro Mitglied eingelesen.
                 
    $arrGroup deserialize($objMember->groups);
                 
                 
    //Zu löschende Teilmenge der Mitgliedergruppen-ID bei betreffendem Mitglied (gewisse zugewiesene dürfen nicht gelöscht werden!)
                 
    $delGroup = array(1,3,4);
                 
                 
    //Teilmenge Mitgliedergruppen-ID werden aus Gruppen-Array gelöscht.
                 
    if(is_array($arrGroup)){
                   foreach(
    $delGroup as $delValue){
                     if ((
    $key array_search($delValue$arrGroup)) !== false) {
                       unset(
    $arrGroup[$key]);
                     }
                   }
                 }
                 
                 
    //Mitgliedergruppen-Auswahl des Unternehmens wird eingelesen und 
                 //Gruppen-Array hinzugefügt.
                 
    $selGroup deserialize($model->getItem()->get('membergroup'));
                 
    $arrGroup[] = $selGroup["id"];
                 
                 
    //Gruppen-Array wird beim Mitglied gespeichert.
                 
    $objMember->groups serialize($arrGroup);
                 
    $objMember->save(); 
               }
             }           
           }
       ], 
    ]; 

  6. #6
    Contao-Urgestein Avatar von zonky
    Registriert seit
    19.03.2010.
    Ort
    Berlin, Rdf
    Beiträge
    9.682
    User beschenken
    Wunschliste

    Standard

    ... habe schon schöneren Code gesehen, ist aber o.k ;-)

  7. #7
    Contao-Nutzer
    Registriert seit
    07.07.2016.
    Beiträge
    65

    Standard

    Ha! Bin immer offen für Optimierungsvorschläge. Man will ja lernen...

  8. #8
    Contao-Urgestein Avatar von zonky
    Registriert seit
    19.03.2010.
    Ort
    Berlin, Rdf
    Beiträge
    9.682
    User beschenken
    Wunschliste

    Standard

    ein paar Topics:

    * Editor mit autom. Codeeinrückung verwenden
    * unter C4 als Service aufbauen
    * "Tabellennamen" $event->getEnvironment()->getDataDefinition()->getName()
    * Model $model = $event->getModel();
    * Attributwert holen $model->setProperty('myattribute');
    * alle Werte als Array $items = $model->getItem()->parseValue();
    * setzen $model->setProperty('myattribute', $myAttribute);
    * Factory* $factory = $this->factory;
    * Scope BE* $isBe = $this->scopeDeterminator->currentScopeIsBackend();


    *
    PHP-Code:
        public function __construct (RequestScopeDeterminator $scopeDeterminatorIFactory $factory)
        {
            
    $this->scopeDeterminator $scopeDeterminator;
            
    $this->factory           $factory;
        } 

  9. #9
    Contao-Urgestein Avatar von zonky
    Registriert seit
    19.03.2010.
    Ort
    Berlin, Rdf
    Beiträge
    9.682
    User beschenken
    Wunschliste

    Standard

    btw: das ist der große Vorteil, dass MM den DC_General https://github.com/contao-community-alliance/dc-general einsetzt - der hat eine Vielzahl von Events (like Contao-Hook), die der DC_Table von Contao nicht hat... somit kann man die Daten vor oder nach dem Speichern manipulieren, hat Zugriff auf die orginären als auch auf die überarbeiteten Daten, kann die Paletten bearbeiten u.v.a.m.

Aktive Benutzer

Aktive Benutzer

Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)

Lesezeichen

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •