Datenbankabfrage in TypoScript

  • 0 x
    25 Beiträge
    1 Hilfreiche Beiträge
    31. 01. 2010, 20:23

    Moin,
    ich möchte gerne eine Datenbankabfrage in TypoScript realisieren.

    in PHP sähe es so aus

    1. $time=time();
    2. $termin = SELECT termine.Datum, termine.Ort, termine.Platz FROM termine WHERE termine.timecode > $time LIMIT 1;

    Mit [i]echo $termin[/i] geb ich es dann ja an der entsprechenden Position aus.

    Mit der Extension [b]wfqbe[/b] 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 [b]Dokumentation und Literatur für den Einstieg Thread[/b] ist tot.


  • karlchen karlchen
    Jedi-General
    0 x
    1433 Beiträge
    30 Hilfreiche Beiträge
    31. 01. 2010, 21:33

    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
    http://typo3.org/documentation/document-library/references/doc_core_tsref/4.2.0/view/1/8/#id4251042

    was den anderen Link angeht:
    http://wiki.typo3.org/index.php/De:ts45min

  • 0 x
    25 Beiträge
    1 Hilfreiche Beiträge
    31. 01. 2010, 22:34

    Hm,
    damit kann ich mir zwar den CONTENT an der Stelle anzeigen lassen, wo ich eigentlich den Termin hin haben will, aber wenn ich

    [TS]...
    TERMIN = CONTENT
    TERMIN.table = termine
    termine = TEXT
    termine.field = ort
    [/TS]

    eingebe, dann müsste doch eigentlich jeder Ort der Tabelle Termine angezeigt werden.

    Wird er aber nicht.

    geb ich aber

    [TS]...
    TERMIN = CONTENT
    TERMIN.table = tt_content
    tt_content = TEXT
    tt_content.field = header
    [/TS]
    ein, wird mir der Inhalt des Contents angezeigt.

    habe es dann noch mit

    [TS]...
    TERMIN = CONTENT
    TERMIN.table = pages
    pages = TEXT
    pages.field = title
    [/TS]

    versucht. Sollte doch eigentlich auch wieder der Title von pages angezeigt werden. Wird er aber auch nicht.

    Oder hab ich da nen Denkfehler?

  • karlchen karlchen
    Jedi-General
    0 x
    1433 Beiträge
    30 Hilfreiche Beiträge
    31. 01. 2010, 23:36

    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.
    [TS]TERMIN = CONTENT
    TERMIN.table = termine
    termine = TEXT
    termine.field = ort
    [/TS]

    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.

  • 0 x
    25 Beiträge
    1 Hilfreiche Beiträge
    01. 02. 2010, 11:16

    Guten Morgen,

    naja mein letzter Stand gestern Abend war dieser.

    [TS]//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
    }
    }
    }
    [/TS]

    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# :D

    Wie bekomme ich denn nun die Tabelle in das $TCA-array?

    Wenn ich nen compare mache, will er mir dir Tabelle immer löschen.

  • einpraegsam.net einpraegs...
    MacGyver
    0 x
    9340 Beiträge
    80 Hilfreiche Beiträge
    01. 02. 2010, 11:23

    Erstelle deine Tabelle einfach als Extension über den Kickstarter, dann hast du das Problem nicht!

    in2code.de - Wir leben TYPO3
    - Möchtest du TYPO3 komplett verstehen? Eigene Erweiterungen erstellen? Bei uns gibt es auch Schulungen https://www.in2code.de/produkte/typo3-schulungen/
    - Die Arbeit mit TYPO3 macht dir Spaß? Du stehst auf Berge? Komm zu uns! https://www.in2code.de/agentur/karriere/

  • 0 x
    25 Beiträge
    1 Hilfreiche Beiträge
    01. 02. 2010, 13:51

    Ok, gesagt getan.

    Nun ist der Fehler auch weg, aber meine Ausgabe wird noch immer nicht angezeigt.
    o.O

    [TS]//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
    }

    }
    }
    [/TS]

    Das COA wird in der Anleitung rot angezeigt, bei mir blau. Macht das ein unterschied? Hab Typo4.3.0

  • igorshmigor igorshmig...
    Jedi-Ratsmitglied
    0 x
    941 Beiträge
    0 Hilfreiche Beiträge
    01. 02. 2010, 14:15

    Wenn sich die Daten auf einer anderen Seite als der aktuellen befinden musst Du noch pidInList für die Select-Anweisung angeben.
    Etwa so:
    [TS]select{
    max = 1
    selectFields = Datum, Ort, Platz
    pidInList=---ID(s) der Seite(n), mit Termin-Einträgen (mehrere IDs mit Komma getrennt)---
    }
    [/TS]

  • 0 x
    25 Beiträge
    1 Hilfreiche Beiträge
    01. 02. 2010, 15:05

    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.

    [img]http://www.weckheuer-motorsport.de/downloads/layout.JPG[/img]

    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.

  • igorshmigor igorshmig...
    Jedi-Ratsmitglied
    0 x
    941 Beiträge
    0 Hilfreiche Beiträge
    01. 02. 2010, 15:51

    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.