Zum Inhalt springen

Template ja nach Inhalt verwenden

Erstellt am 1. Februar 2011 · 30 Antworten · letzte Antwort am 16. Februar 2011 · Seite 2 von 2

Tags: Templates & Layouts, Frage

heikehk ·

Lieber Emil,

vielen lieben Dank für die Mühe, die Du Dir gibst und Deine freundliche Hilfe.
Zu Deiner Beruhigung / vielleicht aber auch Beunruhigung 😉 Ich habe hier sogar 4 Typo3 Bücher bei mir liegen, die ich in den letzten Tagen oft verzweifelt durchforstet habe.
Mit Hilfe dieser Bücher bin ich ja letztendlich auch weiter gekommen, als ich es ursprünglich dachte.

Unter Umständen ist es auch nicht wirklich hilfreich, dass ich schon in anderen Sprache programmiert habe, so dass ich mit der Syntax von Typoscript noch nicht wirklich warm geworden bin.

Ich hoffe, dass ich mit Hilfe Deiner Tipps und Beispiele den Knoten zum platzen bringen kann. Dass ich viele Fragen habe liegt wahrscheinlich daran, dass ich den sinnvollen Aufbau eines Templates offensichtlich noch nicht begriffen habe. Sobald ich mich durch diese Sache durchgebissen habe, werde ich hoffentlich ein etwas besseres Verständnis haben.

Darf ich Dich fragen welches Buch aus Deiner Sicht das Beste ist, welches ich zu Hand nehmen sollte? Vielleicht habe ich ja die falschen Bücher hier liegen...

Aber nur eine Frage sei noch erlaubt, damit ich weiß, dass ich auf dem richtigen Weg bin, nicht, dass ich mich schon wieder verlaufen habe...

Wenn ich Dein Script richtig verstanden habe, dann landet der komplette Inhalt der Seite, mit if-Abfragen ordentlich formatiert in dem Objekt page.999 und ich ersetze den Marker dann mit diesem Objekt?

Alles Liebe
Heike

etux ·
heikehk schrieb

4 Typo3 Bücher bei mir liegen, die ich ... oft verzweifelt durchforstet habe.

Du solltest sie besser systematisch lesen, bzw. studieren. 😃

heikehk schrieb

den sinnvollen Aufbau eines Templates offensichtlich noch nicht begriffen habe

Sind denn in den Büchern keine Beispiele oder Case-Studys?

heikehk schrieb

welches Buch aus Deiner Sicht das Beste ist, welches ich zu Hand nehmen sollte?

Das kann ich Dir nicht sagen. Ich habe nur die 2004-Ausgabe des TYPO3 ECM von Altmann, Fritz und Hinderink.
Ich kann mir aber nicht vorstellen, dass eins Deiner Bücher nicht lesenswert wäre. Also nicht wie ran. 😃
Die TYPO3 Reference gibt es auch online, sollten Deine Bücher sie nicht hergeben. Und auch sonstige Dokus findet man im Netz, so wie diese hier:
http://www.mittwald.de/typo3-dokumentation/

Auch viele Forum-User hier haben auf ihren Sites Tipps und Anleitungen zu vielen Themen.

Trotzdem solltest Du mit den Bücher anfangen. Da ist sicher alles schön strukturiert und übersichtlich.

heikehk schrieb

Wenn ich Dein Script richtig verstanden habe, dann landet der komplette Inhalt der Seite, mit if-Abfragen ordentlich formatiert in dem Objekt page.999 und ich ersetze den Marker dann mit diesem Objekt?

Nenne es meinetwegen in lib.alle-inhaltsspalten um (statt page.999) und

…........DEIN_MARKER < lib.alle-inhaltsspalten

Warum? Steht sicher in Deinen Büchern. 😃

heikehk ·

😃

Du hast Recht,

natürlich steht in den Büchern viel Information und auch Strukturiert. Mein Ansatz war vielleicht falsch, dass ich gedacht hatte, mit vorheriger Programmiererfahrung einfach die Bücher screenen zu können und dann nur dort wirklich zu lesen, wo ich eine Lösung zu einer Fragestellung gefunden habe.

Da fehlen dann natürlich die eine oder andere Grundinformation, die mir zum Verständnis hätte helfen können, weil die woanders versteckt ist :o

Aber ich bin froh, dass ich zumindest Deinen Code dann richtig verstanden habe. Das gibt einem doch gleich das Gefühl nicht ganz so dumm zu sein und wenigstens in den Kämpfen mit Typoscript nicht völlig verloren zu haben #paralyzed#

Das Problem bei Schnipseln ist, dass sie zwar einen Teilbereich zeigen, dass aber, wenn man die Grundstruktur nicht zu 100% verstanden hat, in alle Fehlertöpfe tritt, die auf dem Weg zu finden sind. Wobei ich der Meinung bin, dass man ja aus Fehlern am besten lernt. Nur ist hier Typoscript ja relativ schweigsam. 😢🙁:x

Wie auch immer, ich nehme mir alles zu Herzen und bin mir sicher, dass mir Deine Hilfe hier wirklich weitergeholfen hat. 😃

Altmann Fritz und Hinderlink sind mir leider noch nicht über den Weg gelaufen... Aber vielleicht wäre das noch eine Idee 😉

Einen schönen Tag Dir noch,
hoffentlich schaut heute mal die Sonne vorbei 😉

Heike

PS: Ach ja und falls Du jemals ein Problem mit Photoshop, InDesign oder ähnlichem hast, dann meld Dich bei mir. Ich würde mich gerne revanchieren...

heikehk ·

Also ich habe jetzt viel gelesen und auch noch einiges verändert.
Mittlerweile habe ich die Infos zu den Templates in Konstanten eingepflegt und dachte, ich wäre an der Lösung dran.

Ich denke ich muss nur noch dieses CASE-Konstrukt zum laufen bringen und statt Text dann die jeweiligen Konstanten ansprechen. die dann die Infos zu den Vorlagen-Dateien enthalten, dann wäre ich mit meinen Ideen fertig.

Das Konstrukt von key.cObject {...} funktioniert alleine einwandfrei. Nach meinem Verständnis sollte in dem Objekt, ja nach Inhalt:

LinksMitteRechts
LinksMitte
...

stehen (da waren vorher nur Buchstaben aber LR scheint irgendwie belegt zu sein).

page.temp.40 = COA
page.temp.40 {
  10 = CASE
  10 {
    key.cObject = COA
    key.cObject {
      10 = COA
      10 = TEXT
      10 {
        value = Links
        if.isTrue.numRows < styles.content.getLeft
      }
      20 = COA
      20 = TEXT
      20 {
        value = Mitte
        if.isTrue.numRows < styles.content.get
      }
      30 = COA
      30 = TEXT
      30 {
        value = Rechts
        if.isTrue.numRows < styles.content.getRight
      }
    }  
    default = TEXT
    default = Standardeinstellung

    LinksMitteRechts.10 = TEXT
    LinksMitteRechts.10 = 25_50_25
    LinksMitte.10 = TEXT
    LinksMitte.10 = 33_66
    MitteRechts.10 = TEXT
    MitteRechts.10 = 66_33
    LinksRechts.10 = TEXT
    LinksRechts.10 = 50_50
    Mitte.10 = TEXT
    Mitte.10 = 100

  }
  }

Wie auch immer, ich habe zwei Probleme:

1. Wie spreche ich das Ergebnis des CASE an?
Ist das page.temp.40.10.value?
nur page.temp.40?

Mir scheint im Object-Browser, dass ich nie auch wirklich das Ergebnis bekomme, das ich haben möchte. Übergebe ich den Inhalt z.b. in page.temp.50 mit <, dann steht im Object-Browaser bei Value TEXT und ohne Value CASE...#angry##angry#

2. Ich hab das Gefühl, dass der komplette CASE nicht funzt

Ist da oben ein gravierender Fehler?

Mit if bekomme ich das ums verrecken nicht hin#evil#, aber irgendwie denke ich, dass das doch gehen muss...

Bitte dringend nochmal um Hilfe :o

Danke

Heike

etux ·

Morgen Heike,

ehrlich gesagt, ich weiß immer noch nicht, wie Du Dein Vorhaben zu umsetzen anstrebst.
Sollten die Redakteure keine weitere Umstellungen machen, um ein Frontend-Layout zu wählen ist die Variante mit den if-Abfragen schon o.k. Je nach dem welche Spalten Inhalt haben (Backend), erscheint das entsprechende Spalten-Layout im Frontend. Voll automatisch also.

Sonst könntest Du die Layouts über „Frontend-Layout“ wählen lassen (z.B. bei der root-Seite auf „Seiteneigenschaften bearbeiten“ gehen und dann den Reiter „Erscheinungsbild“ wählen).

Die Layoutsnamen kannst Du auch ändern. Nochmal auf der root-Seite „Seiteneigenschaften bearbeiten“ und dann Reiter Ressourcen. In den Feld „Seiten-TSconfig“ kommt beispielsweise:

TCEFORM.pages {
layout.altLabels.3 = Links, Normal und Rechts
layout.altLabels.2 = Normal und Rechts
layout.altLabels.1 = Links und Normal
layout.altLabels.0 = nur Normal
}

und in Deinem root-Seite Template, was ich Dir schon gepostet habe, nur etwas umgebaut:

# Normal
temp.content = CONTENT
temp.content {
	table = tt_content
	select.orderBy = sorting
	select.where = colPos = 0
	select.languageField = sys_language_uid
	stdWrap.wrap = <div id="hauptspalte"><!--TYPO3SEARCH_begin-->|<!--TYPO3SEARCH_end--></div>
	# stdWrap.required = 1
}
# Links
temp.left = CONTENT
temp.left  {
	table = tt_content
	select.orderBy = sorting
	select.where = colPos = 1
	select.languageField = sys_language_uid
	stdWrap.wrap = <div id="linke-spalte">|</div>
}
# Rechts
temp.right = CONTENT
temp.right  {
	table = tt_content
	select.orderBy = sorting
	select.where = colPos = 2
	select.languageField = sys_language_uid
	stdWrap.wrap = <div id="rechte-spalte">|</div>
}
############################
page.999 = COA
page.999.wrap = <div id="page">|</div>


page.999.10 = COA
page.999.10 {	### Nur die Hauptspalte ###
	wrap = <div id="content-wrap" class="links-rechts">|</div>
	10 < temp.left
	20 < temp.right
}

[globalVar=TSFE:page|layout=1]
page.999.10 = COA
page.999.10 {	### Zwei Spalten - Links und Normal ###
	wrap = <div id="content-wrap" class="links-normal">|</div>
	10 < temp.left
	20 < temp.content
}
[global]

[globalVar=TSFE:page|layout=2]
page.999.10 = COA
page.999.10 {	### Zwei Spalten - Normal und Rechts ###
	wrap = <div id="content-wrap" class="normal-rechts">|</div>
	10 < temp.content
	20 < temp.right
}
[global]

[globalVar=TSFE:page|layout=3]
page.999.10 = COA
page.999.10 {	### Alle drei Spalten ###
	wrap = <div id="content-wrap" class="links-normal-rechts">|</div>
	10 < temp.left
	20 < temp.content
	30 < temp.right
}
[global]

Vorsicht. Es ist nur ein auf die Schnelle erstelltes Beispiel und entspricht nicht ganz Deine Anforderungen.

Wenn Du bei den if-Abfragen bleiben willst, dürfte das hier grob dem entsprechen, was Du erreichen willst. Auch wenn ich mir ziemlich sicher bin, dass es funktioniert, perfekt ist es nicht. Es geht auch viel kompakter und einfacher.

# Normal
temp.content = CONTENT
temp.content {
	table = tt_content
	select.orderBy = sorting
	select.where = colPos = 0
	select.languageField = sys_language_uid
	stdWrap.wrap = <div id="hauptspalte"><!--TYPO3SEARCH_begin-->|<!--TYPO3SEARCH_end--></div>
	# stdWrap.required = 1
}
# Links
temp.left = CONTENT
temp.left  {
	table = tt_content
	select.orderBy = sorting
	select.where = colPos = 1
	select.languageField = sys_language_uid
	stdWrap.wrap = <div id="linke-spalte">|</div>
}
# Rechts
temp.right = CONTENT
temp.right  {
	table = tt_content
	select.orderBy = sorting
	select.where = colPos = 2
	select.languageField = sys_language_uid
	stdWrap.wrap = <div id="rechte-spalte">|</div>
}
############################
page.999 = COA
page.999 {
	# wrap = <div id="page">|</div>
	10 = COA
	10 {	### Nur die Hauptspalte ###
		wrap = <div id="content-wrap" class="normal">|</div>
		if {
			isTrue.numRows < styles.content.get
			isTrue = 1
			isTrue.if {
				isFalse.numRows < styles.content.getRight
				isTrue = 1
				isTrue.if {
					isFalse.numRows < styles.content.getLeft
				}
			}
		}
		10 < temp.content
	}
	20 = COA
	20 {	### Zwei Spalten - Links und Rechts ###
		wrap = <div id="content-wrap" class="links-rechts">|</div>
		if {
			isFalse.numRows < styles.content.get
			isTrue = 1
			isTrue.if {
				isTrue.numRows < styles.content.getRight
				isTrue = 1
				isTrue.if {
					isTrue.numRows < styles.content.getLeft
				}
			}
		}
		10 < temp.left
		20 < temp.right
	}
	30 = COA
	30 {	### Zwei Spalten - Links und Normal ###
		wrap = <div id="content-wrap" class="links-normal">|</div>
		if {
			isFalse.numRows < styles.content.getRight
			isTrue = 1
			isTrue.if {
				isTrue.numRows < styles.content.get
				isTrue = 1
				isTrue.if {
					isTrue.numRows < styles.content.getLeft
				}
			}
		}
		10 < temp.left
		20 < temp.content
	}
	40 = COA
	40 {	### Zwei Spalten - Normal und Rechts ###
		wrap = <div id="content-wrap" class="normal-rechts">|</div>
		if {
			isTrue.numRows < styles.content.getRight
			isTrue = 1
			isTrue.if {
				isTrue.numRows < styles.content.get
				isTrue = 1
				isTrue.if {
					isFalse.numRows < styles.content.getLeft
				}
			}
		}
		10 < temp.content
		20 < temp.right
	}
	50 = COA
	50 {	### Alle drei Spalten ###
		wrap = <div id="content-wrap" class="links-normal-rechts">|</div>
		if {
			isTrue.numRows < styles.content.getRight
			isTrue = 1
			isTrue.if {
				isTrue.numRows < styles.content.get
				isTrue = 1
				isTrue.if {
					isTrue.numRows < styles.content.getLeft
				}
			}
		}
		10 < temp.left
		20 < temp.content
		30 < temp.right
	}
}

page.999 wird wohl bei Dir nicht stimmen. Was Du statt „999“ schreibst, hängt davon ab, wo Du in Deinem Template die Spalten rein haben möchtest

.

heikehk ·

Lieber Emil,

danke für Deine ausführliche Antwort.
Was mich momentan, abgesehen davon, dass Du REcht hast mir den Vorauswahlen des Layouts, interessieren würde ist, warum ich die Abfrage nicht hinbekomme.

Ich habe jetzt dieses Objekt page.temp.30 folgendermaßen angelegt:

page.temp.30 = COA
page.temp.30 {
      10 = COA
      10 = TEXT
      10 {
        value = 1
        if.isTrue.numRows < styles.content.getLeft
      }
      20 = COA
      20 = TEXT
      20 {
        value = 2
        if.isTrue.numRows < styles.content.get
      }
      30 = COA
      30 = TEXT
      30 {
        value = 3
        if.isTrue.numRows < styles.content.getRight
      }

}

Wenn ich meinen Marker z.B. INHALT_M so ersetze:

       page.20.marks.INHALT_M = TEXT
       page.20.marks.INHALT_M < page.temp.30

Dann wird, je nachdem, in welcher Spalte Text eingegeben wurde 1, oder 12, ... bis 123 oder eben nichts ausgegeben.

Das heißt für mich, dass das prinzipiell so klappt.

Jetzt würde ich gern den Inhalt dieses Objektes auswerten. Und hier gehts mir grad nicht drum, dass ich das unbedingt letztendlich so lösen möchte, sondern darum zu verstehen, warum das nicht funktioniert.

Ich habe die Werte extra in Zahlen umgewandelt, weil ich in einem meiner Bücher jetzt nach meiner Anfrage gelesen habe, das Buchstaben nicht so geschickt sind.

Ich habe jetzt mal nur testweise folgendes Objekt gebaut:

page.temp.40 = COA
page.temp.40 {
      10 = COA
      10 = TEXT
      10 {
        value = 25_50_25 Aufteilung
        if.isTrue.data = page.temp.30 = 123 
      }
      20 = COA
      20 = TEXT
      20 {
        value = sonstiges
        if.isFalse.data = page.temp.30 = 123 
      }

  }

Nach meinem Verständnis sollte jetzt doch, wenn der Wert von page.temp.30 (immernoch wie oben aufgebaut) 123 ist, page.temp.40 den Inhalt "25_50_25 Aufteilung" haben und in allen anderen Fällen "sonstiges".

Gebe ich jetzt page.temp.40 so aus:

       page.20.marks.INHALT_M = TEXT
       page.20.marks.INHALT_M < page.temp.40

dann steht auf der Seite, die klar 3 Spalten ausgefüllt hat (also bei der vorherigen Ausgabe von page.temp.30 123 gezeigt hat) trotzdem "sonstiges".

Was mache ich denn bei der Abfrage falsch?

Ich dachte eigentlich, dass ich mit diesem if.isTrue.data die möglichen Werte abfrage und dann noch am Schluss einen Standardwert setze, wenn if.isEmpty.data ist (also wenn gar keine Inhalte eingetragen sind).

Nach meinem Verständnis sollte das doch gehen.
Kannst Du mir sagen, wie ich den Inhalt von page.temp.30 richtig anspreche, so dass die Abfrage auch funktionieren kann?

Der Versuch mit CASE ist aus meiner Sicht aus dem gleichen Grund gescheitert, aber ich finde kein Beispiel, in dem das so beschrieben ist, dass ich meinen Fehler erkennen kann.

Alles Liebe
Heike

etux ·

Hallo Heike,

ich muss mich leider kurz fassen.
Ich blicke auf die Schnelle nicht durch, was Du da alles veranstaltest.

Warum testest Du mein Script nicht im Original. Du brauchst nur

page.999 = COA
page.999 {
….................
}

mit

page.20.marks.INHALT_M = COA
page.20.marks.INHALT_M {
…................
}
ersetzen.

Vorausgesetzt INHALT_M ist die Stelle in Deiner html-Vorlage, wo alle Layout-Spalten hin kommen.

Wenn es funktioniert, brauchst Du nur die Wraps anzupassen - Klassen un ID entsprechend Deiner CSS-Formatierung.

Nimm dann Deine Bücher und teste schrittweise, was Deine Änderungen bewirken. Usw....

P.S.: Ein zweiter Wrap um alle Spalten ist in meinem Script auskommentiert. Für die Spalten-CSS-Formatierung brauchst es eh nicht. Gedacht ist es, wenn da weitere Elemente rein kommen sollten – header, footer usw. Dann solltest Du aber Dein COA erweitern.

Übrigens CSS: Dir ist klar, wie Du anhand der unterschiedlichen Klassen bei dem DIV, das alle Spalten umschließt, die Spalten für die verschiedene Fälle formatierst?

.

heikehk ·

Lieber Emil,

ja, das ist mir klar.
Ich habe nur das Problem, dass ich meine Templates ja nach Inhaltselementen auswählen wollte.
Das heißt, dass die MARKS erst dann gefüllt werden, wenn in Abhängigkeit des Inhalts die richtige Template-Datei verwendet wurde.

Da ja nach Variante die Klassen der DIVs für die Inhaltsspalten völlig anders sind und das im Kontext zu den anderen Spalten, kann ich das nicht so einfach austauschen.

Meine Idee war deshalb, dass ich für jede Variante eine Template-Datei habe, die sich jeweils nur im Bereich des "Inhalts" und dessen Formatierung unterscheidet. Beim Ersetzen der Marker wollte ich dann einfach INHLAT_L INHALT_M und INHALT_R mit den entsprechenden Inhalten bestücken. Ist in der Vorlage kein Inhalt für Rechts vorhanden stört diese zusätzliche Zeile ja nicht.

Da ich ja offensichtlich nicht in der Lage bin, diese Konfigurationen aus meinem temporären Objekte (page.temp.30) auszuwerten, kann ich das Ganze auch nicht mit wraps etc. lösen, denn auch dafür müsste ich ja wissen, welche Kombination ich habe.

Das mit den vorher ausgewählten Layouts finde ich gut, was ich aber nun losgelöst von meinem ursprünglichen Vorhaben wissen möchte ist:

Wie muss ein if aussehen oder ein CASE, mit dem ich je nach Inhalt von page.temp.30 etwas anderes mache?

Ich kann mir einfach nicht vorstellen, dass das nicht gehen soll, aber ich weiß nicht, was falsch ist. Immerhin scheint in dem Objekt ja alles drin zu stehen, was ich will. Warum kann ich es dann nicht vernünftig abfragen?

Wenn Du Zeit dafür hättest, oder jemand anderer, sich das if (letzter Eintrag) anzusehen und ihr mir sagen könntet, wie ich das lösen kann, dann nerve ich auch nicht weiter, versprochen. Wirklich völlig abgelöst von dem ursprünglichen Problem.

Ich will nur wissen, wie kann ich abhängig vom Inhalt von page.temp.30 eine andere Variable mit einem Inhalt bestücken?

Alles Liebe
Heike

etux ·

Morgen Heike,

ich befürchte, ich kann Dir nicht weiter helfen. Du sagst, dass es teilweise was ausgegeben wird, aus meiner Sicht ist keine einzige Code-Zeile richtig.
Du „überschreibst“ Dich auch selbst. So wird aus „10 = COA“ gleich danach ein „10 = TEXT“. Oder aus „page.20.marks.INHALT_M = TEXT“ ein „page.20.marks.INHALT_M = COA“.
Ich habe leider die Zeit nicht, in Deinem Vorhaben richtig einzusteigen. Mit der if-Funktion wird im Grunde entschieden, ob ein Objekt gerendert wird oder ein Wert zurück geliefert wird – in Abhängigkeit davon ob die Bedingung erfühlt wird oder nicht. Und das wiederum hängt von den (zusätzlichen) Eigenschaften ab.
Zu den Rest kann ich nur sagen, so wirklich verstehen, wie Du das ganze regeln willst, tue ich nicht. Aus meiner Sicht unnötig viel zu kompliziert. Inklusive die Klassen für die Spalten.
Vielleicht verstehe ich Dich aber einfach falsch. Wie ich schon sagte, ich habe leider die Zeit nicht, richtig einzusteigen – habe selbst viel um die Ohren

.

heikehk ·

Lieber Emil,

danke für den Versuch.
Ich bin gestern noch einmal weiter gekommen.
Du hast REcht, irgendwie dachte ich, dass ich ein Objekt, welches ich später noch mal verwenden will als COA definieren muss und dann als das, was es als Inhalt bekommt.
Die Ganze Lösung wird letztendlich nicht die die ich endgültig haben möchte.

Sollte ich das Ganze trotzdem zum Laufen bringen, dass schreibe ich auf jeden Fall rein wie. Ich hoffe, dass ich dann auch begriffen habe warum. Denn letztendlich gehts mittlerweile für mich nur noch darum.

Alles Liebe
Und Dir einen schönen Tag

Heike

heikehk ·

Lieber Emil,

ich habe zwar die If Abfrage und auch meine CASE Variante nicht zum Laufen bekommen, aber irgendwann muss man sich von Ideen lösen.

Ich habe mittlerweile viel darüber gelesen, dass viele, die schon Programmieren können durchaus ihre Probleme mit dem If und Abfragen in Typoscript haben.

Auf der Suche, was ich machen soll habe ich folgendes Tutorial gefunden:
http://blog.undkonsorten.com/typo3-4-5-tutorial-backend-layout-nutzen

Mit schwitzenden Pfötchen mein Typo3 4.4.6 auf 4.5 gebracht und die Anweisungen befolgt.
Es klappt. Da es sich um ein echtes Feld handelt kann ich meine Abfrage über eine Condition machen, das jeweilige Template zuweisen und alles ist gut.

Danke Dir trotz allem für Deine Unterstützung. Ich habe in der Zeit einiges mehr gelernt als ohne Dich.

Irgendwann kapier ich den Rest auch.

Alles Liebe

Heike