Ankündigung

Einklappen
Keine Ankündigung bisher.

Auf Inhalte anderer Kataloge zugreifen

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

  • Auf Inhalte anderer Kataloge zugreifen

    Moin zusammen,

    Ich habe zwei unterschiedliche Kataloge konfiguriert und befüllt (Projekte und Mitarbeiter). Ist es möglich, im Projekt einen Mitarbeiter auszuwählen, um diesen dann mit dem Projekt zu verknüpfen?

    Viele Grüße
    Manuel

  • #2
    Hi,
    du kannst dafür die Tags nutzen oder ein Auswahl-/Select Datenbank Feld. Beide Attribute erlauben die Auswahl eigener Tabellen.

    Viele Grüße,
    http://www.premium-contao-themes.com

    Kommentar


    • #3
      Wie funktioniert das denn mit den Tags? Ich wüsste nicht, wie ich die nutzen kann, um die Einträge zu verknüpfen.

      Kommentar


      • #4
        Man wählt dann im Tags-Feld das / oder die (wenn mehrfach) Einträge und hat dann quasi die IDs dieser. Damit kann man im Frontend die Einträge via Datenbank-Abfrage holen.
        http://www.premium-contao-themes.com

        Kommentar


        • #5
          Ich müsste dann also ein Tag "Mitarbeiter" schaffen. In "Mitarbeiter" habe ich dann die verschiedenen Mitarbeiter z.B. Max Mustermann. Im Eintrag von Max Mustermann wähle ich dann das Tag "Max Mustermann" aus. Im entsprechenden Projekt würde ich dann den jeweiligen Mitarbeiter auswählen, korrekt?

          Kommentar


          • #6
            Zitat von Manuel Beitrag anzeigen
            Ich müsste dann also ein Tag "Mitarbeiter" schaffen. In "Mitarbeiter" habe ich dann die verschiedenen Mitarbeiter z.B. Max Mustermann. Im Eintrag von Max Mustermann wähle ich dann das Tag "Max Mustermann" aus. Im entsprechenden Projekt würde ich dann den jeweiligen Mitarbeiter auswählen, korrekt?
            Etwas zu komplex beschrieben, aber ich denke du meinst es richtig.

            Backend:
            - Du erstellst ein Tags Feld auf die Tabelle, die deine Mitarbeiter verwaltet (könnte auch tl_member sein, dann wäre es direkt ein Contao Mitgliedsdatensatz).
            - Im CC Eintrag kannst du nun den gewünschten Mitarbeiter via Tags-Feld wählen

            Frontend:
            - Hier wird erstmal nur die ID des Datensatzes kommen. Mit dieser erstellt man sich eine Datenbank-Abfrage auf die Quelle und holt den Datensatz (wenn man Infos daraus benötigt).
            http://www.premium-contao-themes.com

            Kommentar


            • #7
              Gibt es hier im Forum schon ein Beispiel für diese Abfrage?

              Kommentar


              • #8
                Zitat von Manuel Beitrag anzeigen
                Gibt es hier im Forum schon ein Beispiel für diese Abfrage?
                Ja. Referenzierte Kataloge wurden mehrfach behandelt. Imgrunde reicht eine direkte Datenbankabfrage auf die referenzierte Tabelle mit dem Wert aus dem Feld (in der Regel die ID des referenzierten Eintrags)

                (myTable gegen die ref. Tabelle ersetzen und das ref. Feld)
                --- CC-liste foreach schleife start ---
                Code:
                $intEntry = $entry->field('myRefSelect')->value();
                $objRefEntry = \Database::getInstance()->prepare("SELECT * FROM myTable WHERE id=?")->limit(1)->execute($intEntry);
                echo $objRefEntry->id;
                --- foreach schleife ende ---

                Hier noch weitere nützliche Abfragen z.B. für Eltern-Kind
                https://forum.premium-contao-themes....hild-tablellen
                http://www.premium-contao-themes.com

                Kommentar


                • #9
                  Hallo zusammen,

                  das hier gelistete Beispiel ist recht anschaulich und Jene im verlinkten Thread auch, ich vermisse aber ein wenig Erläuterung zu der "Magie" im Hintergrund. Das Beispiel hier zeigt ja den Fall einer einfachen Verknüpfung, aber was genau passiert bei Mehrfachauswahl?
                  Wenn z.B.
                  Code:
                  $foreignTableIdEntries = $entry->field('myRefSelect')->value();
                  ausgeführt wird und "myRefSelect" ein Mehrfachauswahlfeld vom Typ "Tags" oder "Datenbankauswahl" ist, muss man dann mittels foreach über "$foreignTableIdEntries" iterieren oder kann man es direkt dem Prepared Statement übergeben und das Ganze wird korrekt zusammen gebastelt?

                  Wie würde es beispielweise ganz konkret aussehen, wenn ich eine "Externe Links"-Datenbank habe (mit den Feldern Überschrift, Beschreibungstext, Sortierfeld und URL), ein paar Einträge aus dieser DB bei einem Produkt mittels eines Tagfeldes auswähle und anhand dieser Auswahl dann im Reader eine sortierte Liste von Infoboxen mit Links generieren möchte? Ein vollständiges Codebeispiel zum einem solch simplen Demo-Use-Case wäre Gold wert.

                  Zudem ist das Beipsiel aus dem vorherigen Post zwar super, um verknüpfte Daten direkt in den Reader oder die Listenausgabe zu integrieren, aber was ich bei meiner Suche nach Antworten weder in der Dokumentation noch in diesem Forum gefunden habe ist, wie genau Reader und die Customcatalog-Liste im Rahmen von "Verwandte Produkte" verknüpft sind, denn das wäre für meinen konkreten Fall der wesentlich bessere Lösungsansatz... wenn ich es denn zum Laufen bekäme.

                  Daher mal konkret gefragt:
                  Woher genau kommen in der Datei "customcatalog_productcatalog_related.html5" die unter "$this->entries" erreichbaren Datensätze her?
                  Irgendwo muss ja eine Verbindung zum Reader bestehen, damit die in dem Modul gelisteten Produkte so gefiltert werden, dass sie den Einträgen aus dem Feld "Verwandte Produkte" des im Reader betrachteten Produkts entsprechen. Ich habe gesucht, aber kann die Verbindung zwischen dem betrachteten Produkt, dessen Tagauswahl und dem Listenfilter nicht finden.

                  Mein Problem ist aktuell nämlich das Folgende:

                  Ich habe die beiden Kataloge "Händler" und "Produkte" größtenteils unverändert aus der Productcatalog-Demo übernommen, dann aber noch den zusätzlichen Katalog "Zubehör" angelegt (der etwas abgespeckter als "Produkte" daher kommt) und in "Produkte" den Objektdaten das Tagfeld "Zubehörartikel" verpasst. Dann habe ich zwischen Reader und der Customcatalog-Liste für verwandte Produkte eine weitere Liste eingefügt und für Diese in der Modulkonfiguration als Datenquelle die Zubehörtabelle angegeben. Wenn ich dann aber unter Filtersets einen Filter übergeben möchte, der mit den Einträgen aus dem "Zubehörartikel"-Tag-Datenfeld des im Reader betrachteten Produkts gefüttert wird, funktioniert das nicht, da anscheinend nur Filtersets akzeptiert werden, die zu der Zubehörtabelle gehören, Filtersets die der Produkttabelle zugehörig sind, funktionieren hier nicht.
                  Gebe ich gar kein Filterset an, so sehe ich alle Zubehörteile, die Liste ist also korrekt aufgesetzt. Aber ich muss die dargestellten Einträge ja auf jene Beschränken, die beim Produkt eingepflegt sind, sonst hat es keinen Sinn.

                  Wie bekomme ich dies also hin, welche Einstellungen und welcher Code sind der Kitt, welche die ID-Werte meines Tagfeldes des aktuell betrachteten Datensatzes als Filterkriterium für die Zubehörliste nutzbar macht?

                  Aktuell vermute ich, dass es bei "Verwandte Artikel" nur funktioniert, weil das zugehörige Tagfeld auf die gleiche Tabelle zu der auch das betrachtete Produkt gehört zeigt, Customcatalog-Listen also nur für Selbstreferenzen funktionieren. Sollte dies tatsächlich der Fall sein, wäre das sehr schade und ich müsste tatsächlich den Produktreader stark erweitern um dann dort eine entsprechende Listenausgabe zu erzeugen. Das wäre ziemlich clunky und widerspricht stark dem CMS-Ansatz, ich hoffe also stark, dass ich mich irre.

                  Beste Grüße
                  Stefan

                  Kommentar


                  • #10
                    CC hat einen Filter "Verwandte Einträge", damit ist die Demo aufgebaut. Der Filter hat zwei Modi. In der Regel und auch in der Demo sind die "Verwandten" Einträge der gleichen DB. Liste-Module zum Beispiel denken selbsterklärend auch nur in der gesetzten Tabelle.

                    Innerhalb der Templates kann man alles in die Ausgabe holen, wenn man möchte.
                    Beispiele dafür haben wir hier im Forum wie Fremd-Ausgaben ergänzt werden. Das geht auf vielfältige Art und Weise. Hier ein paar Referenzen, die ganze CC-Liste-Module quer referenzieren.

                    https://forum.premium-contao-themes....plate-ausgeben

                    Für die Ausgabe von ein paar Werten aus einem fremd-Einträge, würde ich im Template eine foreach Schleife nutzen (oder while je nach DB-Result) und dann im Template die gewünschte Ausgabe aufbauen. Das hat einige Vorteile, weil der Wert direkt in den gewünschten HTML-Aufbau ausgegeben werden kann. Referenziert man ein komplettes Modul, hat man zwar alle Macht der Modul-Templates, aber auch deren (event. an dieser Stelle unerwünschten) Ausgabe.
                    ---
                    DB-Abfragen auf mehrere IDs können entweder per foreach-Schleife durchgeführt werden oder per Mysql IN(...). Letzteres liefert ein Datenbank-Resultat, das die gefunden Zeilen beinhaltet. Diese müssen wiederum durchlaufen werden, wenn man gezielt Einzelausgaben tätigen möchte.


                    ---
                    Filter arbeiten standardmäßig ausschließlich für die jeweilige CC-Konfiguration und in deren Scope. Komplexe Filterstrukturen, die erweiterte menschliche Logiken benötigen, können über den Hook-Callback Filter selbstständig implementiert werden. Die generelle Liste-Ausgabe gilt, wie oben erwähnt, nur für den gewählten Katalog. Aber wie gesagt, in den Templates kann man quasi alles machen.
                    Zuletzt geändert von Tim; 23.11.2020, 09:02.
                    http://www.premium-contao-themes.com

                    Kommentar


                    • #11
                      Beispiel mit mehreren Ids und direkter SQL-Abfrage

                      Code:
                       [COLOR=#333333][SIZE=11px] [COLOR=#333333][SIZE=11px] [COLOR=#878787]<?php[/COLOR]
                        [COLOR=#8735a5]$arrIds[/COLOR] [COLOR=#000000]=[/COLOR] [COLOR=#0045aa]array[/COLOR]([COLOR=#007ab7]1[/COLOR],[COLOR=#007ab7]2[/COLOR],[COLOR=#007ab7]3[/COLOR]);
                        [COLOR=#8735a5]$objResults[/COLOR] [COLOR=#000000]=[/COLOR] \Database[COLOR=#000000]::[/COLOR][COLOR=#3f6e7d]getInstance[/COLOR]()[COLOR=#000000]->[/COLOR][COLOR=#3f6e7d]prepare[/COLOR]([COLOR=#dd2400]"[/COLOR][COLOR=#dd2400]SELECT * FROM myTable WHERE id IN([/COLOR][COLOR=#dd2400]"[/COLOR][COLOR=#000000].[/COLOR][COLOR=#400080]implode[/COLOR]([COLOR=#dd2400]','[/COLOR],[COLOR=#8735a5]$arrIds[/COLOR])[COLOR=#000000].[/COLOR][COLOR=#dd2400]")"[/COLOR])[COLOR=#000000]->[/COLOR][COLOR=#3f6e7d]execute[/COLOR]();
                        [COLOR=#878787]?[/COLOR][COLOR=#878787]>[/COLOR]
                        [COLOR=#0045aa]<ul>[/COLOR]
                        [COLOR=#878787]<?php[/COLOR] [COLOR=#0045aa]while[/COLOR][COLOR=#000000]([/COLOR][COLOR=#8735a5]$objResults[/COLOR][COLOR=#000000]->[/COLOR][COLOR=#3f6e7d]next[/COLOR]()[COLOR=#000000])[/COLOR]: [COLOR=#878787]?[/COLOR][COLOR=#878787]>[/COLOR]
                        [COLOR=#0045aa]<li>[/COLOR][COLOR=#878787]<?=[/COLOR] [COLOR=#8735a5]$objResults[/COLOR][COLOR=#000000]->id[/COLOR]; [COLOR=#878787]?[/COLOR][COLOR=#878787]>[/COLOR][COLOR=#0045aa]</li>[/COLOR]
                        [COLOR=#878787]<?php[/COLOR] [COLOR=#0045aa]endwhile[/COLOR]; [COLOR=#878787]?[/COLOR][COLOR=#878787]>[/COLOR]
                        [COLOR=#0045aa]</ul>[/COLOR]
                       [/SIZE][/COLOR]
                       [/SIZE][/COLOR]
                      Beispiel mit dyn. Model (nur mit CC möglich).
                      Code:
                      [COLOR=#333333][SIZE=11px] [COLOR=#878787]<?php[/COLOR]
                      [COLOR=#8735A5][SIZE=11px]$arrIds[/SIZE][/COLOR][COLOR=#000000][SIZE=11px]=[/SIZE][/COLOR][COLOR=#0045AA][SIZE=11px]array[/SIZE][/COLOR][COLOR=#333333][SIZE=11px]([/SIZE][/COLOR][COLOR=#007AB7][SIZE=11px]1[/SIZE][/COLOR][COLOR=#333333][SIZE=11px],[/SIZE][/COLOR][COLOR=#007AB7][SIZE=11px]2[/SIZE][/COLOR][COLOR=#333333][SIZE=11px],[/SIZE][/COLOR][COLOR=#007AB7][SIZE=11px]3[/SIZE][/COLOR][COLOR=#333333][SIZE=11px]);[/SIZE][/COLOR]
                      [COLOR=#8735a5]$objContaoModel[/COLOR] [COLOR=#000000]=[/COLOR] [COLOR=#0045aa]new[/COLOR] \ContaoModel; // Klasse existiert nur mit CC
                      [COLOR=#8735a5]$obj[/COLOR][/SIZE][/COLOR][COLOR=#8735A5][SIZE=11px]ContaoModel[/SIZE][/COLOR][COLOR=#333333][SIZE=11px][COLOR=#000000]->[/COLOR][COLOR=#3f6e7d]setTable[/COLOR]([COLOR=#dd2400]'[/COLOR][COLOR=#DD2400][SIZE=11px]myTable[/SIZE][/COLOR][COLOR=#dd2400]'[/COLOR]);
                      [COLOR=#8735a5]$objModels[/COLOR] [COLOR=#000000]=[/COLOR] [COLOR=#8735a5]$obj[/COLOR][/SIZE][/COLOR][COLOR=#8735A5][SIZE=11px]ContaoModel[/SIZE][/COLOR][COLOR=#333333][SIZE=11px][COLOR=#000000]->[/COLOR][COLOR=#3f6e7d]findMultipleByIds[/COLOR]([COLOR=#8735a5]$arrIds[/COLOR]); // siehe Contao Model Klasse
                      [COLOR=#878787]?[/COLOR][COLOR=#878787]>[/COLOR]
                      [COLOR=#0045aa]<ul>[/COLOR]
                      [COLOR=#878787]<?php[/COLOR] [COLOR=#0045aa]foreach[/COLOR][COLOR=#000000]([/COLOR][COLOR=#8735a5]$objModels[/COLOR] [COLOR=#000000]as[/COLOR] [COLOR=#8735a5]$objModel[/COLOR][COLOR=#000000])[/COLOR]: [COLOR=#878787]?[/COLOR][COLOR=#878787]>[/COLOR]
                      [COLOR=#0045aa]<li>[/COLOR][COLOR=#878787]<?=[/COLOR] [COLOR=#8735a5]$objModel[/COLOR][COLOR=#000000]->id[/COLOR]; [COLOR=#878787]?[/COLOR][COLOR=#878787]>[/COLOR][COLOR=#0045aa]</li>[/COLOR]
                      [COLOR=#878787]<?php[/COLOR] [COLOR=#0045aa]endforeach[/COLOR]; [COLOR=#878787]?[/COLOR][COLOR=#878787]>[/COLOR]
                      [COLOR=#0045aa]</ul>[/COLOR][/SIZE][/COLOR]
                      Zuletzt geändert von Tim; 23.11.2020, 09:10.
                      http://www.premium-contao-themes.com

                      Kommentar


                      • #12
                        Feature Request: Erweiterung des Include-Attributes.
                        Das Include Attribut erlaubt im Eintrag die Auswahl von entweder einem Inhaltselement, Artikel oder Modul.
                        Man kann es erweitern auf die Auswahl eines (oder mehrerer) Einträge aus Fremden-CCs. Im Attribut zusätzlich eine Auswahl für das customcatalog_ Ausgabe Template.

                        Damit bleibt das System in sich sicher, was bei einer losen Auswahl z.B. über Tags nicht gegeben wäre.
                        http://www.premium-contao-themes.com

                        Kommentar


                        • #13
                          Das Thema ist zwar jetzt etwas älter, aber ich dachte, ich stelle hier mal die Lösung, welche ich letztlich gefunden habe, zur Verfügung. Einerseits um anderen zu helfen, die dieses Forum auf der Suche nach der Lösung für ein ähnliches Problem durchsuchen, andererseits um eventuelle Verbesserungsvorschläge für meinen Ansatz zu sammeln.

                          Vorab sei erwähnt, dass ich von einen SQL-Ansatz dann doch abgesehen habe, da mir nicht klar war, wie ich auf Basis der so erhaltenen Daten einen korrekten Link auf die entsprechende Detailseite des Zubehörteils generiert bekäme.
                          Stattdessen habe ich das Template "customcatalog_productcatalog_related.html5" als Vorlage genommen, um auf dessen Basis das neue Template "customcatalog_productcatalog_related_accessories. html5" zu erstellen.
                          Dadurch war es dann auch möglich, die Darstellung des passenden Zubehörs vom Reader-Template zu entkoppeln. Alles was ich in "customcatalog_productcatalog_reader.html5" dadurch anpassen musste, war eine globale Variable zu befüllen, die ich dann im neuen Template auslesen kann, um die vollständige Zubehörliste (die ja, wie in meinem obigen Post erwähnt, problemlos funktioniert) danach zu filtern.
                          Klar, effizient ist das nicht, da zu jedem Produkt erst einmal der komplette Zubehörkatalog geladen wird, nur um dann einen Bruchteil der geladenen Daten tatsächlich anzuzeigen, aber für Kataloge mit einer sehr überschaubaren Anzahl an Zubehörartikeln fällt das zum Glück kaum ins Gewicht, vor Allem dank Contaos Caching.
                          Geht die Anzahl der Zubehörteile dagegen in den Hunderter- oder gar Tausender-Bereich, ist das natürlich nicht mehr tragbar und es muss dann definitiv eine SQL-Lösung her.
                          Dafür müsste man aber halt wissen, wie man aus den aus der DB geladenen Zubehördaten zuverlässig einen Link auf die Zubehördetailseite generiert bekommt. Natürlich dynamisch, ohne diesen hardcodieren zu müssen, indem man den Alias des Zubehörteils an die URL der Detailseite ranbastelt. Das wäre zu rigide und fehleranfällig und wäre darüber hinaus auch nicht kompatibel mit Mehrsprachigkeit und kommt daher nicht in Frage. Wenn hier also jemand Tipps dazu hat, wäre das ein sehr solider Verbesserungsvorschlag. Vielleicht kann man sich ja auch an der Stelle, an welcher das SQL-Statement zum Fetchen die Liste, über welche in "customcatalog_productcatalog_related_accessories. html5" iteriert wird (erreichbar via "$this->entries"), generiert wird, dazwischen klinken, wenn im Kontext dieser die globale Variable gefunden wird?

                          Aber das ist alles spekulativ, kommen wir nun also zum Konkreten.
                          Hier ist mein SQL-freier Lösungsansatz:

                          In "customcatalog_productcatalog_reader.html5" habe ich ganz am Ende Folgendes eingefügt:
                          PHP-Code:
                          <?php
                          $GLOBALS
                          ['accessoryIds'] = $this->field('accessories')->value;
                          ?>
                          Und "customcatalog_productcatalog_related_accessories. html5" sieht dann so aus:
                          PHP-Code:
                          <?php $accessoryIds $GLOBALS['accessoryIds']; ?>
                          <?php 
                          if(!empty($accessoryIds) && !$this->empty): ?>
                          <div class="mod_customcataloglist cc_product_catalog">
                              <div class="swiper-container" id="swiper_<?php echo $this->id?>">
                                  <div class="swiper-wrapper">
                                      <?php foreach($this->entries as $entry):
                                              if (
                          in_array($entry->id$accessoryIds)):
                                      
                          ?>
                                      <div class="swiper-slide block entry<?php if($entry->field('highlight')->value()): ?> item-highlight<?php endif; ?><?php echo $this->cssID?>>
                                          <div class="item-inside">
                                              <?php if($entry->field('highlight')->value()): ?> <i class="item-highlight-icon fa fa-star"></i><?php endif; ?>
                                              <a href="<?php echo $entry->links('detail')->url?>"><?php echo $entry->field('image')->html(); ?></a>
                                              <h6><a href="<?php echo $entry->links('detail')->url?>"><?php echo $entry->field('name')->value(); ?></a></h6>
                                              <div class="brand"><?php echo $entry->field('brand')->html(); ?></div>
                                              <div class="price color-accent">&euro;<?php echo $entry->field('price')->value(); ?><?php if($entry->field('price_old')->value()): ?><span> &euro;<?php echo $entry->field('price_old')->value(); ?></span><?php endif; ?></div>
                                              <?php echo $entry->field('rating')->html(); ?>
                                          </div>    
                                      </div>
                                      <?php   endif;
                                            endforeach; 
                          ?>
                                  </div>        
                              </div>
                              <div id="swiper-button-next_<?php echo $this->id?>" class="swiper-button-next"></div>
                              <div id="swiper-button-prev_<?php echo $this->id?>" class="swiper-button-prev"></div>
                          </div>

                          <script>
                          /* <![CDATA[ */
                          jQuery(document).ready(function(){
                           var swiper_<?php echo $this->id?> = new Swiper('#swiper_<?php echo $this->id?>', {
                                   paginationClickable: true,
                                   slidesPerView: 3,
                                   grabCursor: true,
                                   navigation: {
                                      nextEl: '#swiper-button-next_<?php echo $this->id?>',
                                      prevEl: '#swiper-button-prev_<?php echo $this->id?>',
                                  },
                                  breakpoints: {
                                      768: {
                                          slidesPerView: 1,
                                          spaceBetween: 0,
                                      }
                                  }    
                              });       
                          });
                          /* ]]> */
                          </script>
                          <?php else: ?>
                          <p class="info empty">Kein kompatibles Zubehör gefunden</p>
                          <?php endif;?>

                          Kommentar

                          Lädt...
                          X