Zum Inhalt springen

typolink if

Erstellt am 27. Dezember 2011 · 9 Antworten · letzte Antwort am 9. Januar 2012

Tags: Links, Frage

Tiffy ·

Hallo zusammen,

ich stehe gerade total auf dem Schlauch und würde mich freuen, wenn Ihr mir helfen könntet.
Und zwar lasse ich für jeden Benutzer mittels Typoscript eine monatliche Aufstellung mit Summeneinträgen generieren...

Monat Januar = 100
Monat Februar = 90
Monat März = 30
Summe = 220

Das klappt auch alles soweit. Nun möchte ich gerne die einzelnen Monate mit einer Detailansicht verlinken und dort zieht mir Typoscript leider immer nur den letzten Link bzw. Parameter. Ich komme aktuell einfach nicht weiter. Ich weiß, dass das mit PHP sicherlich eleganter zu lösen ist, ich habe jetzt aber mit TS angefangen und würde mich freuen wenn ich dies auch komplett mit TS lösen könnte bzw. mit Eurer Hilfe #giggle# Habt Ihr eine Idee? Ich bin über jeden Ansatz dankbar!!!!

Das Script sieht folgendermaßen aus:

temp.templatexy = COA
temp.templatexy {
10 = CONTENT 
  10{
  table = tx_tabelle
  select {
    pidInList = 13
         }
  renderObj = COA
  renderObj {
    wrap = <table style="width:100%">|</table>
 
    15 = TEXT
    15.wrap = <table style="width:100%">|</table>
    15.current = 1
    15.setCurrent.field = spalte4
    15.setCurrent.dataWrap = | + {field:spalte1}+{field:spalte2}+{field:spalte3}
    15.if {
        value.field = tx_tabelle_auth
        equals.data = TSFE:fe_user|user|tx_tabelle_auth
      }
    15.prioriCalc = 1
    15.dataWrap = <tr style="background-color:#e6e6e6;">
<td colspan="2" style="width:75%; height:20px; font-weight:bold">Saldo vom {field:datum}</td>
<td style="text-align:right; font-weight:bold">|</td></tr>

    # Links zu den Einzelübersichten    
    # Januar
    15.typolink  {
                 parameter = 14
                 if.value.field = datum
                 if.equals = 15.01.2011
                                  } 
             
    # Februar   
    15.typolink {
                 parameter = 15
                 if.value.field = datum
                 if.equals = 15.02.2011
                }   
    
    # März
    15.typolink {
                 parameter = 16
                 if.value.field = datum
                 if.equals = 15.03.2011
                } 
      }
    }  
}
Julian.​Hofmann ·

TS ist schon was Feines.... :p

Bin selber nicht so der Fan von current/setCurrent, weil sich mir das noch nicht so ganz erschlossen hat... :-(

Würde es eher im größeren Bogen anpacken und die Felder als einzelne TEXT-cObjects ine in COA packen und darauf dann via stdWrap mit prioriCalc draufgehen.

Viele Grüße
Julian

Tiffy ·
Julian.Hofmann schrieb

TS ist schon was Feines.... :p

Bin selber nicht so der Fan von current/setCurrent, weil sich mir das noch nicht so ganz erschlossen hat... :-(

Würde es eher im größeren Bogen anpacken und die Felder als einzelne TEXT-cObjects ine in COA packen und darauf dann via stdWrap mit prioriCalc draufgehen.

Viele Grüße
Julian

Hallo Julian,
vielen Dank schon mal für Deine schnelle Unterstützung! Ich werde es ausprobieren. Helfen mir die einzelnen TEXT-cObjects etc. bei den fehlerhaften Links?

Julian.​Hofmann ·

Ah...jetzt #angry# Deine Frage bezieht sich eigentlich nur auf den unteren Bereich, wo die typolinks stehen. Dachte es hängt in oberen bereich.

Was möchtest Du dort genau erreichen? Im Moment überschreibt Dir der letzte Block einfach die vorherigen zwei. TS wird vor dem Parsen ine in PHP-Array gewandelt, d.h. auf 'parameter' beschränkt erfolgt:

$ts['temp.']['templatexy.']['10.']['renderObj.']['15.']['parameter'] = 14;
// ...im Verlauf dann...
$ts['temp.']['templatexy.']['10.']['renderObj.']['15.']['parameter'] = 15;
// ...und
$ts['temp.']['templatexy.']['10.']['renderObj.']['15.']['parameter'] = 16;

Somit ist der Wert immer 16, das if greift zwar ggf. (de)aktiviert aber nur die Verlinkung.

Für die Fallunterscheidung hilft Dir CASE

15.typolink.parameter.cObject = CASE
15.typolink.parameter.cObject.key.field = datum

Wobei das IMHO von nummerischen Keys für die Unterscheidung ausgeht...

Tiffy ·

Vielen Dank Julian, es funktioniert! 🙂

Leider habe ich es mit CASE nicht hinbekommen bzw. den korrekten Lösungsweg nicht gefunden aber dank deiner Hilfe habe ich das nun wie folgt geregelt:

...
# Links zu den Einzelübersichten   
    15.dataWrap.cObject = COA
    15.dataWrap.cObject {
                        key.field = datum      
                        10 = TEXT      
                        10 {
                                if.value = 15.01.2011
                                if.isInList.field = datum
                                typolink.parameter = 14
                                }
      
                        20 = TEXT      
                        20 {
                                if.value = 15.02.2011
                                if.isInList.field = datum
                                typolink.parameter = 15
                                negate = 1
                                }
      
                        30 = TEXT      
                        30 {
                                if.value = 15.03.2011
                                if.isInList.field = datum
                                typolink.parameter = 16
                                negate = 1
                                }
      
                            }

Das ist bestimmt nicht die eleganteste Lösung aber es funktioniert. TS ist echt eine feine Sache!!

Tiffy ·

Hallo zusammen,

ein kleiner Fehler hat sich doch noch eingeschlichen. Und zwar wird auch pro Datensatz eine Tabelle für die Datensätze der anderen Benutzer generiert. Es ist zwar kein Inhalt vorhanden aber ich habe jetzt zwischen den Zeilen im Frontend jede Menge leere Tabellen. o.O

Habt Ihr eine Idee wie man das unterbinden kann? Ich bin für jeden Lösungsansatz dankbar. 🙂

Julian.​Hofmann ·

Sinnvoll wäre da in die Select-Abfrage gleich die Bedingung einzubauen, dass nur Datensätze des angemeldeten FE-Users selektiert werden. Das sollte Dein Problem lösen.

Tiffy ·

Perfekt!!! Danke Julian es funktioniert. Da hätte ich Esel aber auch selber drauf kommen können. #angry#

Anbei noch einmal das überarbeitete Script:

temp.templatexy = COA
temp.templatexy {
10 = CONTENT 
  10 {
     table = tx_tabelle
     select {
            pidInList = 13
            }
  renderObj = COA
  renderObj {
            wrap = <table style="width:100%">|</table>
            
# BEDINGUNG DER SELECT-ABFRAGE
            wrap.if {
            value.field = tx_tabelle_auth
            equals.data = TSFE:fe_user|user|tx_tabelle_auth
            }
     
    15 = TEXT
    15.wrap = <table style="width:100%">|</table>
    15.current = 1
    15.setCurrent.field = spalte4
    15.setCurrent.dataWrap = | + {field:spalte1}+{field:spalte2}+{field:spalte3}
    15.if {
        value.field = tx_tabelle_auth
        equals.data = TSFE:fe_user|user|tx_tabelle_auth
      }
    15.prioriCalc = 1
    15.dataWrap = <tr style="background-color:#e6e6e6;">
    <td colspan="2" style="width:75%; height:20px; font-weight:bold">Saldo vom {field:datum}</td>
    <td style="text-align:right; font-weight:bold">|</td></tr>
 
    # Links zu den Einzelübersichten   
    15.dataWrap.cObject = COA
    15.dataWrap.cObject {
                        key.field = datum      
                        10 = TEXT      
                        10 {
                                if.value = 15.01.2011
                                if.isInList.field = datum
                                typolink.parameter = 14
                                }
 
                        20 = TEXT      
                        20 {
                                if.value = 15.02.2011
                                if.isInList.field = datum
                                typolink.parameter = 15
                                negate = 1
                                }
 
                        30 = TEXT      
                        30 {
                                if.value = 15.03.2011
                                if.isInList.field = datum
                                typolink.parameter = 16
                                negate = 1
                                }
 
                        }  
  }
 }
}

TAUSEND DANK Julian!! 🙂

Julian.​Hofmann ·

Ähm, nein, so war das nicht gemeint.
Im Moment selektierst Du alle Datensätze aus tx_tabelle, durchläufst alle und entscheidest erst beim Rendern, ob Du den Datensatz überhaupt angezeigt haben willst. Sinnvoller dürfte es aber sein, dass Du bereits bei der Abfrage aus der Datenbank nur das rausholst, was den FE-User überhaupt etwas angeht (also seine eigeen Daten).

In tx_tabelle steht vermutlich die ID des FE-Users (Annahme: Spalte fe_user_ID):

#...
     table = tx_tabelle
     select {
            pidInList = 13
            where = 1=1
            andWhere.data = TSFE:fe_user|user|uid
            andWhere.wrap = fe_user_ID=|
            }
#...
Tiffy ·

Du hast recht, das ist natürlich sinnvoller. Ich habe es bereits umgestellt und es funktioniert ebenfalls. TAUSEND DANK nochmal. 🙂