Hallo zusammen,
ich möchte im Frontend eine Tabelle anzeigen, die über Klicks auf die Spaltenüberschriften unterschiedlich sortiert werden kann (http://website2007.kalk.de/182.html). Mein TypoScript für die Anzeige der Tabelle — ohne Sortierung — funktioniert.
temp.memberList = CONTENT
temp.memberList {
table = tx_bvkmember_company
select {
# SysOrdner mit Mitgliederdaten hat UID 53
pidInList = 53
orderBy = name
}
# ...
}
Nun müsste ich den Sortierschlüssel (Feldname) und die Sortierrichtung (ASC/DESC) über GET-Parameter übergeben. Meine erste Idee war natürlich, orderBy mit diesen GET-Parameter zu setzen.
orderBy = {GPvar:sortField} {GPvar:sortMode}
Aber orderBy ist nicht stdWrap: es kann nur Direktwerte annehmen.
Das ist bei all meinen vergeblichen Überlegungen (es z.B. irgendwie mit CASE zu machen) die einzige Erkenntnis: Es geht nicht, weil hier gar kein Inhalt gerendert wird (dazu gäbe es in T3 jede Menge Möglichkeiten). Vielmehr wird hier die Eigenschaft (orderBy) einer Funktion (select) gesetzt; dafür sind die stdWrap-Zaubereien nicht geeignet.
Weiß jemand ob es möglich ist? Eine Lösung ohne USER / PHP_SCRIPT wäre mir lieb, aber bitte – wenn's nicht anders geht. Obwohl, eigentlich verlang ich ja nichts Unmögliches...
Vielen Dank für jede Hilfe!
Tosta.
entweder core patchen, das als stdwrap wär sicher praktisch oder einfach die gpvar über conditions abfragen, das wär das schnellste/einfachste
georg
Vielen Dank, Georg, für deine Vorschläge. Den Core lass ich mal so wie er ist (stellenweise ja schon schlimm genug). Ich hab's über Conditions mit Konstanten gemacht (und es funktioniert: http://website2007.kalk.de/182.html).
Zunächst die Template-Constants:
# Mögliche "orderBy"-Werte für Zugriff auf Mitglieder-Daten.
memberList.sorting.NAME_ASC = sorting_key asc, zip asc
memberList.sorting.NAME_DESC = sorting_key desc, zip asc
memberList.sorting.ZIP_ASC = zip asc, sorting_key asc
memberList.sorting.ZIP_DESC = zip desc, sorting_key asc
memberList.sorting.CITY_ASC = city asc, sorting_key asc
memberList.sorting.CITY_DESC = city desc, sorting_key asc
# "orderBy"-Wert in Abhängigkeit vom GET-Parameter "sorting" ermitteln.
# Wird in der Konstanten "memberList.sorting" gespeichert und im Template-Setup benutzt.
memberList.sorting = {$memberList.sorting.NAME_ASC}
[globalVar = GP:sorting = name_asc]
memberList.sorting = {$memberList.sorting.NAME_ASC}
[end]
[globalVar = GP:sorting = name_desc]
memberList.sorting = {$memberList.sorting.NAME_DESC}
[end]
[globalVar = GP:sorting = zip_asc]
memberList.sorting = {$memberList.sorting.ZIP_ASC}
[end]
[globalVar = GP:sorting = zip_desc]
memberList.sorting = {$memberList.sorting.ZIP_DESC}
[end]
[globalVar = GP:sorting = city_asc]
memberList.sorting = {$memberList.sorting.CITY_ASC}
[end]
[globalVar = GP:sorting = city_desc]
memberList.sorting = {$memberList.sorting.CITY_DESC}
[end]
Und unten das Template-Setup. Ich hab mal fast den gesamten Code reingepackt, für Leute, die Ähnliches vorhaben. Lässt sich alles noch geschickter kodieren, aber mir reicht's jetzt.
temp.memberList = CONTENT
temp.memberList {
table = tx_bvkmember_company
select {
# SysOrdner mit Mitgliederdaten hat UID 53
pidInList = 53
orderBy = {$memberList.sorting}
where = country = {$member.country}
}
#
# Ein großer Wrap mit dem Tabellenrahmen und der Überschriftenzeile
#
stdWrap.outerWrap.cObject = COA
stdWrap.outerWrap.cObject {
10 = TEXT
10 {
value (
<p>
Für Detail-Informationen ...
</p>
<p>
Sie können die Liste nach ...
</p>
)
}
30 = TEXT
30 {
value (
<table class="member_list contenttable">
<tr>
<th>
Name
<a href="?sorting=name_asc" class="no_deco" title="Nach Namen aufsteigend...">
<img src="fileadmin/images/sort_arrow_up.gif" />
</a>
<a href="?sorting=name_desc" class="no_deco" title="Nach Namen absteigend...">
<img src="fileadmin/images/sort_arrow_down.gif" />
</a>
</th>
<th style="text-align: center;">
Plz
<a href="?sorting=zip_asc" class="no_deco" title="Nach Plz aufsteigend...">
<img src="fileadmin/images/sort_arrow_up.gif" />
</a>
<a href="?sorting=zip_desc" class="no_deco" title="Nach Plz absteigend...">
<img src="fileadmin/images/sort_arrow_down.gif" />
</a>
</th>
<th>
Ort
<a href="?sorting=city_asc" class="no_deco" title="Nach Ort aufsteigend...">
<img src="fileadmin/images/sort_arrow_up.gif" />
</a>
<a href="?sorting=city_desc" class="no_deco" title="Nach Ort absteigend...">
<img src="fileadmin/images/sort_arrow_down.gif" />
</a>
</th>
</tr>
<!-- Hier kommen die Daten: -->
|
<!-- Das waren die Daten! -->
</table>
)
}
}
#
# Und hier die Ausgabe der Datenzeilen
#
renderObj = COA
renderObj {
stdWrap.wrap = <tr> | </tr>
10 = COA
10 {
10 = TEXT
10 {
field = name_1
typolink {
# ...
}
}
stdWrap.wrap = <td> | </td>
}
20 = TEXT
20 {
field = zip
wrap = <td style="text-align: center;"> | </td>
}
30 = TEXT
30 {
field = city
wrap = <td> | </td>
}
}
}
Schönen Gruß,
Tosta
ich hätt das sowieso mit js gelöst, dann bleibt alles beim client und der hat damit keine probleme 😉
georg
Hatt ich auch überlegt, aber ich hab's schon gern auf dem Server. Andererseits ist die jetzige Lösung alles andere als elegant. Geschmackssache. Ich lass es jetzt erst mal.
Tosta
was spricht für den server? dagegen spricht mehr last, dauert länger, aber natürlich geschmacksache
georg
just2b schrieb
was spricht für den server?
Meine Geschichte: Ich bin eigentlich Java- und C-Programmierer für Client-Server-Systeme. Bei Web-Anwendungen programmiere ich lieber in Java auf dem Server, weil die Entwicklung komfortabler ist. Es ist in einer Programmiersprache wie Java auch viel leichter, einen Fehler zu finden und zu debuggen als in einer Skriptsprache wie JavaScript. Diese Arbeitsweise hab ich natürlich auch bei der Arbeit mit TYPO3 nicht abgelegt, auch wenn das keine herkömmliche Programmierung mehr ist.
Dann hab ich auch intuitiv Hemmungen, meine Funktionalitäten auf von einander unabhängige Systeme zu verteilen (jetzt z.B. TypoScript auf Web-Server, JavaScript auf Client-Browser). Auf den Client hab ich keinen Einfluss, das gibt mir ein ungemütliches Gefühl.
Muss aber einräumen, dass ich das kleine Shop-System auf meiner Website (http://website2007.kalk.de/47.html) in JavaScript programmiert hab, u.a. weil es für den Benutzer komfortabler ist.
In Hinblick auf Ajax bin ich eh schon dabei, meine abwertende Einstellung zu JavaScript zu überdenken.
Danke nochmal für deine Hilfe und auch dein Interesse!
Tosta.
Hallo,
ja natürlich macht das ganze auch Sinn, keine Frage 😉
nur einen Kommentar: TS sollte nicht da auftauchen, denn TS ist nichts clientseitiges sondern wird in aller Regel als PHP irgendwie dann ausgeführt 😉
noch viel erfolg und schönes wochenende
georg