(TYPO3, TypoScript)

TypoScript Feldnamen und Werte mit Variablen auslesen

Mit diesem lib Objekt kann man beliebige Felder aus Tabellen ausgeben. Sehr brauchbar zum Beispiel, wenn man bei der Indexed Search in der Ergebnisliste für Einzelansichten den Titel des Elements anzeigen lassen möchte und nicht den Titel der Seite mit der Einzelansicht.

TypoScript Snippet

lib.getFieldFromTable = COA
lib.getFieldFromTable {
	// store field name in register first
	10 = LOAD_REGISTER
	10.s_field.field = s_field
	20 = CONTENT
	20 {
		table.field = s_table
		select {
			uidInList.field = s_uid
			// get the page uid from record
			pidInList.cObject = TEXT
			pidInList.cObject {
				dataWrap = DB:{field:s_table}:{field:s_uid}:pid
				wrap3 = {|}
				insertData = 1
			}
		}
		renderObj = TEXT
		// here we use the stored field name
		renderObj.field.dataWrap = {register:s_field}
	}
}

Verwendung in einem FLUID Template

<f:cObject typoscriptObjectPath="lib.getFieldFromTable" 
           data="{s_uid:getVar.item,s_table:'tx_simplelist_domain_model_item',s_field:'title'}"/>

Bei der Indexed Search befinden sich die Angaben zur Einzelansicht im Knoten "row.static_page_arguments" als JSON String, den man zum Beipiel mit einem ViewHelper wandeln kann, um die Daten dann zu verwenden.

FLUID Beispiel für Indexed Search

<!-- DEBUG :: {row.static_page_arguments -> f:format.raw()} 
z.B. dann: {"tx_simplelist_view":{"action":"show","controller":"Item","item":"2"}} -->
<f:alias map="{getVars: '{row.static_page_arguments->d:format.jsonDecode()}'}">
	<f:if condition="{getVars}">
		<f:then>
			<!-- for each mit switch beliebig erweiterbar -->
			<f:for each="{getVars}" as="getVar" key="key">
				<f:switch expression="{key}">
					<f:case value="tx_simplelist_view">
						<f:cObject typoscriptObjectPath="lib.getFieldFromTable"
								   data="{s_uid:getVar.item,s_table:'tx_simplelist_domain_model_item',s_field:'title'}"/>  ({row.rating})
					</f:case>
					<f:defaultCase>{row.item_title->f:format.raw()} ({row.rating})</f:defaultCase>
				</f:switch>
			</f:for>
		</f:then>
		<f:else>{row.item_title->f:format.raw()} ({row.rating})</f:else>
	</f:if>
</f:alias>

ViewHelper

Den ViewHelper muss man selber erstellen, kann man aber den TYPO3 FLUID JsonViewHelper:
.../typo3/sysext/fluid/Classes/ViewHelpers/Format/JsonViewHelper.php
als Vorlage nehmen und muss dann mehr oder weniger nur statt "json_encode" ein "json_decode" einsetzen.