2 Kataloge referenzieren - GELÖST

Einklappen
X
 
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge
  • okapi
    Contao-Fan
    • 03.09.2009
    • 251

    #1

    2 Kataloge referenzieren - GELÖST

    Hallo,
    da ich mit der Referenzierung von zwei Katalogen trotz Tutorials nicht klarkomme, bitte ich euch um Hilfe.

    Ich habe 2 Kataloge, einen Katalog mit "Komponisten" und einen mit "Werken".

    Die Felder von "Komponisten" (stark vereinfacht):
    • Name des Komponisten
    • Persönliche Daten des Komponisten


    Die Felder von "Werke" (stark vereinfacht):
    • Titel des Werkes
    • Daten des Werkes
    • Komponist des Werkes


    Was ich erreichen will:
    Wenn ein Komponist ausgewählt wird, sollen sowohl die Felder aus dem Katalog "Komponisten" angezeigt werden, als auch Titel und Daten der Werke, die er geschrieben hat.

    Ich habe zwar mit Hilfe eines Tags-Feldes geschafft, dass die Werke des Komponisten bei der Eingabe aus dem Katalog Werke ausgewählt werden können. Nun kann man das Tag-Feld in Listen- und Leser-Ansicht ausgeben lassen. Was ich aber will, ist die Ausgabe des gesamten Datensatzes eines Werkes, das der Komponist geschrieben hat, nicht bloß eines Feldes.

    Geht sowas mit dem Modul "Katalog Referenz"?
    Wie müssen Referenzfelder aus zwei verschiedenen Katalogen beschaffen sein, dass sie sich referenzieren lassen?
    Oder ist das überhaupt der falsche Weg?

    Ich sitze seit Stunden an dieser wohl recht einfachen Aufgabe, und schaff das nicht.

    Gruß
    Michael
    Zuletzt geändert von okapi; 18.01.2010, 13:04. Grund: Dank toller Hilfe von MacKP gelöst
  • MacKP
    Contao-Yoda
    • 15.06.2009
    • 13315

    #2
    Hallo okapi,
    das geht nicht mit Referenz, das ist wieder für etwas anderes.
    Du wirst ein eigenes Template schreiben müssen, damit diese Informationen ausgegeben werden.
    Mittels
    Code:
      <?php print_r($this->entries); ?>
    Kann man schauen was wie zur Verfügung steht...

    Und ohne solche Ausgaben ist es echt kaum möglich zu helfen (am besten innerhalb einer live-Seite).

    Hier mal ein Anfang von einem Setting was so ähnlich war:

    Code:
    <?php if ($data['ref']): ?>
    	<div class="reference">
    
    <?php foreach ($data['ref'] as $id=>$ref): ?>
    		
    		<div class="beschreibung_buch"><?php echo $ref['beschreibung_buch'] ?></div>
    <?php endforeach; ?>
    	</div>
    <?php endif; ?>
    Hoffe das Hilft schon mal weiter.

    Viele Grüße
    Contao Pool | C-C-A | MetaModels | [Internetseite -> Mediendepot Ruhr]
    [Arbeitet bei -> Paus Design & Medien]
    "I can EXPLAIN it to you, but I can't UNDERSTAND it for you."

    Kommentar

    • okapi
      Contao-Fan
      • 03.09.2009
      • 251

      #3
      Hallo MacKP,

      supernett von dir, dass du so schnell antwortest! Ich muss nächste Woche Bescheid geben, ob ich zu einem Projekt ja sage, wo eine kleine Datenbank übernommen werden muss, und die catalog-Erweiterung ist völlig neu für mich...

      Dass eine Abfrage aus zwei Katalogen mit templates zu verwirklichen ist, ist ein wertvoller Hinweis! Danke!
      Nur fehlt mir das Verständnis für die Syntax der Abfrage:
      Wie verknüpfe ich zwei Kataloge mit den gemeinsamen Feldern "Name des Komponisten" aus Tabelle "Komponisten" und "Name des Komponisten" in der Tabelle "Werke" - und führe dann eine tabellenübergreifende Abfrage durch?

      Das ist etwas Grundlegendes, das sicher auch andere catalog-newbies wie mich interessiert. Ich schreibe gern ein Tutorial dazu, wenn ich's einmal verstanden habe.

      Ich habe eine Live-Testinstallation... Wenn du Zeit hättest einen Blick auf die Kataloge zu werfen...? (PM)

      Gruß
      Michael
      Zuletzt geändert von okapi; 17.01.2010, 18:00.

      Kommentar

      • MacKP
        Contao-Yoda
        • 15.06.2009
        • 13315

        #4
        Versuchen wir es erst mal schnell hier.
        Das ist an sich erst mal nicht so schwierig. Das schwierigste ist eigentlich wie immer beim catalog das Template dann später.

        Die Felder von "Komponisten" (stark vereinfacht):
        * Name des Komponisten
        * Persönliche Daten des Komponisten
        Feld um Werke auszuwählen

        Die Felder von "Werke" (stark vereinfacht):
        * Titel des Werkes
        * Daten des Werkes
        * Komponist des Werkes

        DAs Feld um die Werke auszuwählen sollte bei dir ein Feld vom Typ 'Tag' sein (das ist dann ne Mehrfachauswahl, sonst würde auch Select gehen bei einer einzigen Möglichkeit).
        Bei Tag wählst du dann als Tabelle die Tabelle aus, die du bei Werke angelegt hast.
        Dort dann den Namen als Spalte.
        Das sollte es im groben schon gewesen sein.

        Mach das erst einmal und dann können wir weiter schauen, falls du dann noch Hilfe benötigst.

        Viele Grüße
        Contao Pool | C-C-A | MetaModels | [Internetseite -> Mediendepot Ruhr]
        [Arbeitet bei -> Paus Design & Medien]
        "I can EXPLAIN it to you, but I can't UNDERSTAND it for you."

        Kommentar

        • okapi
          Contao-Fan
          • 03.09.2009
          • 251

          #5
          Vielen Dank für die Hilfe, MacKP!
          Die von dir vorgeschlagenen Struktur hatte ich schon angelegt, und die Abfrage ergab auch in der List- und Readeransicht die zum jeweiligen Komponisten gehörenden Werke.
          Allerdings möchte ich, dass die kompletten Datensätze der jeweiligen Werke ausgegeben werden, und nicht nur ein Feld davon.

          Gruß
          Michael
          Angehängte Dateien

          Kommentar

          • MacKP
            Contao-Yoda
            • 15.06.2009
            • 13315

            #6
            Ok, das ist schon mal gut.
            Dann bearbeite mal das Template und gib da das hier ein -> <?php print_r($this->entries); ?>

            Damit können wir sehen was alles zur Verfügung steht. Und das können wir dann auch bearbeiten.

            Viele Grüße
            Contao Pool | C-C-A | MetaModels | [Internetseite -> Mediendepot Ruhr]
            [Arbeitet bei -> Paus Design & Medien]
            "I can EXPLAIN it to you, but I can't UNDERSTAND it for you."

            Kommentar

            • okapi
              Contao-Fan
              • 03.09.2009
              • 251

              #7
              Guten Morgen, und nochmals danke für deine Hilfe,

              ich habe jetzt nach deinen Anweisungen catalog_simple.tpl bearbeitet, indem ich
              PHP-Code:
              <?php print_r($this->entries); ?>
              hineingeschrieben habe. Wenn ich nun im Frontend einen Komponisten filtere, erhalte ich folgende, alchimistisch anmutende
              Frontend-Ausgabe:

              Array ( [0] => Array ( [id] => 4 [catalog_name] => Catalog Komponisten [parentJumpTo] => 0 [tablename] => cat_komponisten [class] => first last even [link] => View the item details [url] => katalog-reader/items/kummer-harald.html [data] => Array ( [name] => Array ( [label] => Name [type] => text [raw] => Kummer Harald [value] => Kummer Harald ) [wohnort] => Array ( [label] => Wohnort [type] => text [raw] => Wien [value] => Wien ) [hauptinstrument] => Array ( [label] => Hauptinstrument [type] => text [raw] => Gitarre [value] => Gitarre ) [tag_werke] => Array ( [label] => Werke [type] => tags [raw] => 8,4,1 [value] => Kurzes Stück für Gitarre, Nachtlied, Lied der Nachtigal [ref] => Array ( [1] => Array ( [id] => 8 [pid] => 1 [sorting] => 256 [tstamp] => 1263785626 [titel] => Kurzes Stück für Gitarre [alias] => kurzes-stueck-fuer-gitarre [instrument] => Gitarre [komponist] => Harald Kummer [sammelmappe] => 4 [parentJumpTo] => 29 [parentLink] => View the item details [parentUrl] => katalog-reader/items/kurzes-stueck-fuer-gitarre.html ) [3] => Array ( [id] => 4 [pid] => 1 [sorting] => 768 [tstamp] => 1263722108 [titel] => Nachtlied [alias] => nachtlied [instrument] => Gitarre [komponist] => Harald Kummer [sammelmappe] => 5 [parentJumpTo] => 29 [parentLink] => View the item details [parentUrl] => katalog-reader/items/nachtlied.html ) [5] => Array ( [id] => 1 [pid] => 1 [sorting] => 1152 [tstamp] => 1263722094 [titel] => Lied der Nachtigal [alias] => lied-der-nachtigal [instrument] => Oboe [komponist] => Harald Kummer [sammelmappe] => 3 [parentJumpTo] => 29 [parentLink] => View the item details [parentUrl] => katalog-reader/items/lied-der-nachtigal.html ) ) ) ) ) )

              Hier sehe ich jetzt auch die Details der Datensätze aus der Tabelle "Werke"... aber wie können sie angezeigt werden?

              Gruß
              Michael

              Kommentar

              • MacKP
                Contao-Yoda
                • 15.06.2009
                • 13315

                #8
                Hallo okapi,
                dann schauen wir mal weiter.
                Ich seh auf deiner Seite irgendwie nur die Liste oder?
                Wenn ich auf 'Item Details' klicke seh ich da nix.

                Der Catalog an sich ist so aufgebaut, wie alle Module in TL. Zum Beispiel News. Erst die Liste und dann der Reader. Kannst du schön in der Online Demo sehen oder in deiner Testinstall. Wichtig ist immer die Weiterleitungsseite.

                Wäre besser, wenn du das in nen Leser einbaust mit catalog_full.tpl.
                Das kannst du dann schön bearbeiten.

                Zum Erstellen von einem Eigenen Template:

                1.
                Code:
                  <?php print_r($this->entries); ?>
                Das kann man sich dann am besten im Quelltext anschauen, dann ist das sortierter. Oder mit <pre> umgeben, dann hat man es auf dem Bildschirm genau so.

                2.
                Innerhalb der foreach:
                Code:
                <?php foreach ($this->entries as $entry):
                geht es nun weiter:

                Ich mache mir in der Regel imer ein ganz individuelles Template in dem ich auch alle Einträge Einzeln ausgeben lasse:

                Code:
                <?php if($entry['data']['immo_swimmingpool']['value']):?>
                   <?php echo $entry['data']['immo_swimmingpool']['value']; ?>
                 <?php else: ?>-
                <?php endif;?>
                D.h. wenn ne Angabe für Swimmingpool da ist soll der die Ausgeben, wenn nicht nur nen Strich machen.
                Für dein Beispiel wäre das dann:
                Code:
                <?php if($entry['data']['name']['value']):?>
                   <?php echo $entry['data']['name']['value']; ?>
                   <?php else: ?>-
                <?php endif;?>
                So etwas dann zum Beispiel für den Namen.
                So gebe ich mir nach und nach an der Passenden Stelle das aus was ich haben möchte.

                3. Nun kommen wir zu dem 2. catalog der im 1. catalog drinn ist:

                Um da an alle Werte genau so einfach zu kommen wie beim 1. muss man das ganze erst einmal wieder in ein foreach packen:

                Code:
                <?php if ($data['ref']): ?>
                	<div class="reference">
                             <?php foreach ($data['ref'] as $id=>$ref): ?>
                		  <div class="beschreibung_buch"><?php echo $ref['beschreibung_buch'] ?></div>
                                  </div>
                             <?php endforeach; ?>
                          </div>
                <?php endif; ?>
                Hier jetzt aus einem anderen Catalog von mir. Da ist alles in dem Array 'ref' drinn. und das Array schnapp ich mir und gebe das in die Variable $ref. Dadruch komme ich dannn an die Werte.

                Für deinen Fall geht das dann genau so:
                Code:
                <?php if ($data['ref']): ?>
                	<div class="werke">
                            <?php foreach ($data['ref'] as $id=>$werke): ?>
                		<div class="titel"><?php echo $werke['titel'] ?></div>
                                <div class="instrument"><?php echo $werke['instrument'] ?></div>
                            <?php endforeach; ?>
                        </div>
                <?php endif; ?>
                Und so weiter....

                So für mehr habe ich gerade keine Zeit.
                Probier das mal aus und gib Bescheid wie es geklappt hat.

                Viele Grüße
                Zuletzt geändert von MacKP; 18.01.2010, 09:16.
                Contao Pool | C-C-A | MetaModels | [Internetseite -> Mediendepot Ruhr]
                [Arbeitet bei -> Paus Design & Medien]
                "I can EXPLAIN it to you, but I can't UNDERSTAND it for you."

                Kommentar

                • okapi
                  Contao-Fan
                  • 03.09.2009
                  • 251

                  #9
                  Ein super Lehrstück! Vielen Dank! Jetzt werden die Dinge endlich klarer für mich.
                  Die selbst erstellten Abfragen aus dem ersten Katalog funtionieren schon mal wunderbar,
                  die aus den zweiten Katalog krieg ich allerdings noch nicht hin.

                  Wenn ich diesen Code einfüge:
                  PHP-Code:
                  <?php if ($data['ref']): ?>
                      <div class="werke">
                              <?php foreach ($data['ref'] as $id=>$werke): ?>
                          <div class="titel"><?php echo $werke['titel'] ?></div>
                                  <div class="instrument"><?php echo $werke['instrument'] ?></div>
                              <?php endforeach; ?>
                          </div>
                  <?php endif; ?>
                  wird nichts ausgegeben. Fehlt da noch irgendwas?
                  Was ist die Variable $werke? Ist das der Tabellenname? Dann müsste ich das in $cat_werke ändern.
                  Das ergibt aber trotzdem keine Ausgabe.

                  Gruß
                  Michael
                  Zuletzt geändert von okapi; 18.01.2010, 10:31.

                  Kommentar

                  • MacKP
                    Contao-Yoda
                    • 15.06.2009
                    • 13315

                    #10
                    Hallo okapi,
                    $werke wird selbst erstellt in dem foreach. Hat also erst mal nix zu tun mit dem Tabellennamen.

                    Diese ganze foreach muss natürlich in die 1. foreach rein (falls du das unten drunter gemacht hast).

                    Wäre nicht schlecht wenn du mal dein bisheriges Template pasten könntest.

                    Wenns immer noch nicht klappt muss ich noch mal in mich gehen und überlegen ;-)

                    Viele Grüße
                    Contao Pool | C-C-A | MetaModels | [Internetseite -> Mediendepot Ruhr]
                    [Arbeitet bei -> Paus Design & Medien]
                    "I can EXPLAIN it to you, but I can't UNDERSTAND it for you."

                    Kommentar

                    • okapi
                      Contao-Fan
                      • 03.09.2009
                      • 251

                      #11
                      Wow... es hat endlich geklappt!
                      Die Abfrage für den 2. Katalog muss auch noch "verpackt" werden, dann klappt es:

                      PHP-Code:
                      <?php if (count($this->entries)): ?>
                      <?php foreach ($this->entries as $entry): ?>
                      
                      <?php if ($data['ref']): ?>
                          <div class="cat_werke">
                                  <?php foreach ($data['ref'] as $id=>$cat_werke): ?>
                              <div class="titel"><?php echo $cat_werke['titel'] ?></div>
                                      <div class="instrument"><?php echo $cat_werke['instrument'] ?></div>
                                  <?php endforeach; ?>
                              </div>
                      <?php endif; ?>
                      
                      <?php endforeach; ?>
                      <?php endif; ?>
                      Herzlichen Dank für deine so ausführliche Hilfe! Du hast meinen Tag gerettet!

                      Viele Grüße
                      Michael

                      Kommentar

                      • MacKP
                        Contao-Yoda
                        • 15.06.2009
                        • 13315

                        #12
                        Hallo okapi,
                        na, so ist das doch wunderbar.

                        Hoffe das hilft dir und anderen für die Zukunft mehr als wenn ich das mal eben schnell bei dir gemacht hätte ;-)

                        Jetzt noch zu einem kleinen Nachteil vom catalog:
                        Man kann leider nicht mehr zurück verlinken von dem 2. auf den 1. catalog.
                        Der Grund ist einfach aber fatal: man könnte sich damit ganz schnell ins Knie schießen in dem man eine Endlosschleife erhält.
                        Das nur im Hinterkopf behalten beim Design des catalogs und der Seitenstruktur etc. ;-)

                        Viele Grüße und weiterhin viel spaß mit dem Catalog
                        Contao Pool | C-C-A | MetaModels | [Internetseite -> Mediendepot Ruhr]
                        [Arbeitet bei -> Paus Design & Medien]
                        "I can EXPLAIN it to you, but I can't UNDERSTAND it for you."

                        Kommentar

                        • okapi
                          Contao-Fan
                          • 03.09.2009
                          • 251

                          #13
                          Du hast mir wirklich super geholfen!

                          Nur bin ich doch noch zu ungeschickt... hab gerade eine Kleinigkeit verändert und schon geht's nicht mehr

                          PHP-Code:
                          <?php if (count($this->entries)): ?>
                          
                          <div class="layout_simple">
                          <?php foreach ($this->entries as $entry): ?>
                          
                          +++ Komponisten-Abfragen start +++
                          <br/><br/>
                          <?php if($entry['data']['name']['value']):?><?php echo $entry['data']['name']['value']; ?><?php else: ?>-<?php endif;?>
                          <br/><br/>
                          <?php if($entry['data']['wohnort']['value']):?><?php echo $entry['data']['wohnort']['value']; ?><?php else: ?>-<?php endif;?>
                          <br/><br/>
                          +++ Komponisten-Abfragen stop +++
                          <br/><br/>
                          +++ Link zu den Details start +++
                          <?php if ($entry['link']): ?>
                          <div class="link"><?php echo $entry['link']; ?></div>
                          <?php endif; ?>
                          +++ Link zu den Details stop +++
                          
                          <br/><br/>
                          <?php endforeach; ?>
                          </div>
                           
                          <?php else: ?>
                          <?php if ($this->condition): ?>
                          <div class="condition"><?php echo $this->condition; ?></div>
                          <?php else: ?>
                          <p class="info">There are no entries matching your search.</p>
                          <?php endif; ?>
                          
                          <?php endif; ?>
                          
                          +++ Werke-Abfragen start +++
                          
                          <?php if (count($this->entries)): ?>
                          <?php foreach ($this->entries as $entry): ?>
                          
                          <?php if ($data['ref']): ?>
                              <div class="werke">
                                      <?php foreach ($data['ref'] as $id=>$werke): ?>
                                  <div class="titel"><?php echo $werke['titel'] ?></div>
                                          <div class="instrument"><?php echo $werke['instrument'] ?></div>
                                      <?php endforeach; ?>
                                  </div>
                          <?php endif; ?>
                          
                          <?php endforeach; ?>
                          <?php endif; ?> 
                          
                          +++ Werke-Abfragen stop +++
                          Wo hab ich jetzt den Fehler reingeknüpft?

                          Gruß
                          Michael

                          Kommentar

                          • MacKP
                            Contao-Yoda
                            • 15.06.2009
                            • 13315

                            #14
                            Ok, das ist noch etwas unsortiert. Die Werke sollten innerhalb des Komponisten abgefragt werden, damit du diese bekommst und nicht einfach irgendwelche:

                            PHP-Code:
                            <?php if (count($this->entries)): ?>
                            
                            <div class="layout_simple">
                            <?php foreach ($this->entries as $entry): ?>
                            
                            +++ Komponisten-Abfragen start +++
                            <br/><br/>
                            <?php if($entry['data']['name']['value']):?><?php echo $entry['data']['name']['value']; ?><?php else: ?>-<?php endif;?>
                            <br/><br/>
                            <?php if($entry['data']['wohnort']['value']):?><?php echo $entry['data']['wohnort']['value']; ?><?php else: ?>-<?php endif;?>
                            <br/><br/>
                            +++ Komponisten-Abfragen stop +++
                            <br/>
                            +++ Werke-Abfragen start +++
                            <?php if ($data['ref']): ?>
                                <div class="werke">
                                        <?php foreach ($data['ref'] as $id=>$werke): ?>
                                    <div class="titel"><?php echo $werke['titel']; ?></div>
                                            <div class="instrument"><?php echo $werke['instrument']; ?></div>
                                        <?php endforeach; ?>
                                    </div>
                            <?php endif; ?> 
                            +++ Werke-Abfragen stop +++
                            <br/>
                            +++ Link zu den Details start +++
                            <?php if ($entry['link']): ?>
                            <div class="link"><?php echo $entry['link']; ?></div>
                            <?php endif; ?>
                            +++ Link zu den Details stop +++
                            
                            <br/><br/>
                            <?php endforeach; ?>
                            </div>
                             
                            <?php else: ?>
                            <?php if ($this->condition): ?>
                            <div class="condition"><?php echo $this->condition; ?></div>
                            <?php else: ?>
                            <p class="info">There are no entries matching your search.</p>
                            <?php endif; ?>
                            
                            <?php endif; ?>
                            Hmm eventuell lags an fehlenden ; die ich auch nicht bei einigen Angaben gemacht hatte... hab ich jetzt auch noch hier eingefügt.

                            Viele Grüße
                            Contao Pool | C-C-A | MetaModels | [Internetseite -> Mediendepot Ruhr]
                            [Arbeitet bei -> Paus Design & Medien]
                            "I can EXPLAIN it to you, but I can't UNDERSTAND it for you."

                            Kommentar

                            • okapi
                              Contao-Fan
                              • 03.09.2009
                              • 251

                              #15
                              Leider funktioniert die Abfrage für die Werke so noch nicht.
                              Jetzt rätsle ich, wie ich das zuvor geschafft habe...

                              Ich probier mal weiter.
                              EDIT:

                              PHP-Code:
                              <?php if (count($this->entries)): ?>
                              <div class="layout_simple">
                              <?php foreach ($this->entries as $entry): ?>
                              
                              
                              <div class="item<?php echo $entry['class'] ? ' '.$entry['class'] : ''; ?>">
                              <?php foreach ($entry['data'] as $field=>$data): ?>
                              <?php if (!in_array($field, array('catalog_name','parentJumpTo'))): ?>
                              <div class="field <?php echo $field; ?>">
                                  <div class="label"><?php echo $data['label']; ?></div>
                                  <div class="value"><?php echo $data['value']; ?></div>
                              </div>
                              <?php endif; ?>
                              <?php endforeach; ?>
                              
                              <?php if ($entry['link']): ?>
                              <div class="link"><?php echo $entry['link']; ?></div>
                              <?php endif; ?>
                              </div>
                              
                              
                              ### Komponisten-Abfragen start ###
                              <br/><br/>
                              <?php if($entry['data']['name']['value']):?><?php echo $entry['data']['name']['value']; ?><?php else: ?>-<?php endif;?>
                              <br/><br/>
                              <?php if($entry['data']['wohnort']['value']):?><?php echo $entry['data']['wohnort']['value']; ?><?php else: ?>-<?php endif;?>
                              <br/><br/>
                              ### Komponisten-Abfragen stop ###
                              <br />
                              ### Werke-Abfragen start ###
                              <?php if ($data['ref']): ?>
                                  <div class="werke">
                                          <?php foreach ($data['ref'] as $id=>$werke): ?>
                                      <div class="titel"><?php echo $werke['titel'] ?></div>
                                              <div class="instrument"><?php echo $werke['instrument'] ?></div>
                                          <?php endforeach; ?>
                                      </div>
                              <?php endif; ?>
                              ### Werke-Abfragen stop ###
                              
                              <?php endforeach; ?>
                              </div>
                              <?php else: ?>
                              <?php if ($this->condition): ?>
                              <div class="condition"><?php echo $this->condition; ?></div>
                              <?php else: ?>
                              <p class="info">There are no entries matching your search.</p>
                              <?php endif; ?>
                              <?php endif; ?>
                              So funktioniert es jetzt.

                              Danke für deine Geduld! Du hast mir sehr geholfen, aber sicher auch anderen, die diesen Thread verfolgen.

                              Viele Grüße aus Wien
                              Michael
                              Zuletzt geändert von okapi; 18.01.2010, 13:02.

                              Kommentar

                              Lädt...