Zum Inhalt springen

Inhalt abhängig von BE Spalte -> Condition mit colPos

Erstellt am 30. April 2010 · 12 Antworten · letzte Antwort am 8. September 2011

Tags: Inhaltselemente, TYPO3 4, Frage

rolib ·

Hall ich habe alles mir mögliche versucht und extrem viel gesucht aber ich schaffe es nicht Inhalte abhängig von der Spalte (colPos) anzupassen

[globalVar = TSFE:tt_content|colPos=0]
tt_content.text.20.parseFunc.tags.link.typolink.userFunc.aTagParamsExt = class="test"
tt_content.text.20.parseFunc.tags.link.typolink.userFunc.linkImgExt.file =
[global]

(Ohne Condition funktioniert der Code)

Ich hab es auch schon probiert dies mit der ELSE Option zu lösen da ich gelesen habe dass es ein Bug ist, aber das geht auch nicht.

[globalVar = TSFE:tt_content|colPos=1] && [globalVar = TSFE:tt_content|colPos=2] && [globalVar = TSFE:tt_content|colPos=3]
-
[else]
tt_content.text.20.parseFunc.tags.link.typolink.userFunc.aTagParamsExt = class="test"
tt_content.text.20.parseFunc.tags.link.typolink.userFunc.linkImgExt.file =
[global]

Hat jemand eine Idee wie ich das lösen kann?

Julian.​Hofmann ·

Hallo.

Conditions haben das Problem, dass sie nur einmalig geparst werden beim Seitenaufruf, d.h. keine Änderungen während des Parsens mehr berücksichtigen. Konkret heißt das, dass Du niemals auf tt_content-Elemente durchlaufen kannst. Verwendbar sind hier nur Objekte, die vor dem TS-Parsen bereits vom System aus der Datenbank geholt wurden (z.B. pages-Datensatz der aktuellen Seite, eingeloggter FE-User) usw.

Um die gewünschte Unterscheidung zu erzielen, dürfte das CASE-Objekt mit entsprechendem key/if Dich ans Ziel führen.

Viele Grüße
Julian

rolib ·

Hallo Julian,

danke für die richtige Fährte, nun habe ich zumindest schon eine nur auf Spalte 4 wirkende Veränderung zusammengebracht, aber einen grundlegenden Teil habe ich noch kapiert. Bei mir wird jetzt das textpic komplett mit value ersetzt anstatt dass ich dem Link einen zusätzlichen Parameter mitgebe

temp.extLink < tt_content.text.20
tt_content.text.20 >
tt_content.text.20 = CASE
tt_content.text.20 {
   key.field = colPos
   default < temp.extLink
   4 = TEXT
   4.value = tt_content.text.20.parseFunc.tags.link.typolink.userFunc.aTagParamsExt = class="testi"
}

Dies Variante käme mir logischer vor, aber bewirkt gar nichts #paralyzed#

temp.extLink < tt_content.text.20
tt_content.text.20 >
tt_content.text.20 = CASE
tt_content.text.20 {
   key.field = colPos
   default < temp.extLink
   4 < tt_content.text.20.parseFunc.tags.link.typolink.userFunc.aTagParamsExt = class="testi"
}

oder muss es

tt_content.text.20.parseFunc.tags.link.typolink.userFunc.aTagParamsExt = CASE

heißen? Aber mit dieser Variante habe ich auch nichts zustande gebracht. Wäre über einen "Schubser" wieder sehr dankbar.

Grüße rolib

Julian.​Hofmann ·

Dein letzter Ansatz wirkt zielführender.

Bei solchen TS-Basteleien muss man immer im Auge behalten, was man eigentlich ändern möchte bzw. wo sich die Einstellung dazu versteckt.

In Deinem ersten TS-Schnipsel weist Du nur TEXT zu. value hat danach den Inhalt "tt_content.text (...)" ohne, dfass dieser ausgewertet wird.

Im zweiten Fall kopierst Du auf "4" das Objekt bzw. die Eigenschaft "tt_content.text.20.parseFunc.tags.link.typolink.userFunc.aTagParamsExt", wobei die Zuweisung ("=") entweder ignoriert wird oder sogar einen Syntaxfehler erzeugt.

Hab mich jetzt ums ganz tief hineindenken drumherumgedrückt, dafür aber mal die Suchmaschien meienr Wahl befragt (ungetestet, sieht aber logisch aus):

temp.tt_content.text < tt_content.text
tt_content.text >
tt_content.text = CASE
tt_content.text {
  key.field=colPos
   
   
  1 < temp.tt_content.text
  2 < temp.tt_content.text
  3 < temp.tt_content.text
  default < temp.tt_content.text  
   
   
  1.20.parseFunc.tags.link.typolink.ATagParams=class="class2"
  2.20.parseFunc.tags.link.typolink.ATagParams=class="class3"
  3.20.parseFunc.tags.link.typolink.ATagParams=class="class4"
  default.20.parseFunc.tags.link.typolink.ATagParams=class="class1"
}
temp.tt_content >

Quelle: http://clipmarks.com/clipmark/59E41594-48FA-4CF8-993B-C6D4A2880EB1/

P.S: Mal anders gefragt: Warum packst Du nicht einen Wrapper rund um Deine Inhaltsausgabe und selektierst via CSS?

<div class="colpos1">blabla</div><div class="colpos4"><a href="#">blabla</a></div>

Nicht, dass Du Dir das Leben unnötig schwer machst...

rolib ·

danke für deinen Codeschnipsel, hab diesen auch nochmals hier
http://www.typo3wizard.com/de/snippets/allgemeine-probleme-und-loesungen/verschiedene-link-formatierung-fuer-die-verschiedenen-spalten.html
gefunden. Deine Suchmaschine liefert bessere Ergebnisse als meine 8-)

Aber leider habe ich das Problem, dass dieser bei mir nicht funktioniert. Das Ergebnis: In jeder Spalte wird der Text von den Inhaltselementen komplett gelöscht #paralyzed#

Verstehe ich noch nicht ganz, weil es auch für mich ziemlich logisch aussieht, soweit ich das mit meinen TS Kenntnissen beurteilen kann.

Zu deiner Frage warum dies nicht mit einem wrap und CSS lösen: In weiterer Folge benötige ich in nur einer Spalte als ATagParams ein onclick="" Event ...

Also wenn ich das richtig interpretiere, wird der tt_content.text ins temp.tt_content.text kopiert, dieser dann gelöscht und mit CASE und abhängig von der Spalte dann wieder zugewiesen (unverändert) und in weiterer Folge dann der Unterschied pro Spalte zugewiesen, zu guter Letzt wird das temp Objekt wieder geleert ...

Das würde doch heißen, das tt_content.text wird geleert und hier wird es nicht mehr zugewiesen oder falsch zugewiesen bzw. ist es im temp.tt_content.text nicht gespeichert? #paralyzed#

1 < temp.tt_content.text
....

Julian.​Hofmann ·
rolib schrieb

Deine Suchmaschine liefert bessere Ergebnisse als meine 8-)

🙂 Manchmal kommt es nur auf die richtigen Begriffe an. Und je tiefer man schon in TYPO3 drins teckt, desto eher erwischt man "passende" Suchbegriffe (bzw. kann unpassende ausschließen).

rolib schrieb

Aber leider habe ich das Problem, dass dieser bei mir nicht funktioniert. Das Ergebnis: In jeder Spalte wird der Text von den Inhaltselementen komplett gelöscht #paralyzed#

Bei reinen Text-Inhaltselementen klappt's aber, stimmt's? Nur Text mit Bild odgl. das fehlt danach der Textteil.

Hat mich jetzt beim Probieren auch etwas verwundert, aber dann erinnerte ich mich an Problem, das hier letztens schon mal aufgetaucht ist: In TYPO3 4.3 wurde das default-TS von CSS styled content ziemlich gut aufgeräumt. U.a. nutzt es nun auch öfters Referenzen ( < = ) statt Kopieranweisungen. Glaube, dass uns das letztlich hier auch ind ie Quere kommt (und begründen würde, warum "falsche" TS-Schnipsel im Netz kursieren, die eben bis 4.3 korrekt liefen).

rolib schrieb

Also wenn ich das richtig interpretiere,

Genau. So hatte ich das auch gesehen.

Das Problem ist diese Zuweisung im default-TS für textpic:

tt_content.textpic.20.text.20 = < tt_content.text.20

Hier wird auf ein Unterobjekt von tt_content.text referenziert - in dem TS-Schnipsel wird jedoch das tt_content.text-Objekt umgebaut und erst noch das CASE-Objekt dazwischengeschoben. Somit liegt nicht mehr unter tt_content.text.20 der Textinhalt, sondern unter tt_content.text.[1,2,3,default].20. Also müsste diese Referenzierung im Anschluss an den TS-Schnipsel noch angepasst werden:

tt_content.textpic.20.text.20 >
tt_content.textpic.20.text.20 = CASE 
tt_content.textpic.20.text.20 {
  key.field=colPos
  1 < tt_content.text.1.20
  2 < tt_content.text.2.20
  3 < tt_content.text.3.20
  default < tt_content.text.default.20
}
rolib ·

Ich ziehe meinen Hut vor deinem Durchblick :o

Du hattest recht, beim Textelement hat es funktioniert, bei Text mit Bild war der Text weg, blöderweise hatte ich nur Text mit Bild auf der Seite ... und natürlich Typo3 4.3 in Verwendung

Deine Code Ergänzung bringt das Ganze zum Laufen 😃

Hier nochmals das gesamte Schnipsel:

temp.tt_content.text < tt_content.text
tt_content.text >
tt_content.text = CASE
tt_content.text {
  key.field=colPos
 
 
  1 < temp.tt_content.text
  2 < temp.tt_content.text
  3 < temp.tt_content.text
  default < temp.tt_content.text  
 
 
  1.20.parseFunc.tags.link.typolink.ATagParams=class="class2"
  2.20.parseFunc.tags.link.typolink.ATagParams=class="class3"
  3.20.parseFunc.tags.link.typolink.ATagParams=class="class4"
  default.20.parseFunc.tags.link.typolink.ATagParams=class="class1"
}
temp.tt_content >

tt_content.textpic.20.text.20 >
tt_content.textpic.20.text.20 = CASE 
tt_content.textpic.20.text.20 {
  key.field=colPos
  1 < tt_content.text.1.20
  2 < tt_content.text.2.20
  3 < tt_content.text.3.20
  default < tt_content.text.default.20
}

Vielen tausend Dank für deine Hilfe! 🙂

Grüße rolib

Julian.​Hofmann ·
rolib schrieb

Ich ziehe meinen Hut vor deinem Durchblick :o

Ist einfach eine Frage der Tiefe und Häufigkeit der Anwendung. Ich arbeite täglich mit TYPO3 und bin generell jemand, der gerne nicht nur Lösungen sucht, sondern auch den Hintergrund der Lösung wissen will - und dafür auch gerne mal in die Tiefe bohrt.

rolib schrieb

Vielen tausend Dank für deine Hilfe! 🙂

Bitte gerne. Die TYPO3-Community lebt vom gegenseitigen helfen, vom sich einbringen,... Und selber lernt man auch dabei.

Viele Grüße
Julian

RealBigFish ·

Hallo rolib, Hallo Julian, Hallo Community!

...vielleicht kann mir ja einer von euch 3 helfen 😃

Ich habe ein ähnliches Problem bzw. eine ähnliche Aufgabenstellung: Ich habe ein DIV-Container in den ich Inhalte aus allen BE-Spalten mappe. Jedoch möchte ich gerne für jedes einzelne Inhaltselement (nicht ganze Spalte) ein eigenen Rahmen abhängig davon in welcher Spalte sich das Inhaltselement befindet.

Funktioniert allgemein mit folgendem TypoScript-Code, jedoch ohne Spaltenunterscheidung:

tt_content.stdWrap.wrap = <div class="column_large"><div class="content_element">|</div></div>

Screenshot: http://img805.imageshack.us/img805/977/screen2qr.png

Nun hätte ich euren Code etwas geändert probiert, jedoch sind hierbei die Überschriften nicht inbegriffen:

temp.tt_content.text < tt_content.text
tt_content.text >
tt_content.text = CASE
tt_content.text {
  key.field=colPos
 
  1 < temp.tt_content.text
  2 < temp.tt_content.text
  3 < temp.tt_content.text
  default < temp.tt_content.text
 
 
  1.20.stdWrap.wrap = <div class="column_large"><div class="content_element">|</div></div>
  2.20.stdWrap.wrap = <div class="column_small"><div class="content_element">|</div></div>
  3.20.stdWrap.wrap = <div class="column_small"><div class="content_element">|</div></div>
  default.20.stdWrap.wrap = <div class="column_large"><div class="content_element">|</div></div>
}

Screenshot: http://img851.imageshack.us/img851/1804/screen1qf.png

Weiß jemand eine Lösung des Problems? Bzw. gibt es bessere Möglichkeiten dies zu lösen? Ich suche seit langem nach TS-Conditions für BE-Spalten aber irgendwie gibts da keine gute Lösung....

LG,
BigFish

Julian.​Hofmann ·

Hallo BigFish.

Conditions für FE-Rendering wirst Du nicht für die Spalten hinbekommen. TypoScript wird vor der Seitengenerierung geparst und Conditions ausgewertet, d.h. zu einem Zeitpunkt, wo die Inhalte der Seite noch unbekannt sind. Daher kannst Du zwar auf Daten aus der page zugreifen, nicht aber aus tt_content.

Ein relativ einfacher weg in Deinem Fall dürfte sein, dass Du statt der "schönen" CSS-Klassennamen dir teilnummerische bauen lässt, die die colPos enthalten. Wenn Du statt wrap den dataWrap nimmst, kannst Du Platzhalter mit Inhalten aus tt_content füllen lassen:

tt_content.stdWrap.dataWrap = <div class="column_{field:colPos}"><div class="content_element">|</div></div>

Viele Grüße
Julian

RealBigFish ·

Yeahh!! Danke für die schnelle Antwort, funktioniert super!

Screenshot: http://img220.imageshack.us/img220/9316/screen3bq.png

Ein kleines Problem gibt es aber noch:
Ich habe im TemplaVoila beim Mapping für den DIV-Container "Page-Content Elements" und bei "Old style column number" derzeit "0", für normal, eingestellt. Angezeigt wird komischerweise Column 0 und Column 1 (links). Ich möchte jedoch auch Column 2 (rechts) anzeigen, was vorher teilweise schon geklappt hat. Mehrere Werte in "Old style column number" lassen sich jedoch nicht einstellen.

LG,
BigFish