(TYPO3, TypoScript)

TypoScript Feldnamen und Werte mit Variablen auslesen

Mit diesem lib Object 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.
Man könnte natürlich auch via RECORDS einen Datensatz holen, ... klar.
Dieses Snippet soll eher denen helfen, bei denen das RECORDS Objekt faxen macht, zum Beispiel bei mehrsprachigen Seiten. Kann man so natürlich auch in einem DatabaseQueryProcessor verwenden.

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
			// simple try, if you don't know the pid ;-)
			// not really needed here, because we have uidInList value
			// use next line, if you don't need the pid querypart 
			// pidInList = 0
			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.