Moin,
ich möchte gerne eine Datenbankabfrage in TypoScript realisieren.
in PHP sähe es so aus
$time=time();
$termin = SELECT termine.Datum, termine.Ort, termine.Platz FROM termine WHERE termine.timecode > $time LIMIT 1;
Mit echo $termin geb ich es dann ja an der entsprechenden Position aus.
Mit der Extension wfqbe habe ich auch eine Abfrage in einem Content hin bekommen. Aber mit dem TS klappt das noch nicht so.
Das ganze soll dann dem Marker Termin zugeordnet werden.
Bin jetzt aber auch noch ein absoluter Neuling im TypoScript.
Danke
Marcel
ps: der Link http://wiki.typo3.org/De:ts45min im Dokumentation und Literatur für den Einstieg Thread ist tot.
hallo,
in TypoScript kannst du für Datenbank Abfragen das CONTENT Objekt nutzen.
Hier ist ein gut kommentiertes Beispiel
http://www.typo3wizard.com/de/artikel/das-content-objekt.html
Unter CONTENT in der TypoScript Referenz findest du noch weitere Optionen
https://docs.typo3.org/m/typo3/reference-typoscript/main/en-us/ContentObjects/Index.html
was den anderen Link angeht:
http://wiki.typo3.org/index.php/De:ts45min
Hm,
damit kann ich mir zwar den CONTENT an der Stelle anzeigen lassen, wo ich eigentlich den Termin hin haben will, aber wenn ich
...
TERMIN = CONTENT
TERMIN.table = termine
termine = TEXT
termine.field = ort
eingebe, dann müsste doch eigentlich jeder Ort der Tabelle Termine angezeigt werden.
Wird er aber nicht.
geb ich aber
...
TERMIN = CONTENT
TERMIN.table = tt_content
tt_content = TEXT
tt_content.field = header
ein, wird mir der Inhalt des Contents angezeigt.
habe es dann noch mit
...
TERMIN = CONTENT
TERMIN.table = pages
pages = TEXT
pages.field = title
versucht. Sollte doch eigentlich auch wieder der Title von pages angezeigt werden. Wird er aber auch nicht.
Oder hab ich da nen Denkfehler?
schade, das wird in dem ersten Link den ich gepostet habe in dem Beispiel TypoScript eigentlich alles recht gut kommentiert.
Deine TypoScript Syntax funktioniert so nicht.
TERMIN = CONTENT
TERMIN.table = termine
termine = TEXT
termine.field = ort
Mit CONTENT kannst du nach definierten Vorgaben (mein 2ter Link) eine Datenbankabfrage machen und dessen Rückgabewerte mit renderObj als TEXT ausgeben.
In deinem TERMIN Marker/SubPart sagst du nur table=termine, damit hast du aber noch nicht automatische alle Datenbankfelder in einem Marker/Subpart "termine"
Mit tt_content funktioniert es deshalb, weil in css_styled_contentbereits ein Objekt definiert ist, welches tt_content heißt.
Schau dir die Beispiele noch mal an, dann klären sich einige deiner Fragen sicher von selbst.
Guten Morgen,
naja mein letzter Stand gestern Abend war dieser.
//TERMIN
TERMIN = CONTENT
TERMIN{
table = termine
wrap = |
select{
selectFields = Datum, ort, Platz
where uid = 1
}
renderObj = COA
renderObj{
10 = TEXT
10{
required = 1
wrap = |
field = Datum
}
}
}
Soweit sogut. Ging leider auch nicht. Also hatte ich mir nochmal die Kommentare genauer angeguckt.
Dort steht, dass nur Tabellen mit den Präfixen tt_,tx_ ... gehen.
Also, Tabelle umbenannt. Nun bekomme ich den Fehler
NO entry in the $TCA-array for the table "tt_termine". This means that the function enableFields() is called with an invalid table name as argument.
Da hatte ich dann gestern Abend etwas genervt den PC ausgeschaltet #angry# 😃
Wie bekomme ich denn nun die Tabelle in das $TCA-array?
Wenn ich nen compare mache, will er mir dir Tabelle immer löschen.
Erstelle deine Tabelle einfach als Extension über den Kickstarter, dann hast du das Problem nicht!
Ok, gesagt getan.
Nun ist der Fehler auch weg, aber meine Ausgabe wird noch immer nicht angezeigt.
o.O
//TERMIN Marker
TERMIN = CONTENT
TERMIN{
#Zuweisung der Tabelle
table = tx_termine_2010
wrap = |
select{
#Anzahl der maximalen Einträge
max = 1
#Auswahl der DB_Felder
selectFields = Datum, Ort, Platz
}
#Generierung der Ausgabe
renderObj=COA
renderObj{
#Feld 1
10 = TEXT
10{
required = 1
wrap = |
field = Datum
}
#Feld 2
20 = TEXT
20{
required = 1
wrap = |
field = Ort
}
#Feld 3
30 = TEXT
30{
required = 1
wrap = |
field = Platz
}
}
}
Das COA wird in der Anleitung rot angezeigt, bei mir blau. Macht das ein unterschied? Hab Typo4.3.0
Wenn sich die Daten auf einer anderen Seite als der aktuellen befinden musst Du noch pidInList für die Select-Anweisung angeben.
Etwa so:
select{
max = 1
selectFields = Datum, Ort, Platz
pidInList=---ID(s) der Seite(n), mit Termin-Einträgen (mehrere IDs mit Komma getrennt)---
}
Hm, kann ich die nicht direkt aus einer Tabelle auslesen?
Will ja keine normale Seite mit den Daten füllen.
Es soll ja zum schluss auf allen Seiten per Template erscheinen in einem kleinen Fenster.
Bild: weckheuer-motorsport.de/…/layout.JPG
Und dort soll anhand des Timestamps der Termin automatisch erscheinen. Immer der Aktuellste, wo der Timestamp nicht älter als der tatsächliche ist.
Das ganze gehört somit zum ROOT-template
Hm, hoffe ist verständlich. Danke aber schonmal für die Hilfen.
Wenn Du pidInList nicht angibst wird automatisch die ID der aktuellen Seite als Parent-ID verwendet. Somit würden nur Einträge gefunden werden, die sich auf der aktuellen Seite befinden. Du kannst es ja mal ausprobieren, indem Du direkt auf der Test-Seite über das List-Modul Termine einträgst. Die zeigt er Dir dann wahrscheinlich an.
Häufig werden Daten in einem speziellen Sys-Ordner eingetragen und dem TypoScript der Extension dann per Konstante oder TypoScript die ID des Sys-Ordners übergeben.
Oder aber Du löst es über PHP. Wenn Du schon eine Extension schreibst bietet sich das ja an.
Hm, wie?
Ich habe eine Tabelle tx_termine_2010 wo alle Termine drine stehen, die aber auf keiner Seite vorhanden sind.
Diese sollen nun ausgelesen werden. Eigentlich mit SQL ja nicht so schwer. Nur häng ich da noch etwas am Typoscript, da ich mich damit noch nicht so auskenne.
Da ist es doch egal, was da für eine Pageid ist, soll ja eh auf jeder Seite angezeigt werden.
Zumindestens verstehe ich das so. Das mit der PageID ist doch nur wichtig, wenn ich den Inhalt einer bestimmten Page wiedergeben will oder nicht?
Aber ich will ja wie oben beschrieben eine Tabelle auslesen, die auch über jede Seite erreichbar ist.
Also einen direkten Datenbank zugriff wo dann die Felder Ort, Platz und Datum ausgelesen und angezeigt werden sollen.
Und zwar nur von dem, wo der Timecode größer als der timestamp ist und immer nur den nächst größten. Wenn also 5 größer sind soll der kleinste der größeren Angezeigt werden.
Die sql Abfrage dazu steht ja schon weiter oben.
Hoffe es ist verständlich wie ich es meine
Ach, die sind auf gar keiner Seite! Das macht es mit TypoScript etwas schwieriger. Hat denn die Tabelle überhaupt eine Spalte 'pid'? Wird diese PID für irgendwas verwendet? Ansonsten mal ausprobieren, was passiert, wenn du eine Spalte namens pid anlegst, per default mit dem Wert 1 befüllst und in TypoScript sagst select.pidInList=1.
wieso legst du die termine den nicht auch mit TYPO3 an ?
Scheinbar nutzt du ja jetzt irgendwas anderes, um die Daten in die Datenbank zu importieren.
Die PID (ParentID/PageID) ist im Kontext von TYPO3 wichtig um bestimmen zu können welche Datensätze zu selektieren sind, man will ja nicht immer alle ausgeben.
Um nochmal auf den Tipp von einpraegsam.net zurück zu kommen, erstelle alles Tabelle+Felder mit dem Kickstarter, dann werden die restlichen obligatorischen Felder alle angelegt.
Dann erstellst du eine Seite vom Typ Sys_ordner und legst da deinen ganzen Termine rein, jetzt kannst du TypoScript "normal" nutzen um auf die Sachen zuzugreifen.
Aber das würde ja bedeuten, das ich alle Termine neu anlegen muss oder?
Habe es ja mit Kickstart angelegt und alle Typo3 bezogenen Felder wieder rausgeworfen, damit ich mein Dump einspielen konnte. Wären ja sonst eh alle null bzw 0.
Also alles neu Eingeben sehe ich derzeit noch nicht als Alternative an. Nur wenn es wirklich nicht anders geht.
Aber warum kann ich den Inhalt der selben Tabelle im Content ausgeben, aber halt nich per Typoscript in template?
Für den Content benutze ich die Ext. DB Integration(wfqbe)
Darüber kann ich ja Select Abfragen generien und halt ausgeben. Geht das nicht auch per Typoscript?
So, hab mich heute mal wieder ran gewagt.
Einbinden des PHP-Scripts mit dem Marker TERMIN
seite.10.marks.TERMIN = PHP_SCRIPT
seite.10.marks.TERMIN.file = fileadmin/scripts/termin.php
Das verwendete PHP-Script
<?PHP
$server = 'localhost';
$username = '………';
$password = '…………………';
$datenbank = '………………';
/* Stellt Verbindung zu Datenbank her */
$db = @ mysql_connect( $server , $username , $password )or die ( 'Datenbankverbindung fehlgeschlagen: ' . mysql_error () );
/* Wählt eine Datenbank aus */
$db_select = @ mysql_select_db( $datenbank ) or die ( 'Auswahl der Datenbank fehlgeschlagen' );
$time = time();
/* Select-Abfrage */
$sql = 'SELECT `Datum`, `Ort`, `Platz` FROM `termine` WHERE `timecode` > "$time" LIMIT 1';
$result = mysql_query ( $sql );
/* Ausgabe */
while ( $row = mysql_fetch_array ( $result ) )
{
echo 'am ' . $row['Datum'] . '<br>';
echo $row['Ort'] . ' <br>';
echo $row['Platz'] . '<br>';
}
?>
Soweit sogut, nun Zeigt er mir auch die Daten an, aber nicht da wo ich will, sondern oben Links in der Ecke und nicht beim Marker.
Das Marker Zeichen ist aber verschwunden, somit muss es ja auch richtig verknüpft sein?! Auch liegen die eingebetteten Bilder im template html File über der Ausgabe des PHP-Scripts.
Hab ich da noch irgendwo nen Denkfehler drin?
Muss ich beim PHP-Script mich nochmal extra mit der DB verbinden oder kann ich da die Anmeldedaten von Typo3 mit übernehmen?
Danke