TemplaVoilà FCE verschwindet, wenn es Content-Elemente enthält

Seltsames Phänomen: Die Webseite verwendet TemplaVoilà und die Extension kbtvcontslide um per TypoScript RECORDS in der Marginalspalte auf Unterseiten zu „vererben“. Bei normalen Inhaltselementen klappt das wunderbar – aber sobald ein TemplaVoilà FCE mit Inhaltselementen (Subelementen) eingesetzt wird, verschwindet das komplette FCE von der Seite. Noch unerklärlicher: Auf den vererbten Unterseiten wird das FCE wieder dargestellt – nur eben nicht auf der Seite, in die es ursprünglich eingefügt wurde.

Die Spur führte nach einigen Stunden zu einer Zeile im Script typo3/sysext/cms/tslib/content/class.tslib_content_records.php. Hier wird durch ein Inkrement $GLOBALS[‚TSFE‘]->recordRegister[$originalRec]++; sicher gestellt, dass es beim Rendern von Elementen keine endlosen Rekursionen passieren. Eigentlich eine sinnvolle Einschränkung – die aber in dem Zusammenspiel mit TemplaVoilà und kbtvcontslide zu Problemen führt, weil zur Darstellung das Element scheinbar mehrmals gerendert wird.

Das Problem wird auch hier beschrieben – allerdings ist noch ungeklärt, wie und ob die Typo3-Core-Entwickler darauf eingehen werden: http://forge.typo3.org/issues/20541

Man findet unterschiedliche Lösungsansätze – die meisten sind allerdings eher problematisch, weil sie Core-Dateien verändern und damit Updates von Typo3 schwierig machen. Unsere Lösung ist auch nicht wirklich schön – aber funktioniert und greift nicht in den Typo3-Core ein.

1. PHP-Script User-Func auf dem Server anlegen

Dieses Script kommt z.B. ins fileadmin-Verzeichnis. Wir haben Sie „class.userfunctions.php“ genannt und im Verzeichnis „fileadmin/scripts/class.userfunctions.php“ gespeichert.

<?php
 
require_once(PATH_tslib.'class.tslib_pibase.php');
 
class user_functions extends tslib_pibase {
 
function get_record_fix ( $content, $conf ) {
 
$cObj = $this->cObj;
$content = '';
 
$vars = array();
foreach ($conf['userFunc.'] as $k=>$v) {
if (substr($k,-1) != '.') $vars[$k] = $cObj->cObjGetSingle($v, $conf['userFunc.']["{$k}."]);
}
 
$uids = explode(',', $vars['uid']);
 
// Crazy: Trotz des Hacks wird das erste Element nicht gerendert! Deshalb ein "Fake"-Element ganz am Anfang einfügen
array_unshift($uids, '-1');
 
foreach ($uids as $cnt=>$uid) {
$tmp = '';
$tmp .= $cObj->RECORDS(array('tables'=>'tt_content', 'source'=>$uid, 'dontCheckPid'=>1));      
$GLOBALS['TSFE']->recordRegister = array();
if ($uid > 0) $content .= $tmp;
}
return $content;
}
}
?>

3. TypoScript für den tv-content-slide

Diese Script zeigt, wie die Content-Elemente und FCEs dann mit Hilfe des neuen Scripts ausgelesen werden können. „field_side_global“ ist der Feld-Name in dem TemplaVoilà-Mapping für die Inhaltselemente der Marginalspalte. Als kleine Ergänzung sieht man auch, wie die Bildgrößen in der Marginalspalte des TemplaVoilà-Seitentemplates begrenzt werden können.

lib.sidebar_global = COA
lib.sidebar_global {
 
5 = LOAD_REGISTER
5 {
maxImageWidth = 240
maxImageWidthInText = 240
}
 
10 = USER
10 {
userFunc = user_functions->get_record_fix
userFunc.uid = TEXT
userFunc.uid {
postUserFunc = tx_kbtvcontslide_pi1->main
postUserFunc.field = field_side_global
}
}
 
20 = RESTORE_REGISTER
}

Für Suchmaschinen: FCE-Element wird nur einmal gerendert, FCE RECORDS Typoscript unsichtbar, TypoScript RECORDS nur einmal pro Seite gerendert, FCE mit Inhaltselementen RECORDS unsichtbar, Templavoila RECORDS content Problem.