Ankündigung

Einklappen
Keine Ankündigung bisher.

Brainstorming zu verschachtelten Listen

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • #16
    Glaub ich dir aufs Wort... komm mir grad schon halbwegs bescheuert vor, weil's einfach nicht klappen will.

    Vielleicht baue ich das ganze aber auch vollkommen falsch auf – bin mir da mittlerweile etwas unsicher. Ich erklär mal kurz was genau Sache ist:

    - Es gibt verschiedene Produkte (catalog_a, die Produkte haben an dieser Stelle noch keine Produktnummer)
    - jedes Produkt hat eine Kindtabelle (catalog_b) mit Produktvarianten (andere Bilder, Farbe, spezifische Produktnummer etc)
    - jeder Produktvariante sollen direkt Händlerlinks (bestehend aus Händlername und URL) zugeordnet werden können (unterschiedliche Links, unterschiedliche Anzahl)

    Ich dachte, für die Händlerlinks wäre es sinnvoll einfach ebenfalls eine Kindtabelle anzulegen.

    Der ganze Kram soll auf einer Detailseite (von catalog_a) ausgegeben werden. Es gibt innerhalb der Detailansicht eine Listenausgabe der Varianten (als kleine Vorschaubilder). Wenn man auf ein solches Vorschaubild klickt, sollen alle für diese Variante verfügbaren Händler-Link-Kombinationen angezeigt werden. Die Datensätze werden beim Laden der Seite bereits im DOM bereitgestellt, sind aber erst sichtbar, wenn man eine Variante anklickt (einfaches hide/show mit jQuery).

    Ich denke, jetzt ist der Plan komplett verständlich

    Kommentar


    • #17
      Was natürlich auch geht: Im Liste-Modul der Kind-Einträge die SQL Bedingung:

      Code:
      pid={{customcatalog::MY-PARENT-TABLENAME::autoitem::id}}
      Damit steht die Referenz auch ganz ohne GETs
      http://www.premium-contao-themes.com

      Kommentar


      • #18
        Kannst du hierzu bitte mal den Schnipsel etwas ausführlicher darstellen?
        Wie lautet die Abfrage, wenn im Kind-Listenmodul sämtliche Eltern-Einträge geladen werden und für die Ausgabe verfügbar sein sollen?

        Kommentar


        • #19
          "Generell muss man sagen, CC macht alles für dich. Man muss eigentlich nichts basteln, wenn man normal mit Leser und Liste arbeitet. Die Foren-Beiträge sind bereits "gehacke".
          So arbeitet CC out of the box
          Listenseite:
          - Liste, Haupt-CC -> generiert mehrere Detailseiten links, wenn Kindtabellen aktiv sind

          Detailseite mit Url für Kindtabelle:
          - Leser (Haupt-CC)
          - Liste (Kind-CC)"


          Ich würde gerne das Thema nochmals aufgreifen, weil mir die Doku an dieser Stelle immer noch nicht klar ist.

          Ich habe eine Liste aus der Kind-Tabelle (Default-Template aus der Demo "cc_unterkuenfte").
          Diese beinhaltet spezielle Reiseangebote.
          Aus der Elterntabelle sollen einige Daten in dieser Liste ausgegeben werden (z.B. Name und Bild des Hotels).

          Wie sieht erhalte ich nun die Einträge aus der Eltern-Tabelle am praktikabelsten?



          Kommentar


          • #20
            Von Kind zu Eltern geht nur über eine andere Abfrage. Hier wird über Eltern zu Kind gesprochen!

            Kind zu Eltern wäre:

            Eltern-Liste:

            Code:
            id={{customcatalog::MY-CHILD-TABLENAME::autoitem:pid}}
            Solche Strukturen sieht man in phpmyadmin am besten.
            http://www.premium-contao-themes.com

            Kommentar


            • #21
              Zitat von Tim Beitrag anzeigen
              Was natürlich auch geht: Im Liste-Modul der Kind-Einträge die SQL Bedingung:

              Code:
              pid={{customcatalog::MY-PARENT-TABLENAME::autoitem::id}}
              Damit steht die Referenz auch ganz ohne GETs

              Das hat nun prima funktioniert. Allerdings nur, solange ich dieses "Kind-Listenmodul" in einem Lesemodul der Elterntabelle verwende.

              Die Aufgabe ist jedoch, das ein Kind-Listenmodul mit allen Kind-Einträgen (Reiseliste) auszugeben, und zu jedem der Listeneinträge jeweils Infos aus der Elterntabelle (Hotelname) zu integrieren.

              Kommentar


              • #22
                Zitat von eblick Beitrag anzeigen


                Das hat nun prima funktioniert. Allerdings nur, solange ich dieses "Kind-Listenmodul" in einem Lesemodul der Elterntabelle verwende.

                Die Aufgabe ist jedoch, das ein Kind-Listenmodul mit allen Kind-Einträgen (Reiseliste) auszugeben, und zu jedem der Listeneinträge jeweils Infos aus der Elterntabelle (Hotelname) zu integrieren.
                Ja, das ist klar. Das inserttag zielt ja auf den autoitem parameter, ergo Detailseite

                Das, was du vorhast, geht mit den dynamischen GET Parametern, ist hier auch erklärt und auch mit Beispielen versehen. Man simuliert quasi Detailseiten innerhalb der Listenschleife. Wo man wieder hier ist: http://forum.premium-contao-themes.c...plate-ausgeben

                Natürlich geht auch immer der Weg zu Fuss über ein komplett neues CC Objekt. Da brauchts aber bissel mehr Programmierkenntnisse.
                http://www.premium-contao-themes.com

                Kommentar


                • #23
                  Danke Tim! Jetzt wird ein Schuh draus.
                  jetzt sehe ich auch das angehängte Template.... Das ist wohl nur für registrierte Mitglieder sichtbar?!

                  Kommentar


                  • #24
                    Zitat von eblick Beitrag anzeigen
                    Danke Tim! Jetzt wird ein Schuh draus.
                    jetzt sehe ich auch das angehängte Template.... Das ist wohl nur für registrierte Mitglieder sichtbar?!
                    Puhh.. das weiss ich nicht. Aber wäre natürlich gut, wenn das so ist.
                    http://www.premium-contao-themes.com

                    Kommentar


                    • #25
                      Hier nochmals der Versuch, Eltern-Daten in einer Kind-Liste zu integrieren:

                      Dies funktioniert mal grundsätzlich im Kind-Listentemplate. Allerdings vermute ich, dass es eine geeignetere Lösung gibt, welche die von dir verwendeten Variablen ermöglich (z.B. <?php echo $entry->field('bild')->html(); ?>)
                      Dann wäre eine Auswahl der Felder im Backend durch den Redakteur möglich.

                      __________________________
                      <?php if(!$this->empty): ?>
                      <div class="angebotsliste content block">
                      <?php foreach($this->entries as $entry):
                      if(!empty($entry->pid))
                      {
                      $db = \Database::getInstance();
                      $objHotel = $db->prepare('SELECT * FROM cc_unterkuenfte WHERE id=? LIMIT 1')->execute($entry->pid);
                      if($objHotel !== null)
                      {
                      $entry->hotel = $objHotel;

                      echo $entry->hotel->name;
                      }
                      }
                      ?>

                      ____________________________



                      D.h. es sollte doch einen analogen Weg zu diesem hier bei der Integration von Kind-Listen in Eltern-Listen geben:

                      ___________
                      <!-- render my child list module -->
                      <div class="childtable block"></div>
                      <?php // mal die CC Liste etwas austricksen und eine Kind-Tabellen-Liste vorgaukeln | trick the CC list module here
                      \Input::setGet('pid',$entry->get('id'));
                      \Input::setGet('table','cc_myChildTable');
                      // einfach das Kindtabellen Liste-Modul inkludieren | just include the childtable list module
                      echo $this->replaceInsertTags('{{insert_module::MY-MODULE-ID}}');
                      ?>
                      </div>

                      ______________
                      Zuletzt geändert von eblick; 04.11.2015, 09:28.

                      Kommentar


                      • #26
                        Die ganzen schicken Template-Variablen gehen nur, wenn Du wirklich einen CC aufbaust bzw. die TemplateAttribute Klasse nutzt.
                        Du machst einen einfachen DB Request. Damit hast du nur den Datensatz, aber keinen Zugriff auf Methoden wie html() und Co.

                        Ich würds so machen:

                        PHP-Code:
                        <?php
                        // CC objekt erstellen
                        $objParentCC = \PCT\CustomElements\Plugins\CustomCatalog\Core\CustomCatalogFactory::findByTableName('cc_unterkuenfte');
                        // ausgabetemplate setzen, wenn nicht default
                        $objParentCC->setLayoutTemplate('customcatalog_simple');
                        ?>

                        <?php foreach($this->entries as $entry): ?>

                        <?php // einen einfachen filter erstellen für das Feld PID
                        $objParentFilter = new \PCT\CustomElements\Filters\SimpleFilter();
                                    
                        $options = array
                                    (
                                        
                        'column'    => 'pid',
                                        
                        'operation'    => '=',
                                        
                        'value'        => $entry->pid,
                                    );
                                    
                                    
                        $objParentFilter->setOptions($options);

                        // den CC rendern, durchläuft das oben gesetzte Template, wo dann auch wieder die Template-Variablen greifen.
                        echo $objParentCC->render();
                        ?>

                        <?php endforeach; ?>

                        Viel Erfolg.
                        Zuletzt geändert von Tim; 04.11.2015, 09:34.
                        http://www.premium-contao-themes.com

                        Kommentar


                        • #27
                          Danke für die Vorlage!!

                          Die Kind-Datensätze werden ordnungsgemäß ausgegeben (Bild 1). Bei den Eltern-Datenfeldern erhalte ich aber die Daten aller Eltern-Datensätze (Bild2).
                          Das setLayoutTemplate sieht so aus: (Name = Hotelname aus Eltern-Tabelle):

                          Code:
                          <div class="<?php echo $this->class; ?> block" <?php echo $this->cssID; ?>>
                              <?php if(!$this->empty): ?>
                              <div class="unterkuenfte-liste content block">
                                  <?php foreach($this->entries as $entry): ?>
                                  
                                  <?php echo $entry->field('name')->value(); ?></a>
                                                          
                                  <?php endforeach; ?>
                              </div>
                              <?php else: ?>
                              <p class="info empty"><?php echo $this->empty; ?></p>
                              <?php endif;?>
                          </div>

                          Kommentar


                          • #28
                            Hallo Tim,

                            ich muss das Thema nochmals aufgreifen.
                            Ich versuche die Kind-Datensätze direkt in der Eltern-Liste auszugeben, so wie du es auch als Template Vorlage zur Verfügung gestellt hast (customcatalog_with_childtable.html5).

                            Es wird aber immer derselbe Kinddatensatz (der vom ersten Elterndatensatz) ausgegeben.

                            Habe ich hier irgendetwas nicht beachtet?

                            Template Elternliste:

                            PHP-Code:
                            <div class="with_childtable_list <?php echo $this->class?> block" <?php echo $this->cssID?>>
                                <?php if(!$this->empty): ?>
                                    <?php foreach($this->entries as $entry): ?>
                                    <div class="<?php echo $entry->class?> block">
                                        <?php foreach($entry->get('fields') as $field): ?>
                                        <?php echo $field->html(); ?>
                                        <?php endforeach; ?>
                                        
                                        <!-- render my child list module -->
                                        <div class="childtable block"></div>    
                                            <?php // mal die CC Liste etwas austricksen und eine Kind-Tabellen-Liste vorgaukeln | trick the CC list module here
                                            
                            \Input::setGet('pid',$entry->get('id'));
                                            \
                            Input::setGet('table','cc_reiseinfo_details');
                                            
                            // einfach das Kindtabellen Liste-Modul inkludieren | just include the childtable list module
                                            
                            echo $this->replaceInsertTags('{{insert_module::241}}');
                                            
                            ?>    
                                            </div>
                                    <?php endforeach; ?>
                                <?php else: ?>
                                <p class="info empty"><?php echo $this->empty?></p>
                                <?php endif;?>
                            </div>

                            Template Kindliste (Modul 241)

                            PHP-Code:
                            <?php
                            /**
                             * Custom catalog template example file #2
                             * Renders an entry by the ->html() method of the RowTemplate ($entry) object
                             * Example:  echo $entry->html('MY-ITEM-TEMPLATE');
                             */
                            ?>

                            <?php if(!$this->empty): ?>
                            <?php 
                            foreach($this->entries as $entry): ?>
                                
                                <!-- calls the customcatalog_item_default template or the template you pass as parameter -->
                                <?php echo $entry->html(); ?>
                                
                            <?php endforeach; ?>


                            <?php else: ?>
                            <p class="info empty"><?php echo $this->empty?></p>
                            <?php endif;?>

                            Kommentar


                            • #29
                              Mit dem setGet und so, ist ne schöne Lösung. Setzt aber diesen Wert global in Contao, was wiederum nicht ganz so schön ist. Auch wenn es mein Beispiel ist.
                              Ich würde diesen Weg fast noch eher vorschlagen: http://forum.premium-contao-themes.c...=1298#post1298
                              und mit direkten CC Objekten arbeiten.
                              http://www.premium-contao-themes.com

                              Kommentar


                              • #30
                                Genau das hatte ich auch bereits versucht, mit dem Ergebnis, dass zu jedem Elterndatensatz alle verfügbaren Datensätze aus der Kindtabelle ausgegeben werden und nicht nur der zum jeweiligen Eltern-Satz zugehörige:

                                Elternliste

                                PHP-Code:
                                <?php
                                // CC objekt erstellen
                                $objChildCC = \PCT\CustomElements\Plugins\CustomCatalog\Core\CustomCatalogFactory::findByTableName('cc_reiseinfo_details');
                                // ausgabetemplate setzen, wenn nicht default
                                $objChildCC->setLayoutTemplate('customcatalog_layout_reiseinfo_detail');
                                ?>

                                    <?php if(!$this->empty): ?>
                                        <?php foreach($this->entries as $entry): ?>
                                                    <?php foreach($entry->get('fields') as $field): ?>
                                                            <li class="tab_fourth"><a class="icon-warehouse current" href="teilnehmerinformation.html"><?php echo $field->value(); ?></a></li>
                                                    <?php endforeach; ?>
                                                        
                                                        <?php // einen einfachen filter erstellen für das Feld PID
                                            
                                $objChildFilter = new \PCT\CustomElements\Filters\SimpleFilter();
                                                        
                                $options = array
                                                        (
                                                            
                                'column'    => 'pid',
                                                            
                                'operation'    => '=',
                                                            
                                'value'        => $entry->pid,
                                                        );
                                                        
                                                        
                                $objChildFilter->setOptions($options);
                                            
                                            
                                // den CC rendern, durchläuft das oben gesetzte Template, wo dann auch wieder die Template-Variablen greifen.
                                            
                                echo $objChildCC->render();
                                            
                                ?>
                                            
                                                        
                                                        
                                                    <?php endforeach; ?>
                                        
                                        
                                         <?php
                                Kindliste

                                PHP-Code:
                                <?php if(!$this->empty): ?>
                                <?php 
                                foreach($this->entries as $entry): ?>
                                    
                                    <!-- calls the customcatalog_item_default template or the template you pass as parameter -->
                                    <?php #echo $entry->html(); ?>
                                    <h4><?php echo $entry->field("reiseinfo_name")->value?></h4>
                                    <?php #echo $entry->field("reiseinfo_beschreibung")->value; ?>
                                    
                                <?php endforeach; ?>


                                <?php else: ?>
                                <p class="info empty"><?php echo $this->empty?></p>
                                <?php endif;?>

                                Ergebnis:

                                Klicke auf die Grafik für eine vergrößerte Ansicht

Name: Bildschirmfoto 2016-03-16 um 08.05.59.png
Ansichten: 175
Größe: 75,9 KB
ID: 2563
                                Funktioniert diese auch in dem konkreten (umgedrehten) Fall: Ausgabe von Kind-Daten in der Elternliste?

                                Kommentar

                                Lädt...
                                X