Contao hat eine rekursive Funktion in der Database class: getChildRecords: https://github.com/contao/core/blob/...abase.php#L427
Damit kannst du anhand einer oder mehrer Tags ID rekursiv alle Kind-Ids erfragen. Rückgabe ist ein Array mit den Ids. Daraufhin die Tags-Werte über diese Ids erfragen.
Ankündigung
Einklappen
Keine Ankündigung bisher.
Ausgabe Tags
Einklappen
X
-
Die PID des Kindelements ist die ID des Elternelements. Damit z.B. eine weitere Abfrage je Kind durchführen oder per JOIN innerhalb einer Abfrage. Etwas leichter zu handeln ist es sicher mit einer zusätzlichen Abfrage je Kind.
Post #12 zeigt wie eine Schleife je Kind durchlaufen wird.
- 1 Likes
Einen Kommentar schreiben:
-
Zitat von Tim Beitrag anzeigenbei genau einem Tag
PHP-Code:$arrTags = deserialize($entry->field('tag-name')->value()); // array (ids)
$objTags = \Database::getInstance()->prepare("SELECT * FROM tl_pct_customelement_tags WHERE id IN(".implode(',',$arrTags).")")
->limit(1)
->execute();
echo $objTags->title;
Zuletzt geändert von Manuel; 24.10.2016, 10:02.
Einen Kommentar schreiben:
-
Alle Datensätze bekommst du ohne Limit und z.B. in einer while Schleife oder mit dem Aufruf ->fetchAllAssoc() bzw. direkt für ein Feld: fetchEach();
Hier bitte selbstständig in Contaos core Codes schauen oder anderen Code als Referenz anschauen wie dort ähnliche Abfragen getätigt wurden.
Hier ein Beispiel, Ausgabe Tags id 1,2,3
PHP-Code:$arrTags = array(1,2,3);
$objTags = \Database::getInstance()->prepare("SELECT * FROM tl_pct_customelement_tags WHERE id IN(".implode(',',$arrTags).")")->execute();
if($objTags->numRows > 0)
{
echo implode(',', $objTags->fetchEach('title');
}
Sobald der Code im Template des versteckten Felds eingesetzt wird, erscheint nur eine weiße Seite.
Unbedingt anfangen Arrays / Variablen zu prüfen, bevor man foreach Schleifen feuert.
Einen Kommentar schreiben:
-
Die Abfrage funktioniert ja auch bestens, wenn sie direkt im Leser Template verwendet wird.
Sobald der Code im Template des versteckten Felds eingesetzt wird, erscheint nur eine weiße Seite.
---
Nachtrag: mit dem Inserttag funktioniert es nun aber -> der Schreibfehler $objTags war die Ursache.
Was nun nur noch fehlt, ist das nur das erste Tag ausgegeben wird.
Wie können denn alle zum Datensatz gehörigen Tags ausgegeben werden?
Konnte mir die Frage selbst beantworten...
PHP-Code:<?php
$arrTags = deserialize($this->replaceInsertTags( '{{customcatalog::cc_reisedetail::autoitem::reise_altersgruppe}}' )); // array (ids)
$ar = count($arrTags);
$i = 0;
?>
<input type="hidden" name="<?= $this->name ?>" value="<?php foreach ($arrTags as $arrTag => $tag):
$i++;
$objTags = \Database::getInstance()->prepare("SELECT * FROM tl_pct_customelement_tags WHERE id=$tag")->execute();
echo($objTags->title);
if ($i<$ar): echo(", ");
endif;
endforeach; ?>">Zuletzt geändert von eblick; 03.09.2016, 15:14.
Einen Kommentar schreiben:
-
Zitat von eblick Beitrag anzeigenHab ich ja gemacht - siehe oben...#5
echo $objTags->title;
(ps. bei mir war's auch falsch und keiner hat's gesehen . Alle Mann hier schön die copy & paste Falle gelaufen ) (änder ich gleich mal oben)Zuletzt geändert von Tim; 02.09.2016, 13:29.
Einen Kommentar schreiben:
-
Ich würde hier für das versteckte Feld auch nen eigenes Template nutzen und darin alles verpacken. Das sollte gut klappen.
Einen Kommentar schreiben:
-
Sag mal in Worten was Du vorhast.
Ich habe ein Buchungsformular auf einer Leser-Seite. Bei Absenden werden über das Notification Center Benachrichtigungen an Kunde und Anbieter verschickt.
Diese beinhalten neben den Formulardaten auch Infos zum Objekt (Reise) wie z.B. Reisenummer, Altergruppe (Tag-Feld) usw.
Die Infos werden als versteckte Felder über Inserttag im Formular mit abgefragt damit sie dem Notification Center zur Verfügung stehen. Das funktioniert auch bei einfachen Textfeldern prima.
Für Datumsfelder habe ich für die versteckten Felder jeweils ein eigenes umformatiertes Template genommen.
Bei den Tag-Felder mags aber nicht so richtig klappen...
Einen Kommentar schreiben:
-
Wozu das Inserttag? Du bist doch sicher eh in einem Leser. Da brauchts kein Inserttag, alle Felder kommen rein.
Mit der aktuellen Tags Version kannst du auch so abfragen:
$objTagsModel = \PCT_Tags::findById('meineTagId');
Sag mal in Worten was Du vorhast.
Einen Kommentar schreiben:
-
kann es sein, dass dies in Kombination mit Inserttags in einem versteckten Formularfeld nicht funktioniert?
PHP-Code:<?php $arrTags = deserialize($this->replaceInsertTags('{{customcatalog::cc_reisedetail::autoitem::reise_altersgruppe}}'));
Code:array(1) { [0]=> string(3) "271" }
PHP-Code:$objTags = \Database::getInstance()->prepare("SELECT * FROM tl_pct_customelement_tags WHERE id IN(".implode(',',$arrTags).")")->limit(1)->execute($entry->field('tag')->value());
echo $objTag->title;
Einen Kommentar schreiben:
-
bei genau einem Tag
PHP-Code:$arrTags = deserialize($entry->field('tag-name')->value()); // array (ids)
$objTags = \Database::getInstance()->prepare("SELECT * FROM tl_pct_customelement_tags WHERE id IN(".implode(',',$arrTags).")")
->limit(1)
->execute();
echo $objTags->title;
Zuletzt geändert von Tim; 02.09.2016, 13:19.
Einen Kommentar schreiben:
-
Kannst du mir sagen wie so eine Abfrage aussieht oder einen Verweis geben, wo das beschrieben ist?
Einen Kommentar schreiben:
Einen Kommentar schreiben: