Ergebnis 1 bis 8 von 8

Thema: Abfrage von Attributwert über Item Interface schlägt fehl.

  1. #1
    Contao-Nutzer
    Registriert seit
    20.04.2011.
    Beiträge
    43

    Standard Abfrage von Attributwert über Item Interface schlägt fehl.

    Guten Abend

    Ich stecke gerade an einem dummen Problem fest. Folgende Situation:

    Ich habe in MM 2.4 das Model "mm_company" erstellt. Das hat das Attribut "member_group" und bezieht sich auf die Mitgliedergruppen, die man auch den Mitgliedern (Personen) zuweisen kann.

    Im Mitgliedermodul kann ich Personen die ID von "mm_company" zuweisen. Sie werden somit zu Kontaktpersonen des Unternehmens. Sobald das gespeichert wird, sollen die Mitgliedergruppen der Kontaktperson die Mitgliedergruppe (member_group) des zugeordneten Unternehmens via onsubmit_callback übernehmenf. Member_group ist nur ein Integer-Wert, da ein Unternehmen nur einer Gruppe zugeordnet werden kann. Die Person hingegen kann aber noch weitere Mitgliedergruppen haben.

    Zu diesem Zweck lese ich über eine Funktion zuerst die Mitgliedergruppen vom Mitglied in das Array "arrGroup" eine und entferne zunächst die relevanten Gruppen. In einem nächsten Schritt wird die Mitgliedergruppe des Unternehmens dann in das Array eingefügt. Und am Ende folgt dann ein Update an die DB.

    Das klappt alles bis zu dem Punkt, wo ich "member_group" vom MetaModel abfragen und im Array dann ergänzen möchte. Ich habe Mühe mit dem Debugging, da es ja im Backend-Modul ausgelöst wird.

    Hier der relevante Auszug. onsubmit_callback, $company_id, $dc->id funktionieren alle korrekt. Daran kann es nicht liegen. Auch das Update an die DB wird ausgelöst, halt ohne den richtigen Wert.

    PHP-Code:
    use MetaModels\Attribute\IAttribute;
    use 
    MetaModels\Filter\IFilter;
    use 
    MetaModels\Render\Setting\ICollection;

    ...

    if(
    $company_id):
      
    $factory = \Contao\System::getContainer()->get('metamodels.factory');
      
    $model   $factory->getMetaModel("mm_company");            
      
    $items   $model->findById($company_id);
      foreach (
    $items as $item):
        
    $arrGroup[] = $item->get('member_group');
      endforeach;
    endif; 

    $this->Database->prepare("UPDATE tl_member SET groups=? WHERE id=?")
                   ->
    execute(serialize($arrGroup) , $dc->id); 
    Was hab ich falsch gemacht? Hat mir da jemand einen Tipp?
    Geändert von Daniel Eicher (25.04.2025 um 06:43 Uhr)

  2. #2
    Wandelndes Contao-Lexikon Avatar von zonky
    Registriert seit
    19.03.2010.
    Ort
    Berlin, Rdf
    Beiträge
    10.180
    User beschenken
    Wunschliste

    Standard

    Zitat Zitat von Daniel Eicher Beitrag anzeigen
    Im Mitgliedermodul kann ich die ID von einem Unternehmen in "mm_company" zuweisen. Sobald das gespeichert wird, sollen die Mitgliedergruppen des Mitgliedes (Privatperson) vom Attribut "member_group" des zugeordneten Unternehmens in "mm_company" via onsubmit_callback überschrieben werden. Das ist nur ein Integer-Wert, da ein Unternehmen nur einer Gruppe zugeordnet werden kann. Die Person hingegen kann natürlich noch weitere Gruppen haben.
    Uff... ich hab das bestimmt fünf, sechs mal durchgelesen und kapiere es nicht

    Du hast in mm_company eine Relation (Einzelauswahl) auf tl_member_groups - o.k. ... dann in tl_member hast Du eine Relation (Einzelauswahl) auf ein Unternehmen und willst beim Speichern des Mitgliedes das die Mitgliedergruppe des Unternehmens beim Mitglied gespeichert wird?

    ... oder soll doch was ganz anderes passieren?

    Kleiner Hinweis:

    * die MM-Factory kannst Du in Deinem Eventlistener über den Constructor injecten (siehe Vortrag CK23) - ggf. hilfreich den ganzen Code mal zu sehen
    * üblicher Weise wird außer in den HTML-Templates im PHP-Code mit Klammern gearbeitet
    * mit "dump($variable);" solltest Du eine Ausgabe erhalten - ggf. SToolbar in eigenem Tab aufmachen und bei "Last 10" nach dem passenden Request gucken - die "harte Tour" wäre mit "dd($variable);"
    * da Du die Member-ID hast, würde ich eher den Member über das Model holen und die Sachen dann mit "$member->save()" speicher statt mit dem Query

  3. #3
    Contao-Nutzer
    Registriert seit
    20.04.2011.
    Beiträge
    43

    Standard

    Hi Zonky

    Also, für das, dass du es angeblich nicht kapiert hast, hast du es aber korrekt zusammengefasst! Aber ich seh das Problem in meiner Beschreibung. Habe sie angepasst.

    Hintergrund: Die Mitglieder können Privatpersonen oder Kontaktpersonen von Unternehmen sein. Es kann sein, dass die Person bereits besteht, mit eigenen Rechten, das Unternehmen danach via Einzelauswahl dann zugewiesen wird. Die Rechte des Unternehmens überschreiben beim Speichern gewisse Gruppen der Kontaktperson(en), wenn diese im Widerspruch sind (z.B. hat man als Kontaktperson dann nicht mehr die Rechte einer Privatperson).

    Also, das ganze Konstrukt funktionierte mit MM 2.1 tatsächlich, mit 2.4 aber nicht mehr.

    Danke dir für die Hinweise. Werde ich heute Abend mal prüfen! Das mit den fehlenden Klammern ist ein temporärer Zustand, zwecks besserer Übersicht.
    Geändert von Daniel Eicher (25.04.2025 um 11:38 Uhr)

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

    Standard

    Zitat Zitat von Daniel Eicher Beitrag anzeigen
    Das mit den fehlenden Klammern ist ein temporärer Zustand, zwecks besserer Übersicht.
    ... ich finde die "klassische Schreibweise" übersichtlicher - aber kann ja jeder machen, wie er möchte...

    Am grundlegenden Aufbau der MM-API hat sich in der 2.x-er Reihe von MM nichts geändert - darf ja auch lt. SemVer nicht.

    ... ggf. kommt man der Sache auf die Spur, wenn man den kompletten Quelltext des Listeners sieht

    mit

    PHP-Code:
    $arrGroup[] = $item->get('member_group'); 
    fügst Du die "company-group" nur hinzu - wo kommt $arrGroup ursprünglich her und wo sind die Conditions für Deine vorgegebenen Regeln?

    statt mit

    PHP-Code:
    $model->findById($company_id
    empfehle ich einen Aufbau mit der MM-API - also mit StaticIdList als Filterregel und findByFilter

    ... und im Zweifel muss man eben mal debuggen

  5. #5
    Contao-Nutzer
    Registriert seit
    20.04.2011.
    Beiträge
    43

    Standard

    Hey Zonky

    Hier noch meine Rückmeldung: Die zwei Anpassungen waren offenbar entscheidend. Funktioniert nun so wie gewünscht! Danke dir für den Hinweis!

    Zu deiner Frage:
    1. Ich lese die Mitgliedergruppen des ausgewählten Mitgliedes in $arrGroup ein.
    2. Lösche dann die Gruppen, die evtl. durch die Unternehmensuordnung nicht mehr gültig sein dürfen.
    3. Dann füge ich die korrekte Mitgliedergruppe, welche ich dem Unternehmen bereits zugeordnet habe, $arrGroup zu.


    Ist etwas schwierig zu erklären. Aber es gibt insgesamt 6 Mitgliedergruppen und Unternehmen können in drei davon sein.

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

    Standard

    Zitat Zitat von Daniel Eicher Beitrag anzeigen
    Hier noch meine Rückmeldung: Die zwei Anpassungen waren offenbar entscheidend.
    ... welche beiden?!?

  7. #7
    Contao-Nutzer
    Registriert seit
    20.04.2011.
    Beiträge
    43

    Standard

    Zitat Zitat von zonky Beitrag anzeigen
    ... welche beiden?!?
    Verwendung von StaticIdList als Filterregel und findByFilter.

  8. #8

Aktive Benutzer

Aktive Benutzer

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

Berechtigungen

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