Zum Inhalt springen

Raw-Query auf eigene Tabelle

Erstellt am 8. Oktober 2009 · 7 Antworten · letzte Antwort am 9. Oktober 2009

Tags: Frage

krom ·

Grüße!

Verzweifelt versuche ich jetzt schon den ganzen Tag eine absolut simple Abfrage auf eine Tabelle einer meiner Erweiterungen durchzuführen. (namentlich "tx_mitarbeiter_mitarbeiter")

Nach ewigem Hin- und Her habe ich zumindest herausgefunden, dass das CONTENT Object (welches mir als das korrekte Object für diese Aktion erschien) korrekt gefüllte pidInList und uidInList Variablen erwartet, sonst tut sich erstmal garnichts.
pidInList ist relativ einfach - das ist in meinem Falle stets 0.
uidInList ist der Knackpunkt, an dem ich scheitere:

Die UIDs sind mir ja erstmal garnicht bekannt. Ich möchte einfach eine Menge an Zeilen aus der Abfrage zurückbekommen, auf die meine Bedingung zutrifft. Diese Bedingung bezieht sich nicht auf die UID.
Das Problem ist, so wie ich das sehe, muss ich aber bei uidInList etwas angeben, sonst tut sich garnichts.

Ich bin langsam ein bisschen frustriert, dass mich etwas, was ich in MySQL in ein paar Sekunden zusammengeschustert habe, mich bei TYPO3 jetzt schon einen ganzen Tag gekostet hat, ohne jedes brauchbares Ergebnis. 🙁
Kann ich nicht einfach "irgendwie" einen RAW Query absetzen, ohne irgendwelche Konstrukte zu benutzen, die gut gemeint sind, mich aber permanent gegen eine unsichtbare Wand fahren lassen? 🙁
Innerhalb des PHP Codes einer Erweiterung steht mir ja auch global eine Referenz auf die Datenbank Instanz zur Verfügung:

$GLOBALS['TYPO3_DB']->sql(TYPO3_db, "SELECT * FROM foo");

Genau das bräuchte ich für TypoScript, damit ich ganz simpel ein Query nach meinem Gusto absenden kann.

Nachfolgend, eine der Versionen, die ich mir zusammengeschustert habe und die auch funktioniert. Leider jedoch benötige ich hier die erwähnte Angabe der - mir später nicht mehr bekannten - UIDs:

temp.test = CONTENT
temp.test {
    table = tx_mitarbeiter_mitarbeiter
    
    select {
        pidInList = 0
        uidInList = 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15
        where = division=4
    }    
    renderObj  = COA
    renderObj {
        10 = TEXT
        10 {
            field = firstname
            wrap = >>|<<<br />
        }
    }
}
page.10.marks.test < temp.test

Ich wäre für jeden Hinweis echt dankbar! 🙂

Vielen Dank & mit besten Grüßen,

KROM

Unbekannter Benutzer ·

du brauchst keine uidInList angeben, pidInList und where reicht. Allerdings befürchte ich, dass es mit pid 0 nicht geht, kannst du den entries nicht einen sysfolder spendieren?

krom ·

Das Ding ist, sobald ich das uidInList weglasse, bekomme ich keine Auflistung mehr. Füge ich es hinzu und gebe ein paar UIDs an, dann funktionierts. :o

Für die Einträge einen Sysfolder anzulegen - daran hab ich noch nicht gedacht. Ob es wirklich an der pid liegt? Morgen mal probieren, gebe dann Feedback. 🙂

Erstmal Danke und schönen Abend!
KROM

Unbekannter Benutzer ·

Müsste ich jetzt selbst testen, weil ich das in dieser Form nie probiert habe, aber meines wissens muss entweder pidInList oder uidInList benutzt werden. Ich vermute pidInList wird bei 0 als nicht benutzt gewertet.

krom ·

Hm also "einfach so" einen Sysfolder zu erstellen und bei den Mitarbeitereinträgen die pid entsprechend zu setzen, klappt leider nicht.
Ich glaube ich mache da etwas prinzipiell falsch.

Was ich eigentlich machen möchte ist, Mitarbeiter im Backend einzupflegen und dann im Frontend auf verschiedenen Seiten auszugeben.

Für das einfache Einpflegen im Backend habe ich mir eine Backend-Erweiterung gebastelt, die sich im Bereich "User Tools" wiederfindet. Dort werden die Mitglieder aufgelistet, eingetragen und editiert. Diese Erweiterung schreibt die Mitarbeiterdaten in eine Tabelle "tx_mitarbeiter_mitarbeiter".
Damit sind die Daten schon mal "irgendwo" im System.

Jetzt war der Plan, eine normale FE Seite zu erstellen, wo ich die Mitarbeiter dann ausgebe. Diese FE Seite bekommt Unterseiten, auf denen jeweils nur ein Teil der Mitarbeiter ausgegeben werden soll, was mittels des "division=X" in der WHERE Bedingung des Query eingeschränkt wird.

Ich dachte mir, dass ich um die Erstellung einer weiteren Erweiterung für die Ausgabe im FE herumkomme. Schnell mal im TS der Mitarbeiterseite ein Query auf die Datenbanktabelle der Mitarbeiter abgefeuert, über das Ergebnis iterieren, das HTML rendern und in den Contentbereich einfügen. So zumindest der Plan. 🙂 Irgendwie scheitere ich aber an dem eigentlich simpelsten von allem, nämlich daran, die Einträge aus der Datenbank zu lesen.
Da sind irgendwelche internen Dinge am Werke, von denen ich noch nichts verstehe. Ich denke möglicherweise noch zu sehr im Kontext von PHP und MySQL, TYPO3 ist da glaube ich bei einigen Dingen etwas eigen - sicher sehr mächtig, wenn man den Überblick einmal hat, aber am Anfang einfach nur total verwirrend. 🙂 Teilweise mächtig veraltete und verstreute Dokumentationen machen es nicht wirklich einfacher. 🙁

Das so vielleicht als Hintergrundinformation, was ich eigentlich wie vorhabe.
Würdest Du sagen dass der von mir eingeschlagene Weg so prinzipiell nicht ganz falsch ist? Oder bin ich da völlig auf dem Holzweg?

Gibts denn sonst keine einfache Möglichkeit von irgendwelchen Systembeschränkungen losgelöst SQL Queries abzusenden? Ich meine, die pids und uids der Mitarbeiter Tabelle haben mit denen der Seite, wo der Query erstellt wird, überhaupt nichts gemeinsam. Wenn ich irgendwie an die Daten mittels TS herankomme, dann kann ich mir eine Erweiterung oder eine Programmierung in PHP sparen. Ansonsten muss ich irgendwie gucken, dass ich eine UserFunc aufrufe, die mir eine Renderklasse aufruft, die dann den Content für mich rendert. Wäre ein bisschen von hinten durch die Brust ins Auge, aber wäre in kurzer Zeit realisiert, weil ich dann wieder in meinem Element bin. 🙂

Vielen Dank und beste Grüße!
KROM

Unbekannter Benutzer ·

Also was mir dazu gerade einfällt, gibt es einen TCA Eintrag für diese Tabelle? Hast du die mit dem Kickstarter erstellt?
Das ist schon mal Vorraussetzung für eine Query mit TS.

Danach müsste sowas gehen:

temp.test = CONTENT
temp.test {
    table = tx_mitarbeiter_mitarbeiter
    select {
        pidInList = PID_DEINES_SYSORDNERS
        where = division=4
    }    
usw.

wie du es schon gemacht hattest. Probier auch mal statt einem Sysordner eine normale Seite.

Eigentlich kannst du die Sachen im Backend doch im Listenmodul ganz einfach anlegen, wenn es ein TCA gibt.

Alternativ kannst du in einer userFunc die Query ausführen und dann TS zum rendern des HTML benutzen. Aber nötig ist das nicht.

krom ·

Vorab noch mal vielen Dank für Deine Rückmeldungen.
Der Hinweis mit dem Sysordner hat mich auf die Fährte des Problems gebracht...

Und zwar kann ich die, an völlig anderer Stelle, eingetragenen Mitarbeiter tatsächlich in diesem neu erstellten Sysordner finden, und zwar wenn ich mir diesen in der "List" Ansicht ansehe. Wie da intern auf einmal die Verknüpfung zwischen der Tabelle der Mitarbeiter und dem Sysfolder hergestellt wird, ich habe keine Ahnung.

Jetzt habe ich ein bisschen rumprobiert und irgendwie kam ich auf die, für mich bekloppte, Idee, den Sysfolder mal nicht als "hidden" zu deklarieren. ( Ich hatte ihn auf "hidden" gesetzt, weil ich die Navi mit einer eigenen Funktion rendere, die auch Sysfolder rendert, welche ich wiederum hier und da zur Strukturierung der Seiten missbrauche). Und siehe da, die Abfrage liefert problemlos die Ergebnisse, die ich brauche. #angry#
Wo da der Zusammenhang ist...ich habe keine Ahnung. Aber jetzt funktionierts auf jeden Fall. 🙂

Dann sag ich erstmal vielen Dank für die Denkanstöße!
Ich weiß zwar jetzt immer noch nicht, wie man einen "raw-query" absetzt, aber das brauche ich jetzt auch nicht mehr.

Beste Grüße,
KROM

Unbekannter Benutzer ·

Naja, (fast) jeder Datensatz in TYPO3 hat eine pid, die die uid der Seite ist, zu der der Datensatz gehört, danach guckt TYPO3. D.h. wenn du in der Listenansicht einer Seite bist, geht TYPO3 über alle im TCA definierten Tabellen und selected mit pid= uid der Seite. Und bei TS Queries werden immer automatisch alle "Spezial-"spalten wie hidden, deleted berücksichtigt. Und da CONTENT sich auf eine Seite bezieht (über die pidInList) wird auch geprüft ob die Seite für einen FE User überhaupt erreichbar ist.