1

私は TemplaVoila ベースの TYPO3 Web サイトを持っており、eID スクリプト内から TV ページのコンテンツにアクセスする必要があります。スクリプトからその CE フィールドのコンテンツにアクセスするにはどうすればよいですか? 必要なページの ID と TV フィールドの名前を eID スクリプトに提供する方法を知っています。

自分の拡張機能または eID スクリプト内から TV コンテンツにアクセスする方法に関する情報が見つからないようですが、Web をあちこち検索しました。

4

1 に答える 1

0

私の質問の基本的な問題は、eID プロセスが、TV レコードの仕組みや TYPO3 HTML レンダラーなどの複雑な TYPO3 機能を必要とするタスク用に設計されていないことです。

私は実際に、専用のページ タイプを使用して完全な TYPO3 エンジンに戻すことを検討しました。しかし、TV コンテンツから画像をレンダリングするには、1 つのページでコードを何度も呼び出す必要があったため、合理化されたプロセスを探す必要がありました。完全な TYPO3 コアを起動する代わりに、eID を使用することにしました。

これが私が最終的に思いついたハックです。

警告:
このコードには複数の弱点があります。

  1. 言語のオーバーレイは気にしません (ただし、そうするように拡張できる可能性があります)。
  2. 専用の TYPO3 HTML レンダラーは使用せず、多くの場合、HTML 出力は検証されません。(特に、ここでスケッチした非常に単純なレンダラーにより、出力には、周囲の P タグ内にネストされた H1、H2、...、および P タグが含まれる場合があります。)
  3. タイプミスリンクは含まれません。最も基本的な HTML 出力のみが残ります。

しかし、これは私の特別な問題 (単一言語の Web サイト、作成された 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 に答える