Zum Inhalt springen

Problem mit COA/COA_INT und optionSplit

Erstellt am 27. September 2008 · 5 Antworten · letzte Antwort am 30. September 2008

Tags: Frage

tech7 ·

Hi,

ich habe mal wieder ein Problem. Wahrscheinlich wird es wieder keiner wissen, aber die Hoffnungs stirbt zuletzt ;-)

Ich möchte meine Content-Elemente strukturieren mit "First", "Middle" und "Last". Das habe ich mit TemplaVoila und einem ObjectPath schon hinbekommen und es klappt super!
Aber wenn ich den Code auf meinen Hauptcontent, also tt_content, anwenden will, funktioniert es nicht so richtig. Das TS:

temp.content = COA_INT
temp.content {
  10 = CONTENT
  10 {
    table = tt_content
    renderObj = COA
    renderObj {
      stdWrap.outerWrap = |###SPLIT###
      10 = TEXT
      10.field = header
      10.wrap = <h1>|</h1>
      20 = TEXT
      20.field = bodytext
      20.wrap = <p>|</p>
    }
  }
  
  stdWrap.split {
    token = ###SPLIT###
    wrap = <div class="content_first">|</div> |*| <div class="content_middle">|</div> |*| <div class="content_last">|</div> ||
  }
}

tt_content < temp.content

Mit der ersten Zeile "COA_INT" rendert er den ganzen Inhalt doppelt (bei COA_INT wird ja gecached). Wenn ich in der ersten zeile "COA" schreibe, wird nur das letzte Content Element verarbeitet.

Weiß jemand eine Lösung?

Danke im Voraus.

SLAng ·

Nein, bei COA_INT wird nicht gecached, sondern bei COA.

ich mag mich täuschen, aber versuchs mal so:

temp.content = COA_INT
temp.content {
	stdWrap.split {
		token = ###SPLIT###
		wrap = <div class="content_first">|</div> |*| <div class="content_middle">|</div> |*| <div class="content_last">|</div> ||
	}
	10 = CONTENT
	10 {
		table = tt_content
		renderObj = COA
		renderObj {
			stdWrap.outerWrap = |###SPLIT###
			10 = TEXT
			10.field = header
			10.wrap = <h1>|</h1>
			20 = TEXT
			20.field = bodytext
			20.wrap = <p>|</p>
		}
	}
}
tt_content < temp.content
steffenk ·

warum das split?

temp.content = COA
temp.content {
	10 = CONTENT
	10 {
		table = tt_content
                stdWrap. wrap = <div class="content_first">|</div> |*| <div class="content_middle">|</div> |*| <div class="content_last">|</div>
		renderObj = COA
		renderObj {
			stdWrap.outerWrap = |###SPLIT###
			10 = TEXT
			10.field = header
			10.wrap = <h1>|</h1>
			20 = TEXT
			20.field = bodytext
			20.wrap = <p>|</p>
		}
	}
}
tt_content < temp.content
tech7 ·

Hmm leider funktioniert es so nicht.
Der Split ist leider nötig, damit Typo3 überhaupt die Objekte unterscheiden kann. Mit dem "stdWrap.wrap" hatte ich es auch schon versucht.
Anscheinend gibt es keine Möglichkeit, ContentObjekte mit first|middle|last zu strukturieren 🙁

Den Post auf TYPO3Wizard hatte ich mir schon durchgelesen (http://www.typo3wizard.com/de/artikel/das-content-objekt.html) aber sie benutzen "styles.content.get", während ich mit TemplaVoila arbeite..

tech7 ·

Oh ha, ich kann's noch garnicht glauben, aber ich habe es tatsächlich hinbekommen!! :o

Also es ist ein kleiner Trick nötig, aber es lohnt sich allemal. Falls es jemand benötigt oder wissen will, wofür ich das gebraucht habe:

• das Template wird mit TemplaVoila umgesetzt
• der Benutzer/Redakteur soll das normale Inhalts-Modul im BE nutzen können, um Inhalte einpflegen zu können
• die generierten Content-Elemente sollen mit "first|middle|last" gekennzeichnet werden

Der Zweck des Ganzen (ein Beispiel):
Durch die Kennzeichnung der Content-Elemente (z.B. <div class="last">...</div>) lassen sich optimale CSS-Anpassungen erstellen. Beispielsweise hat jedes Content-Element einen Abstand nach unten hin, sodass das folgende Element nicht direkt "dranklebt". Jedoch soll das letzte Content-Element der Seite diesen Abstand nach unten hin nicht haben, da kein Content mehr kommt und das Design "zu Ende" ist.

Da ich Webseiten auch gestalte, ist mir das finale Ergebnis sehr wichtig - jeder Abstand muss exakt stimmen. Daher ist meine Entwicklung hauptsächlich für CSS-Perfektionisten, die z.B. keine negativen Margins/Paddings benutzen wollen, um die Inhalte wieder zurecht zu rücken.

Den Ansatz für OptionSplit im Content findet ihr bei Typo3 Wizard:
http://www.typo3wizard.com/de/artikel/das-content-objekt.html

Hier die Vorgehensweise:
• Template erstellen/Mappen mit TemplaVoila
Die Struktur könnte z.B. so aussehen:

<body>
<div id="temp_content"></div>
<div id="content">
	Content
</div>
</body>

Wichtig: Es muss eine Art "Platzhalter-Container" erstellt werden - in meinem Fall "<div id="temp_content"></div>". Dieser Container wird später im Code nicht mehr sichtbar sein. Der Trick ist, dass der normale Content über das normale BE-Modul eingepflegt wird, auf einen ObjectPath übertragen und später über das DataStructure-XML gelöscht wird.
Mapping:
body: Container for elements (ROOT)
div#temp_content: Element > "Content Elements", Mapping-Action > OUTER (Include Tag)
div#content: Element > "TypoScript Object Path" (Name z.B. "lib.content"), Mapping-Action > INNER (Exclude Tag)

Dann:
• DataStructure-XML editieren
Wechselt nun in die "Page templates"-Ansicht (links im Menü "TemplaVoila" usw.) und klickt auf den gelben Stift rechts neben dem DataStructure-Template-Icon (DS). Das XML editiert Ihr am besten in einem Text-Editor (Copy und dann wieder Paste) und geht zur folgenden Stelle:

<TypoScript><![CDATA[
	10= RECORDS
	10.source.current=1
	10.tables = tt_content
	10.wrap = <!--TYPO3SEARCH_begin-->|<!--TYPO3SEARCH_end-->
]]></TypoScript>

Hier fügt ihr diesen zwei Zeilen an die Zeile "10.wrap = <!--TYPO3SEARCH_begin-->|<!--TYPO3SEARCH_end-->" an:

10.conf.tt_content = TEXT
10.conf.tt_content.value =

Das XML speichern und anschließend Cache leeren.

Zuletzt:
• TypoScript editieren
Im TypoScript stehen z.B. oben die üblichen Zeilen und dann muss unten nur noch der TypoScript Object Path "lib.content" mit dem Inhalt gefüllt werden:

page = PAGE
page.typeNum = 0
page.10 = USER
page.10.userFunc = tx_templavoila_pi1->main_page

[...]

lib.content = COA_INT
lib.content {
  10 = CONTENT
  10 {
    table = tt_content
    renderObj = COA
    renderObj {
      stdWrap.outerWrap = |###SPLIT###
      10 < tt_content
    }
  }
 
  stdWrap.split {
    token = ###SPLIT###
    wrap = <div class="content_first">|</div> |*| <div class="content_middle">|</div> |*| <div class="content_last">|</div> ||
  }
}

Speichern, fertig. Von jetzt werden alle Content-Elemente mit den DIV-Klassen "content_first", "content_middle" und "content_last" gekennzeichnet. Bei vier Elementen z.B. wäre die Struktur dann

<div id="content">
	<div class="content_first">...</div>
	<div class="content_middle">...</div>
	<div class="content_middle">...</div>
	<div class="content_last">...</div>
</div>

Vielleicht ist diese Lösung für jemanden ja mal nützlich :-)

Grüße,
tech7

tech7 ·

Nachtrag:
Die Methode, die ich gebastelt habe, kostet doch etwas Performance, da der komplette Inhalt (tt_content) kopiert wird.
Ich habe inzwischen einen besseren Weg gefunden.

Quelle:
http://typo3.intervation.de/snippets/rte-ausgabe/templavoila-records-gesondert-formatieren.html

Vorgehensweise:
Template ganz normal erstellen, usw. und dann bei "Page templates" im "Local Processing" des TemplateObjects den folgenden Code eintragen:

<T3DataStructure>
	<ROOT type="array">
		<el type="array">
			<field_content type="array">
				<tx_templavoila type="array">
					<title>Inhalt</title>
					<sample_data type="array">
						<numIndex index="0"></numIndex>
					</sample_data>
					<eType>ce</eType>
					<TypoScript><![CDATA[
	30 = COA
	30 {
		10 = RECORDS
		10 {
			source.current=1
			tables = tt_content
			conf.tt_content.stdWrap.wrap = |###SPLIT###
		}
		stdWrap.split {
			token = ###SPLIT###
			wrap = <div class="content_first">|</div> |*| <div class="content_middle">|</div> |*| <div class="content_last">|</div> ||
		}
	}
                    ]]></TypoScript>
					<oldStyleColumnNumber type="integer">0</oldStyleColumnNumber>
				</tx_templavoila>
				<TCEforms type="array">
					<config type="array">
						<type>group</type>
						<internal_type>db</internal_type>
						<allowed>tt_content</allowed>
						<size>5</size>
						<maxitems>200</maxitems>
						<minitems>0</minitems>
						<multiple>1</multiple>
						<show_thumbs>1</show_thumbs>
					</config>
					<label>Inhalt</label>
				</TCEforms>
			</field_content>
		</el>
	</ROOT>
</T3DataStructure>

Das war's. Viel Spaß :-)[/b][/url]