Zum Inhalt springen

Datensätze von eigener Extension ordnen

Erstellt am 5. Dezember 2006 · 7 Antworten · letzte Antwort am 25. Juni 2007

Tags: Datenbank, Frage

BackBuckle ·

Folgendes Problem:

Ich habe eine eigene Extension über Kickstart generiert. Funktioniert auch ganz gut. Es handelt sich um einen kleinen Theaterspielplan. Leider habe ich keine Ahnung wie ich die einzelnen Datensätze ordne. Im Backend geht das (im Kickstarter ja einstellbar) einwandfrei, aber im Fronend bewegt sich nichts. Datensätze bleiben an alter Stelle. Wo kann ich einstellen, dass sich Datensätze auch im Frontend in gewünschte Reihenfolge bekomme?

Hoffe jemand kann mir helfen.

Viele Grüße
Micha #paralyzed#

kanti ·

Hallo BackBuckle,

Du holst doch die Daten für Deinen Spielpaln aus der Datenbank (SELECT)? Warum nimmst Du dann nicht ORDER BY?

Grüsse Kanti

Bitbull ·

Hi BackBuckle,

um kantis Ausführungen zu ergänzen:

ORDER BY sorting

"sorting" ist das Feld Deiner Tabelle, das Du im Kickstarter angelegt hast, wenn Du die Checkbox "Manual ordering of records" aktiviert hast.

Es besteht gerade anfänglich die Möglichkeit, dass man dies vergessen hat. Als Folge werden die Datensätze in der Ordung der Eingabe (Default: ORDER BY uid) angezeigt, was in den meisten Fällen auch zunächst zutrifft -> im BE werden diese dann "korrekt" angezeigt; erst bei späteren Ergänzungen stellt man fest, dass eine Sortierung unmöglich ist.

Fehlt das Feld "sorting", hat man dann keine Möglichkeit, die DS neu zu ordnen.

Durch die Option "Edit in Kickstarter" hat man aber die Chance, die Checkbox zu aktivieren und die Extension neu zu erstellen.

beste Grüße

Bitbull

BackBuckle ·

Vielen Dank für die Antworten. Leider klappts noch nicht.

Ich habe folgendes gemacht: Ich habe die Extension nochmal neu erstellt, habe die Checkbox aktiviert und die Tabelle hat das Feld "sorting" erstellt.
Nun komme ich leider nicht weiter (bin da mit den Datenbanken nicht so der Meister 😉) Dieses "ORDER BY sorting" muss ich manuell sicher irgendwo einfügen. Naja ich habe es jetzt schon versucht in den SQL-Befehl einzufügen. Sah richtig aus, scheint es jedoch nicht zu sein, da es nicht funktioniert hat und die Datensätze nach wie vor bocksteif an ihrem Platz verharren. Was mache ich falsch und wo muss ich was ändern? Ich versuche so lange weiter mein Glück und vertraue auf euch 😉

Hilfe!!

Nachtrag:
Bitte schnell helfen - ich verzweifel sonst! Muss ich vielleicht was in der class.meinplugin_pi1.php ändern? Die Datenbankabfrage sieht so aus:

// Die Datenbank ansprechen und in einer Schleife ausgeben
   $query = "SELECT * FROM user_spielplan_main"; 
   $query.=" WHERE deleted = 0 AND hidden = 0  AND pid ='".$spielplanPageId."'";
   $res = mysql(TYPO3_db,$query);
   while($row = mysql_fetch_assoc($res)) {

Muss ich in Zeile 2 vielleicht "ORDER BY sorting" einfügen? Habe es versucht, bekomme leider eine Fehlermeldung! Was kann ich machen, um meine Contentelemente nicht nur im Backend verschieben zu können, sondern auch auf der eigentlichen Website diese Verschiebung deutlich wird!

Micha

BackBuckle ·

Problem gelöst!
6er im Lotto! Habe Problem gelöst!

So wirds gemacht:

// Die Datenbank ansprechen und in einer Schleife ausgeben
   $query = "SELECT * FROM user_spielplan_main"; 
   $query.=" WHERE deleted = 0 AND hidden = 0  AND pid ='".$spielplanPageId."'";
   $res = mysql(TYPO3_db,$query);
   while($row = mysql_fetch_assoc($res)) {

Zeile 2 ändern in

$query = "SELECT * FROM user_spielplan_main ORDER BY sorting";

und Zeile 4 in:

$res = $this->pi_exec_query('user_spielplan_main','','','','','sorting');

Jetzt klappt alles wunderbar und Container lassen sich schieben!

Gruß Micha

Bitbull ·

Hi BackBuckle,

um jenses zu ergänzen:

Du kannst in PHP mehrere Varianten der Abfrageerstellung programmieren:

Variante 1:
Ändere Deinen Code:

// Die Datenbank ansprechen und in einer Schleife ausgeben
   $query = "SELECT * FROM user_spielplan_main"; 
   $query.=" WHERE deleted = 0 AND hidden = 0  AND pid ='".$spielplanPageId."'";
   $res = mysql(TYPO3_db,$query);
   while($row = mysql_fetch_assoc($res)) {

in:

// Die Datenbank ansprechen und in einer Schleife ausgeben
   $query = "SELECT * FROM user_spielplan_main"; 
   $query.=" WHERE deleted = 0 AND hidden = 0  AND pid ='".$spielplanPageId."' ORDER BY sorting";
   $res = mysql(TYPO3_db,$query);
   while($row = mysql_fetch_assoc($res)) {

Wesentlich eleganter und "Typo3-spezifischer" ist Deine
Variante 2:

$res = $this->pi_exec_query('user_spielplan_main','','','','','sorting');

Ich bevorzuge eigentlich immer die 2. Variante, weil dadurch z.B. bereits von Typo3 die Datenbankabstraktion (also die theoretische Möglichkeit, auch andere Datenbanken außer MySQL anzusprechen) unterstützt wird. Schau Dir bitte ferner mal die von der Funktion pi_exec_query (findest Du in "class.tslib_pibase.php) erwarteten Übergabeparameter an:

	function pi_exec_query($table,$count=0,$addWhere='',$mm_cat='',$groupBy='',$orderBy='',$query='')	{

Parameter Nr. 2 erwartet einen Integer, der die Funktion dazu veranlasst, einen COUNT durchzuführen oder nicht. Smarter wäre daher diese Version von Variante 2:

$this->pi_exec_query('user_spielplan_main',0,'','','','sorting');

Du könntest auch absteigend sortieren. Das funktioniert z.B. durch

$this->pi_exec_query('user_spielplan_main',0,'','','','sorting DESC');

Außerdem besteht die Möglichkeit, die einzelnen Parameter dynamisch zusammensetzen zu lassen und als Variable zu übergeben (wenn Du z.B. einen Switch für auf- oder absteigende Sortierung realisieren möchtest):

$this->pi_exec_query('user_spielplan_main',0,'','','','.$sortOrderString.');

Wie Du siehst, kannst Du aber noch weitere Kombinationen als Parameter an die Funktion übergeben. Solltest Du Dich doch noch mit Datenbanken anfreunden wollen, kannst Du damit mal rumexperimentieren.

Zurück zu Deinem Problem:

Du hast - wie jenses charmant anmerkte - in Deinem Script beide Varianten verwendet, was dazu führt, dass Deine Zeilen 2+3 in der Tat überflüssig werden. Kommentiere sie also einfach mal aus. Du solltest keine Veränderung feststellen können, denn:

In beiden Fällen wird das Ergebnis der Query in das Array $res übergeben, welches Du ohne weitere Verrenkungen in der while-Schleife abarbeiten kannst.

Viel Spaß noch und beste Grüße

Bitbull

PS: Wenn Dein ursprüngliches Problem zu Deiner Zufriedenheit gelöst wurde, markiere bitte den Thread als "gelöst". Danke.