Am 31.08.15 um 21:22 schrieb Steffen Liebig:
Hallo Leute,

ich bräucht nen Rat zum Thema "Prüfen auf Vorhandensein bestimmter
Zeichen und Zeichenfolgen in Strings". Bislang wird in unserer Extension
ein preg_match verwendet, aber damit komme ich nur teilweise weiter.
Dank eines Programmierers hats schon mal funktioniert - ich hab noch
nicht rausgefunden, worans liegt und kann ihn nicht erreichen. Jetzt
versuche mich notgedrungen selber ein bisschen daran. In einer
Testinstallation natürlich :-).

Also Folgendes:

Wir haben so ne Art Preisträgerliste, in der die Leute anhand der Art
ihres Preises gelistet sind. Neudeutsch nennt sich das "Ehrentafel".

Das Problem ist jetzt, dass einer der Preise sowohl an Personen als auch
an Vereine vergeben werden kann. Ebenso können Verstorbene diesen Preis
erhalten haben. Der Haken ist jetzt die Sortierung. Es sollen von vorne
nach hinten

a) Verstorbene
b) Lebende
c) Vereine

und jeweils alphabetisch aufsteigend gelistet werden. Dabei sollen
Vereine im selben Atemzug mit dem vollen Namen erfasst (also "SK
Breitenstein e.V." etc.), aber nach der Stadt sortiert werden.

Wir verwenden dazu Sortierungszeichen, die im jeweiligen Eingabefeld vor
den Text gestellt werden. Diese Zeichen werden dann per substr-Befehl
ausgeblendet.


das klingt für mich nach einer ziemlich schlechten Idee. und sorgt sicher für eine Menge Probleme.
lieber ein eigenes Feld für zusätzliche Information.

ggfls auch noch ein weiteres Sorting Feld:

Vereine nach hinten und alles alphabetisch nach Stadt geht schon, aber
das Modul tut grad so, als ob es TROTZ DES FEHLENDEN SORTIERUNGSZEICHENS
die Namen von Menschen auch mit dem Ausblendemechanismus bearbeiten
soll. Als Folge schleichen sich Fehler ein: es wird das falsche Layout
für den Kasten genommen, neben dem fehlenden verstorben-Kreuz wird statt
des Vornamens der Ort genannt und jeweils ein Teil von Nachnamen und
Stadt ausgeblendet.

das klingt nach einem ganz komplizierten Sortieralgorithmus.
wenn a dann sortiere nach A
wenn b dann nach B
wenn c dann C
um das in ein SQL zu packen brauchst du sicher eine Menge Verrenkungen
da würde ich ein eigenes 'Sortierfeld' einfügen, das dann in Abhängigkeit von a,b oder c mit A,B oder C gefüllt wird, danach kannst du dann das sorting mit
        ORDER by feld_fuer_abc, feld_fuer_ABC
erledigen. Die Ausgabe steuerst du über feld_fuer_abc (einfach das passende partial aufrufen:
<f:render partial="partialFuer{feld_fuer_abc}" arguments="{data:record}" />)
Das vermeidet dann eine Menge ineinander geschachtelte 'if'


Anzusehen ist der Stand der Dinge auf
http://www.pfaelzischer-schachbund.de/test/psb-service/ehrentafel/ehrenteller-des-psb.html.


Ich poste mal den Code für die Geschichte:


---------------------------------------------------------------------------------


Hier gehts mit dem Problem los (Ehrung Nr. 7 = Ehrenteller)

---------------------------------------------------------------------------------


<f:if condition="{person.ort}">
<f:then>
<f:if condition="{ehrung.nr} == 7">
<f:then>
<f:if condition="preg_match('/^°$/u', '{person.name}')">

---------------------------------------------------------------------------------


--> statt nur zu prüfen, ob das "°" in Namen enthalten ist (für die
Vereine klappt das - die stehen ganz hinten), wird offenbar die
Condition wie ein "wenn Name vorhanden, dann" verstanden. Im Grunde
verständlich, aber das war vorher mit einem eigenen ViewHelper auch
schon so und hat erst ne ganze Weile funktioniert. Seit Kurzem werden
die Sortierungszeichen (Name: °, Ort: *) bei den Vereinen nur noch als
Text verstanden. Die Datenbanktabellen auf UTF-8 zu setzen hat nicht
geholfen.
Dieses Verhalkten ist gerade nicht beabsichtigt - wenn das Zeichen am
Beginn des Namens fehlt, soll bei <else> weitergemacht werden. So kann
zwar gerne bei den Vereinen alles Notwendige gemacht werden, aber sie
rücken ans Ende.
--------------------------------------------------------------------------------


<f:then>
<tr bgcolor="F2F2F2"><td><b><tnu:eval code="substr('{person.ort}', 1)"
/> <tnu:eval code="substr('{person.name}', 2)" /></b>
({person.jahr})</td></tr>
<tr><td>Geehrt mit dem PSB Ehrenteller, anlässlich:<br
/>{person.text}</td></tr>
</f:then>

-------------------------------------------------------------------------------

Gemäß obiger Erläuterung sollte diese <then>-Schleife vorerst übergangen
werden, wird sie aber nicht !!
Im Ergebnis klappt die Zuordnung der als "verstorben" eingetragenen
Personen im nächsten Block nicht mehr. Sie scheinen zwar zuerst
angezeigt zu werden, aber ohne Kreuz, weil das falsche Layout verwendet
wird. Zusätzlich wird der Umlaut bei Herrn Bärwinkel verschludert,
während der verstorbene Dr. Müller korrekt behanelt wird (noch son Hammer).
-------------------------------------------------------------------------------


<f:else>
<tr bgcolor="F2F2F2"><td><b>{person.name} {person.vorname}, {person.ort}
<f:if condition="{person.verstorben}">&dagger;</f:if></b>
({person.jahr})</td></tr>
<tr><td>Geehrt mit dem PSB Ehrenteller, anlässlich:<br
/>{person.text}</td></tr>
</f:else>
</f:if>
</f:then>
<f:else>
<tr bgcolor="F2F2F2"><td><b>{person.name} {person.vorname} <f:if
condition="{person.verstorben}">&dagger;</f:if></b>
({person.ort})</td></tr>
</f:else>
</f:if>
</f:then>
<f:else>
<tr bgcolor="F2F2F2"><td><b>{person.name} {person.vorname} <f:if
condition="{person.verstorben}">&dagger;</f:if></b></td></tr>
<tr><td>{person.jahr} {person.text}</td></tr>
</f:else>
</f:if>
</table>
</f:for>



</f:widget.paginate>

Kann sich da jemand von Euch einen Reim drauf machen ?

Ideal wäre noch in einer anderen Liste absteigend nach Jahren zu
sortieren, aber da das einen zusätzlichen ViewHelper benötigen könnte,
lassen wir das erstmal. Vielleicht lässt sich auch hier was machen und
das dann übertragen.

Besten Dank für alle Ideen und Anregungen


Steffen

bernd
--
http://www.pi-phi.de/cheatsheet.html
_______________________________________________
TYPO3-german mailing list
TYPO3-german@lists.typo3.org
http://lists.typo3.org/cgi-bin/mailman/listinfo/typo3-german

Antwort per Email an