Ergebnis 1 bis 7 von 7

Thema: 4.9, MetaModels 2.2 - FindByFilter liefert nicht alle Daten

  1. #1
    Contao-Nutzer
    Registriert seit
    11.04.2012.
    Beiträge
    5

    Standard 4.9, MetaModels 2.2 - FindByFilter liefert nicht alle Daten

    Liebe Gemeinde,

    ich bin Neuling in der MetaModels-Welt und muss aktuell Fehlerbehebung in einem Template betreiben.
    Hier kurz die Ausgabngssituation:
    Es gibt ein MetaModel <tiere> welches ein Attribut <geschlecht> enthält. Dieses Attribut ist mit einem weiteren MetaModel verknüft, welches nicht nur "männlich, weiblich" enthält sonder auch die tierart.
    Nutze ich das Standardtemplate zur Ausgabe eines Tieres, wird mit das <geschlecht> richtig ausgegeben.

    Nun muss ich in einem Template das Tier separat abfragen und nutze dazu folgenden Code

    Code:
                        $idlist[] = $tier['id'];
    
                        $factory = \Contao\System::getContainer()->get('metamodels.factory');
                        $model = $factory->getMetaModel(<tabellenname_tiere>);
                        $languages  = $model->getAvailableLanguages();
                        $attribute  = $model->getAttribute('id');
    
                        $availableLang = $model->getLanguages();
                        if (in_array($currentLanguage, $availableLang)) {
                            $model->selectLanguage($currentLanguage);
                        } else {
                            $model->selectLanguage('en');
                        }
    
                        $filter = $model->getEmptyFilter();
                        $filter->addFilterRule(new \MetaModels\Filter\Rules\StaticIdList($idlist));
                        $item = $model->findByFilter($filter);
                        $item_parsed = $item->parseAll('html5', $model->getView(13));
                        $tier_parsed = $item;
    Ein
    Code:
    dump($item_parsed);
    gibt mir zwar ein Objekt mit Daten zurück, jedoch fehlen einige Daten bzw. enthalten den Wert NULL. In diesem Beispiel gender_dog, gender_cat, rasse. Diese Daten haben eins gemeinsam. Sie stehen, wie schon erwähnt, nicht in einer n:1-Beziehung zum Tier sondern eher in einer n:n:1-Beziehung.

    Code:
    ^ array:48 [?
      "id" => "XXXX"
      "pid" => "0"
      "sorting" => "0"
      "tstamp" => "1705524547"
      "rufname" => "Rudi"
      "tier" => array:4 [?]
      "gender_dog" => null
      "gender_cat" => null
      "kastriert" => array:2 [?]
      "rasse" => null
      "geburtsdatum" => "1293914948"
    
    ]
    Kann man den Interfaces von MetaModels mitteilen, wie "tief" die Daten ausgelesen werden sollen, sodass auch die zweite Relationsebene ausgelesen wird?

    Hat jemand ein Codebeispiel für mich?


    Beste Grüße!

    Frank

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

    Standard

    Moin,

    mir scheint, da sind einige Sachen nicht in dem Topf wo sie hin gehören... folgend einige Hinweise:

    Ich glaube, Deine eigene Abfrage ist überflüssig - mach in Deinem Listentemplate eine Debugausgabe wie hier https://metamodels.readthedocs.io/de...templates.html und guck Dir den 'raw'-Knoten des Array eines Items an - über den Weg hast Du Zugriff auf alle Daten eines per Relation (Select/Tags) eingebundenen anderen Models bzw. zu dem Datensatz - eine Begrenzung gibt es da nicht, d.h. wenn Model "Geschlecht" weitere Relationen hat, tauchen die hier auf.

    Was mir komisch vorkommt ist,

    Es gibt ein MetaModel <tiere> welches ein Attribut <geschlecht> enthält. Dieses Attribut ist mit einem weiteren MetaModel verknüft, welches nicht nur "männlich, weiblich" enthält sonder auch die tierart.
    Im Model Geschlecht gibt es Attribut "Name" oder "Typ" für "männlich", "weiblich" UND Attribut "Tierart" wie Hund, Katze, Maus? willst Du dann eine Auswahl bei Model Tiere wie

    Hund - m
    Hund - w
    Katze - m
    Katze - w
    Maus - m
    Maus - w

    haben? Scheint mir unlogisch. Ich hätte weiteres Model "Tierart" angelegt und sowohl Tierart als auch Geschlecht bei Tiere per Relation eingebunden - hmm...

    Thema Beispiel: Vortrag zur CK23

  3. #3
    Contao-Nutzer
    Registriert seit
    11.04.2012.
    Beiträge
    5

    Standard

    Vielen Dank für die schnelle Antwort. Ich kann die Verwunderung nachvollziehen.

    Ich versuche mal zu erklären, was hier vorhanden ist:

    Es gibt 3 Metamodels:

    1. Tierart
    img_mm_pets_animals_overview.jpg

    2. Geschlechter
    img_mm_pets_gender_overview.jpg

    3. Tiere
    img_mm_pets_pets_overview.jpg
    img_mm_pets_pets_detail.jpg

    Im Tier wird je nach ausgewähltem Geschlecht nur die Auswahl der Geschlechter angezeigt, die der jeweiligen Tierart entsprechen. Funzt also irgendiwe.

    Geht man nun nach der Standard-Routine vor um ein Tier in einem Template anzuzeigen, bekommt man ein sauberes Objekt mit den Tierdaten, darunter auch das exakte Geschlecht.
    PHP-Code:
    array:[?
      
    "raw" => array:48 [?
        
    "id" => "16373"
        "pid" 
    => "0"
        "sorting" 
    => "0"
        "tstamp" 
    => "1706639309"
        "rufname" 
    => "Merli"
        "tier" 
    => array:[?]
        
    "gender_dog" => null
        
    "gender_cat" => array:[?
          
    "__SELECT_RAW__" => array:[?]
          
    "name" => "Kater"
          "tier" 
    => "Katze"
        

    Ein anderes Template ruft nicht per se die Tierdaten auf sondern einen Datensatz, an dem eine TierID hängt.
    Lädt man nun diese Tierdaten über den von mir geposteten Code, bekommt man auch ein Objekt zurück, allerdings fehlen hier eben eingie Daten. Sh. oben.

    Geh also mal bitte davon aus, dass ich nicht mit der Standardvariante das Tier anzeige, sondern ein anderes MetaModel im Frontend angezeigt wird, dass nicht alle Tierdaten enthält und ich deshalb nochmal Daten nachfassen muss.

    Wenn es eine Möglichkeit gibt, die Tiefe der auszulesenden Objekte zu erhöhen und ich bekomme mit einem Objekt alle benötigten Daten (wie bei einer jPA), dann nutze ich gern diese Methode. Dann wäre mein Code tatsächlich überflüssig. Aber ich bekomme ins Template nur das folgende Objekt:

    PHP-Code:
    ^ array:[?
      
    => array:[?
        
    "raw" => array:11 [?
          
    "id" => "24"
          "pid" 
    => "0"
          "sorting" 
    => "0"
          "tstamp" 
    => "1696508266"
          "uuid" 
    => "xxxxxxxx"
          "pet" 
    => array:45 [?
            
    "__SELECT_RAW__" => array:48 [?
              
    "id" => "xxxxx87"
              "pid" 
    => "0"
              "sorting" 
    => "0"
              "tstamp" 
    => "1705524547"
              "rufname" 
    => "Rudi"
              "tier" 
    => array:[?
                
    "__SELECT_RAW__" => array:[?
                  
    "id" => "1"
                  "pid" 
    => "0"
                  "sorting" 
    => "0"
                  "tstamp" 
    => "1700220211"
                  "placeholder" 
    => array:[?]
                  
    "icon" => array:[?]
                  
    "name" => array:[?]
                ]
                
    "name" => "Hund"
                "placeholder" 
    => "files/xxx.jpg"
                "icon" 
    => "files/xxx.png"
              
    ]
              
    "gender_dog" => null
              
    "gender_cat" => null
              
    "kastriert" => array:[?] 
    Ich hoffe, das Problem konnte ich eingiermaßen verständlich erklären.

    Fazit: In $this-Ydata ist alles Nötige enthalten, wenn man die Standardfrontendausgabe für das MetaModel benutzt, möchte ich aber selbst aus einem anderen MetaModel in einem Template Daten nachladen, fehlen jene Daten, die zu tief oder zu komplex verknüpft sind.

    Ich wäre für Unterstützung sehr dankbar.

    Beste Grüße!

    Frank

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

    Standard

    Zitat Zitat von digenio Beitrag anzeigen
    Fazit: In $this->data ist alles Nötige enthalten, wenn man die Standardfrontendausgabe für das MetaModel benutzt, möchte ich aber selbst aus einem anderen MetaModel in einem Template Daten nachladen, fehlen jene Daten, die zu tief oder zu komplex verknüpft sind.
    MM verwendet intern auch nichts anderes als die API-Aufrufe - da sollte es aber keinen Unterschied geben...

    Wenn ich mir Deine Screens ansehe, ist der Aufbau bzw. das Ziel weiterhin unklar - meine Empfehlung ist immer: malt Euch die Models mit den Relationen auf ein Blatt Papier oder mit https://www.yworks.com/yed-live/ (kann man als Gist abspeichern)! ... dann ist das für andere meist leichter nachzuvollziehen, wie der Aufbau ist (und oft für einem selbst)

    Das einzige Model, wo ich konform gehe ist "Tierarten" - Tipp: ein (eindeutiger) Alias sollte man immer mit anlegen ... macht dann die Filter-URLs schöner - in Deinem Fall natürlich ein trans. Alias

    Unklar:

    Bei "Geschlecht" ein m:n zu "Tier"??

    Bei "Tier" jeweils (?!?) ein n:1 auf Hund und Katze?


    Aus dem Bauch würde ich das wie folgt aufbauen:

    Tier (unser "Hauptmodel")
    -- 1:n --> Geschlecht (sofern nicht Schnecken und Fische hinzu kommen, sollte m und f reichen**)
    -- 1:n --> Tierart (Hund, Katze, Maus)
    -- 1:n --> Mitglied (Alternativ "Tier" als "Kindtabelle" an Mitglied hängen, dann hättest Du bei den Mitgliedern ein neues Icon und die Liste der Tiere eines MG - Nachteil: Du hast nicht alle Tiere in einer Listenansicht)

    thats all... dürfte bei Tasso nicht anders aussehen ;-)

    **:
    falls doch, könnte man bei Tierart noch eine R zu Geschlecht machen - würde aber bei 1:n bleiben und um Zwitter o.ä. erweitern
    In der Eingabemaske könnte man dann bei Auswahl der Tierart (+ submitOnChange) die Auswahl des möglichen Geschlechts entsprechend eingrenzen - siehe im Handbuch bei "eig. SQL"

  5. #5
    Contao-Nutzer
    Registriert seit
    11.04.2012.
    Beiträge
    5

    Standard

    Vielen Dank für den Denkanstoß.

    Ich habe die Struktur dahingehend umgebaut,
    dass am Tier nur noch ein Geschlecht (1=männlich, 2=weiblich) hängt.
    Außerdem gibt es ein Model, welches Tierart, Geschlecht und die gendergerechte Bezeichnung der Tierart enthält.
    das dient dazu, dass ein weiblicher Hund eben Hündin heißt.

    Wie erzeuge ich nun am Tier ein Attribut, welches in Abhängigkeit von Tierart und Geschlecht
    die geschlechtsspezifische Bezeichnung der Tierart enthält?

    Welchen Attributtyp verwendet man für eine Kindtabelle, bei der 2 Schlüssel ausschlaggebend sind?

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

    Standard

    Zitat Zitat von digenio Beitrag anzeigen
    A: Außerdem gibt es ein Model, welches Tierart, Geschlecht und die gendergerechte Bezeichnung der Tierart enthält.
    das dient dazu, dass ein weiblicher Hund eben Hündin heißt.

    Wie erzeuge ich nun am Tier ein Attribut, welches in Abhängigkeit von Tierart und Geschlecht
    die geschlechtsspezifische Bezeichnung der Tierart enthält?

    B: Welchen Attributtyp verwendet man für eine Kindtabelle, bei der 2 Schlüssel ausschlaggebend sind?

    zu A: hmmm... das ist nicht ganz trivial - zumal es auch mehrere Bezeichnungen für ein Geschlecht geben könnte z. B. Bulle, Ochse, Stier / Wallach, Hengst - wenn man das nur für die FE-Ausgabe benötigt, würde ich probieren das als Multitabe anzulegen - müsste man mal gucken, wie man dann die Auswahl macht - vllt. über ein GetOptionEvent

    Wenn man für m/f immer nur einen Namen hat, dann eben per Multitabelle und einem Select + Eingabefeld oder schmale Variante Tabellen-Attribut und zwei Spalten mit Textfeld. Dann z.B.
    m | Hund
    f | Hündin
    und im Template guckst Du mit dem Geschlechtskürzel aus Geschlecht in der Tabelle, obs einen Eintrag gibt - ansonsten Standardbezeichnung. Dann muss man gar nix in Eingabe machen.


    zu B: Bezeichnung Attribut und Kindtabelle gehört nicht zusammen - bitte die Posts der letzten drei Wochen mal ansehen... bei Attribut gibt es Selct (1:n) und Tags (m:n) - als Sonderform gibt es Kindtabelle was bei der Eingabemaske einzustellen ist (hat DCA-Gründe). Hier haben die Kinder als pid die ID des Eltern-Elements - das ist eher ein "n:1"

    Ergänzung: zudem gibt es noch Varianten und Baumstruuktur - das sind aber Relationen innerhalb einer Tabelle.

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

    Standard

    @digenio hast Du es nun hin bekommen? wenn ja, wie & lass uns an dem Erfolg teilhaben...

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
  •