1

我有一个基于 TemplaVoila 的 TYPO3 网站,我需要从 eID 脚本中访问我的电视页面内容。如何从我的脚本访问该 CE 字段中的内容?我知道如何为 eID 脚本提供所需页面的 ID 和 TV 字段的名称。

尽管我在网络上来回搜索,但似乎找不到任何关于如何从我自己的扩展程序或 eID 脚本中访问电视内容的信息。

4

1 回答 1

0

我的问题的基本问题是,eID 过程不适用于需要复杂 TYPO3 功能的任务,例如电视记录机制或 TYPO3 HTML 渲染器。

我实际上考虑过使用专用页面类型恢复到完整的 TYPO3 引擎。但是我不得不在一个页面中多次调用我的代码来渲染来自电视内容的图像,所以我必须寻找一个简化的过程。我决定继续使用 eID,而不是启动完整的 TYPO3 核心。

这是我最终想出的技巧。

警告:
此代码有多个弱点:

  1. 它不关心语言覆盖(但可能会扩展到这样做)。
  2. 它不使用任何专用的 TYPO3 HTML 渲染器,并且 HTML 输出在许多情况下都不会验证。(特别是输出可能包含嵌套在周围 P 标签中的 H1、H2、... 和 P 标签,因为我在这里绘制了非常简单的渲染器。)
  3. 不会包含任何错字链接 - 只有最基本的 HTML 输出会保留。

但这对我的特殊问题(单语言网站,使用创建的 HTML 的 PDF 渲染器)非常有效。所以它也可能对其他人有所帮助。

<?php
if (!defined('PATH_typo3conf'))
   die('Could not access this script directly!');

tslib_eidtools::connectDB(); //Connect to database

$id = t3lib_div::_GP('id');
$htmlData = readContentfromDB($id, 'myFieldName');
if(is_string($htmlData))  exit('Error: '.$htmlData);

$html = $htmlData['html'];
$lastChange = $htmlData['tstamp'];

exit($html);


// ----------
// readContentfromDB()
// returns string with error msg or assoc array with array( 'html'=>string([HTML CODE]), 'tstamp'=>int([LAST CHANGE TIMESTAMP]) )
// ----------
function readContentfromDB($id, $fieldName){
    global $TYPO3_DB;

    $res = $TYPO3_DB->exec_SELECTgetRows('tx_templavoila_flex', 'pages', 'uid='.(int)$id);
    if(!$res)  return 'Reading flexXML from page '.$id.' failed.';
    $flexXml = simplexml_load_string($res[0]['tx_templavoila_flex']);
    $recordsNodes = $flexXml->xpath('//field[@index="'.$fieldName.'"]/value');
    $records = explode(',', (string)$recordsNodes[0]);

    $html = '';
    $htmlTstamp = 0;
    foreach($records as $rec){
        $res = $TYPO3_DB->exec_SELECTgetRows('header, bodytext, tstamp', 'tt_content', "uid=$rec");
        if(!$res)  return 'Reading tt_content record '.$rec.' failed.';
        $tstamp = (int)$res[0]['tstamp'];
        $htmlTstamp = max($tstamp, $htmlTstamp);
        $header = '<h1>' . $res[0]['header'] . '</h1>';
        $bodyRaw =   $res[0]['bodytext'];
        $bodyArr = explode("\n", $bodyRaw);
        $body = '';
        foreach($bodyArr as $bodyLine) $body .= '<p>'.trim($bodyLine).'</p>';
        $html .= $header . $body;
    }

    return array('html'=>$html, 'tstamp'=>$htmlTstamp);
}

// ----------
?>

如果有人想出一种在 eID 中使用原始 TYPO3 渲染器的方法,我将很乐意接受您更好的答案!

于 2013-10-29T14:10:15.113 回答