Ankündigung

Einklappen
Keine Ankündigung bisher.

CC: Eltern-Kind-Tabellen

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

  • CC: Eltern-Kind-Tabellen

    Hallo, ich eröffne hier absichtlich ein neues Thema zur Thematik Eltern-Kind-Tabellen. Meine vorhergehenden Posts bezogen sich auf das Backend. Dieses Thema bezieht sich auf das FRONTEND.

    ​Ich versuche noch immer, in einem Ausgabetemplate einer Kind-Tabelle Feldeinträge aus der Eltern-Tabelle darzustellen. Bisher ohne Erfolg.

    Folgend mein Beispiel für eine Kursverwaltung:

    Elterntabelle: cc_adressdaten
    Kindtabelle: cc_buchungen

    ​Herausforderung: Es sollen aus der Kind-Tabelle (cc_buchungen) die entsprechenden Einträge (bspw. die E-Mail-Adressen) aus der Eltern-Tabelle angezeigt werden. Folgenden Code habe ich im Ausgabe-Template der Kind-Tabelle:
    <?php $GLOBALS['TL_CSS'][] = PCT_CUSTOMELEMENTS_PATH.'/assets/font-awesome/'.PCT_CUSTOMELEMENTS_FONTAWESOME_VERSION.'/css/font-awesome.min.css'; ?>
    <div class="ce_table first last block">

    <table id="table_69597">

    <div class="<?php echo $this->class; ?> block" <?php echo $this->cssID; ?>>
    <?php if(!$this->empty): ?>

    <div class="immo-list top-objekte content block">
    <tr class="row_0 row_first even">
    <td class="col_1 col_first">Name</td>
    <td class="col_2 col_first">Vorname</td>
    <td class="col_3 col_first">Firma</td>
    <td class="col_3 col_first">E-Mail (1)</td>
    <td class="col_4 col_first">Kurscode</td>

    </tr>

    <?php foreach($this->entries as $entry): ?>
    <div class="<?php echo $entry->get('class'); ?> block">
    <div class="immo-list-inside">
    <div class="bild">
    <?php echo $entry->field('bild')->html(); ?>
    <div class="objekt-info">
    <div class="objekt-typ tag-<?php echo $entry->field('objekt_typ')->value(); ?>"><?php echo $entry->field('objekt_typ')->html(); ?></div>
    <?php if($entry->field('kaufpreis')->value() > 0): ?>
    <div class="kaufpreis">&euro; <?php echo $entry->field('kaufpreis')->value(); ?></div>
    <?php endif; ?>

    <?php if($entry->field('mietpreis')->value() > 0): ?>
    <div class="mietpreis">&euro; <?php echo $entry->field('mietpreis')->value(); ?></div>
    <?php endif; ?>

    </div>
    </div>

    <ul class="objekt-meta-daten">

    <tbody>
    <tr class="row_0 row_first even">




    <?php $objPID = $entry->field('pid')->value();
    $elternValue = {{cc_customcatalog::cc_adressdaten::$objPID::e_mai l_1->html}};
    echo $elternValue; ?>




    <td class="col_1 col"><?php echo $entry->field('name')->value(); ?></td>
    <td class="col_2 col"><?php echo $entry->field('vorname')->value(); ?></td>
    <td class="col_3 col"><?php echo $entry->field('firma')->value(); ?></td>
    <td class="col_4 col"><?php echo $entry->field('e_mail_1')->value(); ?></td>
    <td class="col_5 col"><?php echo $entry->field('kurscode')->value(); ?></td>

    </tr>
    </div>
    </ul>

    </div>

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


    ​Leider kommt nur ein Syntax-Fehler aus der Error.log-Datei.

    ​Ich danke Euch für Eure Hilfe.

  • #2
    Was ist an diesem Thread verkehrt, wo das Thema bis ins letzte Detail abgearbeitet wurde inkl. vieler Beispiel?
    http://forum.premium-contao-themes.c...htelten-listen

    ---
    Ohne Fehlermeldung, kann man nur raten.

    Das ist falsch:
    $elternValue = {{cc_customcatalog::cc_adressdaten::$objPID::e_mai l_1->html}};

    (inserttags synatx)
    Der Inserttag selbst ist bereits falsch. Siehe: http://forum.premium-contao-themes.c...log-inserttags
    Das Inserttag heisst "customcatalog", nicht "cc_customcatalog".
    Dann wird hier -> eingesetzt. Das kennt kein Inserttag. Trennung erfolgt per ::
    Erfragt soll werden soll auch nur der Wert, nicht aber die gesamte Html Ausgabe. Also ohne ::html

    (php synatx)
    Mischt man Variablen und "Freitext", wird der Freitext zu einer Constanten und die Variable darin kann nicht aufgelöst werden, weil nicht in Kochkomma als String geklariert. Einen Inserttag dynamisch befüllen muss via replaceInsertTags Funktion (Contao Kern) erfolgen.

    Korrekt wäre:
    Code:
    $elternValue = $this->replaceInsertTags( "{{customcatalog::cc_adressdaten::".$objPID"."::e_mai l_1}}" );
    (komische Schreibweise von email )

    ps. Den Inserttag nutzen ist im Grunde die schlechteste Lösung, da für jede Wertabfrage eine eigene DB Abfrage gestartet wird. Effektiver ist es den gesamten Datensatz zu holen z.B. via normaler DB Abfrage oder über CCs Methoden:

    http://forum.premium-contao-themes.c...=5979#post5979

    B
    eozgen auf diesen Beitrag:

    Code:
    $intPid = $entry->field('pid')->value(); // pid ist ein integer, kein object. Daher int (wenn man es genau nimmt :) )
    $objParentCC = \CustomCatalog::findByTableName('cc_adressdaten');
    $objParentEntry = $objParentCC->findPublishedItemByIdOrAlias( $intPid );
    echo $objParentEntry->e_mail_1;
    Zuletzt geändert von Tim; 06.02.2018, 09:51.
    http://www.premium-contao-themes.com

    Kommentar


    • #3
      Hallo,

      ​Vielen Dank. In diesem Fall die ganze Datenbankabfrage. Ich habe den Code nun eingebaut, leider kommt eine Fehlermeldung:

      [06-Feb-2018 09:33:04 Europe/Zurich] PHP Fatal error: Uncaught exception 'Error' with message 'Call to a member function findPublishedItemByIdOrAlias()

      ​Folgend noch ergänzend der korrespondierende Code:
      <?php $GLOBALS['TL_CSS'][] = PCT_CUSTOMELEMENTS_PATH.'/assets/font-awesome/'.PCT_CUSTOMELEMENTS_FONTAWESOME_VERSION.'/css/font-awesome.min.css'; ?>
      <div class="ce_table first last block">

      <table id="table_69597">

      <div class="<?php echo $this->class; ?> block" <?php echo $this->cssID; ?>>
      <?php if(!$this->empty): ?>

      <div class="immo-list top-objekte content block">
      <tr class="row_0 row_first even">
      <td class="col_1 col_first">Name</td>
      <td class="col_2 col_first">Vorname</td>
      <td class="col_3 col_first">Firma</td>
      <td class="col_3 col_first">E-Mail (1)</td>
      <td class="col_4 col_first">Kurscode</td>

      </tr>

      <?php foreach($this->entries as $entry): ?>
      <div class="<?php echo $entry->get('class'); ?> block">
      <div class="immo-list-inside">
      <div class="bild">
      <?php echo $entry->field('bild')->html(); ?>
      <div class="objekt-info">
      <div class="objekt-typ tag-<?php echo $entry->field('objekt_typ')->value(); ?>"><?php echo $entry->field('objekt_typ')->html(); ?></div>
      <?php if($entry->field('kaufpreis')->value() > 0): ?>
      <div class="kaufpreis">&euro; <?php echo $entry->field('kaufpreis')->value(); ?></div>
      <?php endif; ?>

      <?php if($entry->field('mietpreis')->value() > 0): ?>
      <div class="mietpreis">&euro; <?php echo $entry->field('mietpreis')->value(); ?></div>
      <?php endif; ?>

      </div>
      </div>

      <ul class="objekt-meta-daten">

      <tbody>
      <tr class="row_0 row_first even">




      <?php
      $intPid = $entry->field('pid')->value(); // pid ist ein integer, kein object. Daher int (wenn man es genau nimmt )
      $objParentCC = \CustomCatalog::findByTableName('cc_addressdaten') ;
      $objParentEntry = $objParentCC->findPublishedItemByIdOrAlias( $intPid );
      echo $objParentEntry->e_mail_1;?>




      <td class="col_1 col"><?php echo $entry->field('name')->value(); ?></td>
      <td class="col_2 col"><?php echo $entry->field('vorname')->value(); ?></td>
      <td class="col_3 col"><?php echo $entry->field('firma')->value(); ?></td>
      <td class="col_4 col"><?php echo $entry->field('e_mail_1')->value(); ?></td>
      <td class="col_5 col"><?php echo $entry->field('kurscode')->value(); ?></td>

      </tr>
      </div>
      </ul>

      </div>

      </div>
      <?php endforeach; ?>
      </div>
      <?php else: ?>
      <p class="info empty"><?php echo $this->empty; ?></p>
      <?php endif;?>
      </div>
      Zuletzt geändert von nikon; 08.02.2018, 10:17.

      Kommentar


      • #4
        Self-checking copy and paste is bad!

        die Tabelle heisst: cc_adressdaten

        Bitte nicht immer das gesamte Template posten, wenn dann in Code Blöcken.
        http://www.premium-contao-themes.com

        Kommentar


        • #5
          Vielen Dank, das hat geholfen.

          Kommentar


          • #6
            Hallo,

            ​Ich habe nun das selbe Vorgehen bei folgender Konstellation versucht:
            ​Eltern-Tabelle: cc_adressdaten
            Kind-Tabelle: cc_buchungen

            ​Ich erhalte folgende Fehlermeldung:
            [06-Feb-2018 11:32:28 Europe/Zurich] PHP Fatal error: Uncaught exception 'Error' with message 'Call to a member function findPublishedItemByIdOrAlias()

            ​Code (Auszug):
            <?php
            $intPid = $entry->field('pid')->value(); // pid ist ein integer, kein object. Daher int (wenn man es genau nimmt )
            $objChildCC = \CustomCatalog::findByTableName('cc_buchungen');
            $objChildEntry = $objChildCC->findPublishedItemByIdOrAlias( $intPid );?>


            <?php echo $entry->field('e_mail_1')->value(); ?>

            <?php echo $objChildEntry->kurscode; ?>

            ​Vermutlich habe ich es mir zu einfach vorgestellt, indem ich die Variable "Parent" durch "Child" ersetzt habe.
            Zuletzt geändert von nikon; 08.02.2018, 10:17.

            Kommentar


            • #7
              [06-Feb-2018 11:32:28 Europe/Zurich] PHP Fatal error: Uncaught exception 'Error' with message 'Call to a member function findPublishedItemByIdOrAlias() on null'

              Es existiert kein CC mit der abgefragten Tabelle im System. Damit wird null zurückgegeben.
              http://www.premium-contao-themes.com

              Kommentar


              • #8
                Falsche Schreibweise. id_3_cc_buchungen ist besser. Die Eltern-Einträge werden alle dargestellt, hingegen der Inhalt vom ChildEntry (kurscode) bleibt immer noch leer. Irgendwas ist immer noch falsch.
                <?php
                $intPid = $entry->field('pid')->value(); // pid ist ein integer, kein object. Daher int (wenn man es genau nimmt )
                $objChildCC = \CustomCatalog::findByTableName('id_3_cc_buchungen ');
                $objChildEntry = $objChildCC->findPublishedItemByIdOrAlias( $intPid );?>

                <?php echo $entry->field('firma')->value(); ?> <br>
                <?php echo $entry->field('name')->value(); ?>

                <br>
                <?php echo 'Buchung: '; echo $objChildEntry->kurscode; ?> <br>
                <br>

                Kommentar


                • #9
                  An der Schreibweise und Code ist erstmal nichts falsch. Das gesamte Vorhaben ist verquert bzw. man muss ein bisschen Datenbankgespür entwickeln und auch in phpmyadmin einmal schauen wie Dinge verknüpft sind. Es gibt den Eintrag schlichtweg nicht, weil die Beziehung falsch ist, maximal kann ein falscher Zufallstreffer entstehen.

                  Das Template ist die Ausgabe der Kind-Tabelle.
                  Damit kann man über die PID der Einträge das Eltern-Element erfragen. Die PID ist die ID des Eltern-Elements. -> hier entsteht der Denkfehler auf die nächste Kindabfrage!

                  Nun wird hier versucht eine Kind-Abfrage zu starten. Das nächst tiefere Kind-Element muss über die ID des aktuellen Eintrags erfragt werden.
                  Da die hier abgearbeiteten Einträge keine Kind-Einträge besitzen, scheitert die Abfrage. Es können maximal Zufallstreffer entstehen, wenn es wirklich die Tabelle gibt und dort ein Eintrag existiert der die gleiche ID hat wie die PID des Eintrags -> wäre aber der falsche Eintrag!

                  Ich würde empfehlen das ganze mal als richtige SQL Abfragen zu schreiben, damit man das nötige Gespür entwickelt. Auch ist SQL gut leserlich. CCs Methoden sind sicher "handy", aber für erste Gehversuche eher verwirrend.

                  ps. die Tabellennamen sind sehr seltsam

                  ---
                  So sieht die Datenbankstruktur aus (hier mit 2 Kind-Tabellen, kann aber unendlich gedacht werden)

                  Code:
                    myTable1
                    -- myTable2
                    --- myTable3
                    
                    $objParent = \Database::getInstance()->prepare("SELECT * FROM myTable1 WHERE id=?")->limit(1)->execute( --- PID-DES-AKTUELLEN-EINTRAG--- ); // ist genau ein Datensatz
                    $objMyEntry = \Database::getInstance()->prepare("SELECT * FROM myTable2 WHERE id=?")->limit(1)->execute( --- ID-DES-AKTUELLEN-EINTRAG--- ); // aktueller datensatz
                    $objChilds = \Database::getInstance()->prepare("SELECT * FROM myTable3  WHERE pid=?")->execute($id); // kann mehr als ein Datensatz sein
                  http://www.premium-contao-themes.com

                  Kommentar

                  Lädt...
                  X