Ergebnis 1 bis 18 von 18

Thema: Auf Detailseite Liste mit Einträge, die zusammengehören?

  1. #1
    Contao-Nutzer
    Registriert seit
    22.06.2009.
    Ort
    Bremen
    Beiträge
    229

    Standard Auf Detailseite Liste mit Einträge, die zusammengehören?

    Der Titel ist vielleicht blöd geschrieben, aber ich weiß nicht, wie ich das besser ausdrücken soll.

    Ich habe ein (1) MetaModel. Attribute sind u.a.: ObjektNr, BildNr, Alias und Foto. Zu einem Objekt gibt es mehrere Einträge, die sich in der BildNr unterscheiden.

    Der Alias wird gebildet aus ObjektNr und BildNr. Aus ObjektNr 103 und BildNr b wird der Detail-Link "id-103-b.html" gebildet.

    Die Ausgabe der Detailseite funktioniert. Ich möchte unten auf der Detailseite von "103-b" gerne eine Liste aller Einträge haben, die zum Objekt 103 gehören, also 103-a, 103-b, 103-c usw. und wenn ich da draufklicke, möchte ich die entsprechende Detailseite sehen.

    Ich habe es mit einer Liste versucht, aber ich habe gerade keine Idee, wie ich die Liste so filtere, dass immer nur die Einträge der aktuallen ObjektNr angezeigt wird. Kann mir da jemand auf die Sprünge helfen?

    Grüße
    Fryd

  2. #2
    Contao-Nutzer
    Registriert seit
    05.10.2012.
    Beiträge
    213

    Standard

    Mit eigenem SQL wahrscheinlich.

    Muster ähnlich wie aus dem Handbuch im Beispiel "Filterung nach Kind-Elementen eines Eltern-Elements".

    So in die Richtung
    Code:
    SELECT id
    FROM mm_deinmodel
    WHERE ObjektNr = (
      SELECT ObjektNr
      FROM mm_deinmodel
      WHERE
      alias={{param::get?name=auto_item}}
    )

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

    Standard

    es gibt mehrere Möglichkeiten...

    ... eine davon könnte sein...

    So, wie beschrieben, müsste bei Blick in die DB auffallen, dass die Werte für "ObjektNr" mehrfach vorkommen - kann man also in ein eigenes MM raus ziehen und per "Referenz" mit "MM_1" verknüpfen.

    Dann kann man auch alle Items aus MM_1 raus filtern, die zu ObjektNr 103 gehören.

    Zu deiner Detailseite:

    Man könnte zwei MM-Listen-Elemente einbauen
    * a) für die Details vom ObjektNr 103-a
    * b) für die Listenanzeige von allen anderen Objektiven von ObjektNr 103 (außer 103-a)

  4. #4
    Contao-Nutzer
    Registriert seit
    22.06.2009.
    Ort
    Bremen
    Beiträge
    229

    Standard

    Vielen Dank für diese beiden Hinweise.

    Ich habe jetzt erst mal die Lösung mit der SQL-Abfrage gewählt, weil's schneller geht.

    Aber ich denke über die Lösung nach, die Daten, die zum Objekt gehören, in ein separates MM auszulagern. Das scheint die bessere Lösung zu sein.

    Grüße
    Fryd

  5. #5
    Contao-Nutzer
    Registriert seit
    05.10.2012.
    Beiträge
    213

    Standard

    Ja, je nachdem wie deine Datensätze aussehen, könnte das Sinn machen. In Frage kommen ein paar Alternativen, wie zonky schon erwähnt hat:

    1. Auswahl oder Mehrfachauswahl zur Verknüpfung von zwei MMs
    2. Child-Model
    3. Varianten (alles in einem MM)


    Einbinden kannst du es entweder direkt über ein modifiziertes Template für die Einzelansicht oder wie bei dir über eine eigene Liste. Wenn das von Funktion und Design her möglich ist, ist der letztere Weg in der Regel sauberer. Das Sql musst du je nach Alternative u.U. anpassen mit pid oder varbase, falls es nicht mit einem der Standard-Filter zu lösen ist.

  6. #6
    Contao-Nutzer
    Registriert seit
    08.11.2009.
    Beiträge
    191

    Standard

    Hallo,

    ich stehe vor einer ähnlichen Aufgabe, bin mir aber nicht sicher wie ich es konkret lösen kann.
    Habe zwei MetaModels:
    MM1: Autoren (Attribute: Autorname, Biografie, Foto,...)
    MM2: Bücher (Attribute: Autorname, Buchname, Beschreibung,...)

    Es gibt eine Liste mit allen Autoren mit Detaillink.
    Auf der Detailseite wird der Autor mit allen Attributen angezeigt.
    Jetzt möchte ich unterhalb alle Bücher anzeigen die zum Autor gehören.

    Wie im 2. Beitrag beschrieben über eigenem SQL kann ich es wohl nicht machen da die Verbindung zwischen den zwei MetaModels der Autorname ist und nicht der Alias.

    Wie kann ich das sonst realisieren?
    Vielen Dank!

  7. #7
    Contao-Fan
    Registriert seit
    16.05.2014.
    Beiträge
    295

    Standard

    Hab das ziemlich ähnlich auch schon gemacht:
    https://community.contao.org/de/show...Verlagswebsite

    Die Schnelle Methode ist im Template:
    PHP-Code:
    function getBooksOfAuthor($strAlias$format='html5')
    {
      
    $objMetaModel = \MetaModels\Factory::getMetaModel('mm-name'); // Name des Metamodel
      
    $objFilter $objMetaModel->prepareFilter(ID, array()); // falls nen Filter benutzt werden soll die ID eintragen bspw. "Veröffentlicht"
      
    $objFilter->addFilterRule(new \MetaModels\Filter\Rules\SearchAttribute($objMetaModel->getAttribute('author'), $strAlias$objMetaModel->getAvailableLanguages())); // "author" mit dem Attributsnamen ersetzen, den der Autor bei den Büchern hat (da verknüpft vrmutl. ein Select o.ä.)
      
    $objItems $objMetaModel->findByFilter($objFilter,  $strSortBy 'col_name'$intOffset 0$intLimit 3); // falls sortiert oder die Anzahl limitiert (3) werden soll
      
    return $objItems->parseAll($format$objMetaModel->getView(ID)); // hier die ID der Rendereinstellung von den Büchern die benutzt werden soll (vtl. ne eigene Anlegen)

    So oder so ähnlich ist nen bissel her.

    Dann kannst du das so benutzen:
    PHP-Code:
     <?php foreach (getBooksOfAuthor($arrItem['raw']['alias']) as $arrBooks): ?>
     <?php echo $arrBooks['jumpTo']['url']; ?>
    <?php 
    echo $arrBooks[$this->getFormat()]['title']; ?>
    <?php 
    endforeach; ?>
    edit: sollte natürlich alles kopieren
    Ob das nun das geschickteste ist kann ich dirch auch nicht sagen.
    Geändert von Znrl (12.05.2016 um 18:37 Uhr)

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

    Standard

    bitte API-Änderung beachten: byTableName ist "Deprecated" - http://metamodels.readthedocs.io/de/...tory-interface

  9. #9
    Contao-Fan
    Registriert seit
    16.05.2014.
    Beiträge
    295

    Standard

    Hab ja gesagt, dass es schon etwas her war.
    Hab ich das dann richtig korrigiert? Einfach ersetzen und den Namen statt die Tabelle?

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

    Standard

    auf der API-Seite stehen noch ein paar Beispiele - ggf. einfach mal testen ;-)

  11. #11
    Contao-Nutzer
    Registriert seit
    08.11.2009.
    Beiträge
    191

    Standard

    Jetzt nochmal ganz kurz für mich als nicht so versierten Anwender, bekomme nämlich diesen Fehler angezeigt:
    PHP-Code:
    Fatal errorUsing $this when not in object context in /system/modules/metamodels/classes/src/MetaModels/Factory.php on line 107 
    Die Funktion inkl. Ausgabe wird in das Template des MM1 (Autoren) eingefügt?


    // "author" mit dem Attributsnamen ersetzen, den der Autor bei den Büchern hat (da verknüpft vrmutl. ein Select o.ä.)
    Die beiden Metamodels habe keine Verknüpfung an sich, beide Metamodels haben ein Attribut mit dem selben Attribut-Namen "Autor" und hier wieder identische Einträge (Namen). Eine Verknüpfung könnte schwierig werden da es sehr viele Einträge werden die ich direkt in die Datenbank einfügen möchte. Deshalb der Ansatz: schau ob es identische Werte in der MM2, Spalte "Autor" gibt und zeige diese an.

    Hoffe ich bin nicht ganz am Holzweg und mein Vorhaben lässt sich umsetzen...

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

    Standard

    üblicher Weise ist die Relation von Buch zu Autor eine m:n bzw. many-to-many - das findet man in vielen Beispielen und Tutorials

    warum Du statt der Relation eine Art "Suche" machen möchtest, ist mir nicht ganz klar... aber es würde mit dem Vorgehen wie bei "relatet Items" funktionieren - der Filter muss entsprechend Deiner Vorgaben erstellt und gefüttert werden

  13. #13
    Contao-Nutzer
    Registriert seit
    08.11.2009.
    Beiträge
    191

    Standard

    OK ich verstehe was du meinst, vielleicht habe ich einfach zu kompliziert gedacht.

    Habe im MM2 (Bücher) ein Select eingefügt mit Quelltabelle MM1 (Autor) und Werte-Spalte Autor verknüpft.
    Anschließend im MM2 die Autoren zugewiesen.

    Die Funktion ist im Template vom MM1 eingefügt:
    PHP-Code:
    function getBooksOfAuthor($strAlias$format='html5'

      
    $objMetaModel = \MetaModels\Factory::getMetaModel('buecher'); // Name des Metamodel 
      //  $objFilter = $objMetaModel->prepareFilter(ID, array());   auskommentiert da nicht benötigt
      
    $objFilter->addFilterRule(new \MetaModels\Filter\Rules\SearchAttribute($objMetaModel->getAttribute('autor'), $strAlias$objMetaModel->getAvailableLanguages())); // "author" mit dem Attributsnamen ersetzen, den der Autor bei den Büchern hat (da verknüpft vrmutl. ein Select o.ä.) 
      
    $objItems $objMetaModel->findByFilter($objFilter,  $intOffset 0$intLimit 0); // falls sortiert oder die Anzahl limitiert (3) werden soll 
      
    return $objItems->parseAll($format$objMetaModel->getView(5)); // hier die ID der Rendereinstellung von den Büchern die benutzt werden soll (vtl. ne eigene Anlegen) 

    Und darunter die Ausgabe:
    PHP-Code:
    <?php foreach (getBooksOfAuthor($arrItem['raw']['alias']) as $arrBooks): ?> 
    <?php echo $arrBooks[$this->getFormat()]['attributname']; ?> 
    <?php endforeach; ?>
    Leider wird mir immer noch dieser Fehler angezeigt:
    PHP-Code:
    Fatal errorUsing $this when not in object context in /www/htdocs/v125793/cinemaplexx/system/modules/metamodels/classes/src/MetaModels/Factory.php on line 107 

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

    Standard

    zwei Sachen sind mir aufgefallen

    1.) mit dem Select sollte nur ein Autor zuweisbar sein und nicht wie Du schreibst Autoren (plural) - für eine m:n-Relation wäre das Attribut Mehrfachauswahl [tags] die richtige Wahl

    2.)

    PHP-Code:
    ...getMetaModel('buecher'); // Name des Metamodel 
    wird wohl 'mm_buecher' sein müssen

  15. #15
    Contao-Nutzer
    Registriert seit
    08.11.2009.
    Beiträge
    191

    Standard

    Ein andere Ansatz, vielleicht sogar einfacher:

    Hab im MM1 eine Mehrfachauswahl erstellt und die MM2 eingebunden.
    Das Template so bearbeitet:

    PHP-Code:
    <?php $strRendersettings = isset($this->settings)? 'settings' 'view'?>
    <?php 
    if (count($this->data)): ?>

    <?php foreach($this->items->parseAll($this->getFormat(), $this->view) as $arrItem): ?> 
    <div class="item <?php echo $arrItem['class']; ?>"> 
    <p><?php echo $arrItem['text']['autor']; ?></p> 
    </div> 
    <?php endforeach; ?> 
    <?php else: ?> 
    <p class="info"><?php echo $this->noItemsMsg?></p> 
    <?php endif; ?>


    <?php if ($arrItem['raw']['buecher']): ?>
    <?php 
    foreach ($arrItem['raw']['buecher'] as $field=>$data): ?> 
    <div>
    <p><?php echo $data['buchname']; ?></br>
    <?php echo $data['buchbeschreibung']; ?></p> 
    </div>
    <?php endforeach; ?>
    <?php 
    else: ?> 
    <p class="info"><?php echo $this->noItemsMsg?></p> 
    <?php endif; ?>
    Die Ausgabe funktioniert. Wenn kein Buch zugeteilt ist kommt die noItemsMsg.
    Wäre froh wenn jemand kurz drüber schauen könnte, ob soweit richtig. Danke!
    Geändert von Mecintosch (13.05.2016 um 12:57 Uhr)

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

    Standard

    sieht für mich nicht ganz i.O. aus ...

    im Prinzip ist das Template immer

    PHP-Code:
    if count

      
    foreach arrItem

        hier alle Ausgaben der Items
    ...

      endforeach

    else
      
    nix gefunden
    endif 

  17. #17
    Contao-Fan
    Registriert seit
    16.05.2014.
    Beiträge
    295

    Standard

    Solche Sachen über eine Vernüpfung (bzw. eben Pflege im zweiten MM) zu lösen ist immer sinnvoll, weil dadurch zum einen Rechtschreibfehler oder unterschiedliche Schreibweisen verhindert werden.
    Außerdem lässt sich das auch leichter pflegen. Angenommen bspw. ein Name ändert sich (Namensänderung, Künstlername, ...) Dann müsstest du das bei jedem Buch ändern.

    Jetzt frage ich mich gerade ob mittlerweile einfach mehr Details zu verknüpften Metamodels geladen werden, aus irgendeinem Grund war das über die Factory notwendig... man sollte sich halt doch Comments dazu schreiben.^^

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

    Standard

    Zitat Zitat von Znrl Beitrag anzeigen
    Jetzt frage ich mich gerade ob mittlerweile einfach mehr Details zu verknüpften Metamodels geladen werden
    seit (gefühlt) MM core-alpha8 oder 9 werden mehr Infos zu den referenzierten MMs mitgeliefert - siehe "Debugausgabe" aus Handbuch

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
  •