Contao-Camp 2024
Ergebnis 1 bis 8 von 8

Thema: Feld mit einer Select (1:1) Relation per MM API füllen

  1. #1
    Contao-Nutzer
    Registriert seit
    03.10.2020.
    Beiträge
    41

    Standard Feld mit einer Select (1:1) Relation per MM API füllen

    Ich habe mit Metamodels 2.3 eine Tabelle mm_dz_mem_member angelegt.
    Diese hat eine 1:1 Relation (Select) zur tl_member.
    Ziel ist es in dieser Tabelle zusätzliche Informationen zu einem neuen User bei der Aktivierung zu speichern.
    Dazu verwende ich den Hook activateAccount.

    Einen neuen Datensatz bei der Aktivierung des Accounts anzulegen funktioniert.
    Einträge in verschiedene Felder auch.
    Was mir leider nicht gelingt ist die Relation in das Feld id_member zu speichern.
    Ein Tipp wo der Fehler liegt wäre sehr hilfreich.

    Code:
    <?php
    // src/EventListener/MMSchreiben.php
    namespace App\EventListener;
    
    use Contao\CoreBundle\ServiceAnnotation\Hook;
    use Contao\Module;
    use Contao\MemberModel;
    
    // notwwendig fürs logging
    use Contao\CoreBundle\Monolog\ContaoContext;
    use Contao\CoreBundle\Monolog\SystemLogger;
    use Psr\Log\LogLevel; 
    use \Contao\System;
    
    /**
     * @Hook("activateAccount")
     */
    class MMSchreiben
    {
        public function __invoke(MemberModel $member, Module $module): void
        {
            // Name der MetaModel
            $modelName = 'mm_dz_mem_member';
    		$modelNewField = 'id_member';
    		// ID des aktivierten Useraccounts
            $memberId = $member->id;
    
            $factory = \Contao\System::getContainer()->get('metamodels.factory');
            $model = $factory->getMetaModel($modelName);
            $model2 = $factory->getMetaModel($modelName2);
            
            $ObjItem = new \MetaModels\Item($model, array()); 
            $ObjItem->set('pid', $memberId);
            $ObjItem->set('alias', $memberId); 
            $ObjItem->set('published', '1');
            $memberIdAttribute = $model->getAttribute('id_member'); 
            $memberIdValue = $memberIdAttribute->widgetToValue($memberId, 'id_member'); 
            $ObjItem->set('id_member', $memberIdValue);
            $ObjItem->save();  
    
            \System::getContainer()
            ->get('monolog.logger.contao')
            ->log(LogLevel::INFO, 'ActivateAccount: modelName=' . $modelName . ' - memberId=' . $memberId, array(
            'contao' => new ContaoContext(__CLASS__.'::'.__FUNCTION__, TL_GENERAL
            )));
        }
    }

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

    Standard

    Moin,

    das sieht eigentlich schon ganz gut aus... verschiedene Sachen als Anmerkung:

    * Select erzeugt per se ein 1:n
    * für was ist "$model2" ?
    * warum "$ObjItem->set('pid', $memberId);"? das würde man machen, wenn Du die Tabelle als Kindtabelle anlegst - dann wiederum bräuchtest Du das Attribut Select nicht... Kindtabelle ist eher dafür gedacht, mehrere Datensätze für das Mitglied abzuspeichern z. B. alle seine Briefmarken oder Autos oder Schwimmabzeichen oder Urlaubsreisen...
    * du musst bei widgetToValue den Wert zum Speichern verwenden, den Du beim Attribut als "Alias" ausgewählt hast - wenn das id ist, o.k. - wenn das username ist, dann das verwenden...
    * ändere mal zu "$memberIdValue = $memberIdAttribute->widgetToValue($memberId, 0);" - https://github.com/MetaModels/core/b...ibute.php#L183 ... die ID wird bei Select nicht benötigt https://github.com/MetaModels/attrib...elect.php#L270
    * "... speichern geht nicht" => kommt eine Fehlermeldung? wie sieht Dein $ObjItem nach dem set() aus?

    btw: einfache Felder wie Text, Longtext, Dezimal, Numeric, Datetime brauchen nicht unbedingt eine Umwandlung per widgetToValue - nur "komplexe Attribute" wie Select, Tags, File...

  3. #3
    Contao-Nutzer
    Registriert seit
    03.10.2020.
    Beiträge
    41

    Standard

    "$model2" war eine Altlast ohne Sinn, habe ich entfernt.
    "$ObjItem->set('pid', $memberId);" - das war einmal als Kindtabelle angelegt. Da hatte es auch funktioniert. Habe ich aber inzwischen auf die Select Relation umgestellt.
    Die Alias-Spalte beim Attribut id_member ist username.

    Aber egal ob isch
    "$memberIdValue = $memberIdAttribute->widgetToValue($memberId, 0);"
    oder
    $memberIdValue = $memberIdAttribute->widgetToValue($memberId, 'username');
    verwende.
    Der Datensatz wird angelegt. Der Eintrag für published wird geschrieben.
    Nur der Eintrag in id_member bleibt leer.
    Fehlermeldung gibt es keine.

    Wie kann ich mir $ObjItem anzeigen lassen?
    Ins log bekomme ich es als array nicht, im Debug Modus bekomme ich es auch nicht angezeigt.
    Geändert von stu (06.02.2023 um 13:28 Uhr)

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

    Standard

    Zitat Zitat von stu Beitrag anzeigen
    Wie kann ich mir $ObjItem anzeigen lassen?
    PHP-Code:
    // Vorher Debug-Modus einschalten!
    dump($ObjItem); 
    ... du musst Stück-für-Stück Deinen Code debuggen...
    * was steht in $memberId ?
    * wie sind die Einstellungen des Attributs Select? was ist als Alias ausgewählt?
    * funktioniert es wenn du im Quelltext den Member fest einträgst?

    Im Entgültigen Code sollten dann auch noch ein paar Prüfungen rein wie z. B.
    * ist $memberId gefüllt
    * ist Item mit gleicher ID schon vorhanden? (unique)

    usw.

  5. #5
    Contao-Nutzer
    Registriert seit
    03.10.2020.
    Beiträge
    41

    Standard

    In $memberId steht nur die ID des Mitglieds, z. B. 70
    Was sollte den darin stehen? Der Username oder das ganze Array aus der tl_member?

    Für $memberIdAttribute erhalte ich
    Code:
    #arrData: array:15 [?
        "id" => 69
        "pid" => 16
        "tstamp" => 1675683333
        "name" => "id_member"
        "description" => "1:n Relation zu tl_member"
        "type" => "select"
        "colname" => "id_member"
        "isvariant" => ""
        "select_table" => "tl_member"
        "select_column" => "id"
        "select_alias" => "username"
        "select_sorting" => "lastname"
        "select_sort" => "asc"
        "select_id" => "id"
        "select_where" => null

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

    Standard

    siehe #2 das vierte Sternchen...

    * du musst bei widgetToValue den Wert zum Speichern verwenden, den Du beim Attribut als "Alias" ausgewählt hast - wenn das id ist, o.k. - wenn das username ist, dann das verwenden...
    PHP-Code:
    ...
    $memberIdValue $memberIdAttribute->widgetToValue($member->username0);
    ... 

  7. #7
    Contao-Nutzer
    Registriert seit
    03.10.2020.
    Beiträge
    41

    Standard

    Danke, es ist der username.
    So funktioniert das nun.

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

    Standard

    wie Du hier #5 gesehen hast, kannst Du die Einstellungen des Attributes abfragen - damit kann man die Tabellenspalte aus tl_member dynamisch bestimmen... falls mal jemand am Attribut schraubt ;-)

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
  •