Du bist nicht angemeldet. Der Zugriff auf einige Boards wurde daher deaktiviert.

#1 28. November 2014 09:39

Dancer62
Server-Pate
Ort: 26345 Bockhorn, Niedersachsen
Registriert: 08. November 2013
Beiträge: 414

[GELÖST] Zahlen sortiert ausgeben

Hallo Forum,

ich habe das Problem, dass ich Zahlen, die ich in einer ListIt2-Instanz eingegeben habe, sortiert ausgeben möchte. Wie Oliwer schon hier angegeben hat, ist mein Problem ähnlich und (leider !) noch nicht gelöst.
Gebe ich die Daten mittels

{ListIt2Modul template_summary='ausgabe' category='siege' orderby='custom_anzahl|ASC'}

aus, so erhalte ich z.B. die Reihenfolge
18
25
32
36
5
8.
D.h. die Reihenfolge richtet sich offenbar nach dem ersten Zeichen des Strings (!). Das Problem könnte man umgehen, indem man den einstelligen Nummern entsprechend eine "0" (Null) voranstellt. Allerdings ist dann die Ausgabe unschön, die dann lauten würde:
05
08
18
25
32
36.
Ich habe jetzt versucht, führende Nullen bei der Ausgabe zu kürzen, allerdings weiß ich nicht mehr weiter. Ich habe es im Template schon mit

{$item->anzahl|decimal_format:"%d"}

versucht, aber das hat alle "Zahlen" in "1" umgewandelt. Auch andere Funktionen führen offensichtlich nicht zum Ziel. Ideal wäre aus meiner Sicht eine Funktion, die einen String in Zahlen umwandelt, aber ob es die gibt hmm ?.


Man ist so alt, wie man sich fühlt...

Offline

#2 28. November 2014 16:13

NaN
Moderator
Ort: Halle (Saale)
Registriert: 09. November 2010
Beiträge: 4.391

Re: [GELÖST] Zahlen sortiert ausgeben

Das Problem ist, dass die Zahlen in der DB als Text gespeichert werden.
Folglich sortiert die Datenbank auch alphabetisch, nicht numerisch.
Daher entsteht diese "falsche" Reihenfolge.
Die DB weiß ja nicht, dass es sich eigentlich um Zahlen handelt.
Wenn man sich die Zahlen mal als Buchstaben vorstellt, dann wäre das auch korrekt so.

D.h. Du musst im PHP Code die SQL Abfrage so ändern, dass sie "natürlich" sortiert. Da MySQL sowas scheinbar nicht kennt, musst Du tricksen. Dazu hast Du zwei Möglichkeiten. Entweder Du erstellst Dir deine eigene MySQL Funktion (siehe z.B. hier) oder Du wendest den zwar etwas primitiven aber durchaus effektiven Trick 17 an: Sortiere erst nach Länge, dann alphabetisch.

Wie dem auch sei, dazu musst Du den PHP-Code im Modul verändern.
Da Du höchstwahrscheinlich keine Berechtigungen haben wirst, eigene SQL Funktionen zu deklarieren, erstmal nur Trick 17.

Es gibt drei Stellen im Code an denen nach benutzerdefinierten Angaben sortiert wird:

ListIt2/lib/class.ListIt2ArchiveQuery.php in Zeile 123
ListIt2/lib/class.ListIt2CategoryQuery.php in Zeile 110
ListIt2/lib/class.ListIt2ItemQuery.php in Zeile 271

Dort steht jeweils diese Zeile:

$this->query .= ' ORDER BY ' . implode(', ', $this->orderby);

ändere das mal in

$this->query .= ' ORDER BY ' . implode(', ', 'CHAR_LENGTH(' . $this->orderby . '), ' . $this->orderby);

(Habs allerdings nicht getestet. Hab hier bloß den Code vor Augen.)

Damit dürfte Dein erster Ansatz funktionieren.


Module: GBFilePicker, AdvancedContent
Sicherheit: Beispiel .htaccess-Datei
CMSms 1.12.2 unter PHP 7:
cmsms-1.12.2-php7.2-diff.tar.gz (nur die geänderten Dateien)
cmsms-1.12.3.zip (inoffiziell - komplett inkl. Installer)

Offline

#3 28. November 2014 18:56

Janl
Server-Pate
Ort: Freistadt, Österreich
Registriert: 13. Dezember 2010
Beiträge: 1.211
Webseite

Re: [GELÖST] Zahlen sortiert ausgeben

Vielleicht geht es mit konvertieren nach einem Integer

$smarty->assign('id', (int)$_GET['id'])

Muss Du experimentieren, auf die schnelle konnte ich nichts anderes finden.

Noch etwas:
To convert string to int in PHP you can use casting or intval() function. See example: $intVariable = intval( $unknownVariable ); // or: $intVariable = (int)$unknownVariable;

MfG
Jan

Beitrag geändert von Janl (28. November 2014 19:08)


Ubuntu 16.04 KDE - Kubuntu 18.04 / win10 (1 duo-boot laptop)- LAMP
Raspi 4b mit Ubuntu 20.04 (64bit) und Mate.

Offline

#4 28. November 2014 22:49

Janl
Server-Pate
Ort: Freistadt, Österreich
Registriert: 13. Dezember 2010
Beiträge: 1.211
Webseite

Re: [GELÖST] Zahlen sortiert ausgeben

Wenn man die Werte auf 01, 02, 03 etc. einstellt und die Ausgabe gestaltet wird mit
{$item->fielddefs.Nummer.value|intval}
damit die Nummer als integer gezeigt werden, ist das Problem vielleicht auch gelöst.

Vorbild
http://reserve.stajl.net/index.php?page=test


MfG
Jan

Beitrag geändert von Janl (29. November 2014 23:08)


Ubuntu 16.04 KDE - Kubuntu 18.04 / win10 (1 duo-boot laptop)- LAMP
Raspi 4b mit Ubuntu 20.04 (64bit) und Mate.

Offline

#5 29. November 2014 11:50

Dancer62
Server-Pate
Ort: 26345 Bockhorn, Niedersachsen
Registriert: 08. November 2013
Beiträge: 414

Re: [GELÖST] Zahlen sortiert ausgeben

Janl schrieb:

Wenn man die Werte auf 01, 02, 03 etc. einstellt und die Ausgabe gestaltet wird mit
{$item->fielddefs.Nummer.value|intval}
damit die Nummer als integer gezeigt werden, ist das Problem vielleicht auch gelöst.

Danke, Janl - so funktioniert es bestens. Habe sowohl die Sortierung, als auch die Ausgabe nach meinen Wünschen gestalten können.


Man ist so alt, wie man sich fühlt...

Offline