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

Montag, 30. Juli 2012

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.