2013-10-21 65 views
1

我有一個基於TemplaVoila的TYPO3網站,我需要從eID腳本中訪問我的電視頁面內容。如何從我的腳本訪問該CE字段中的內容?我知道如何爲eID腳本提供所需頁面的ID和電視字段的名稱。從eID腳本訪問TemplaVoila內容

似乎我無法從我自己的擴展或eID腳本中找到有關如何訪問電視內容的任何信息,儘管我在網上來回搜索。

回答

0

我的問題的基本問題是,eID過程不適用於需要像TV記錄機制或TYPO3 HTML呈現器那樣複雜的TYPO3函數的任務。

我實際上考慮通過使用專用頁面類型來恢復到完整的TYPO3引擎。但是我不得不在單個頁面中多次調用我的代碼來呈現電視內容中的圖像,所以我不得不尋找一個簡化的過程。我決定留下eID而不是啓動完整的TYPO3內核。

這是我終於想出來的黑客。

被警告:
這段代碼有多個弱點:

  1. 它不關心語言覆蓋(但也許可以擴展到這樣做)。
  2. 它不使用任何專用的TYPO3 HTML渲染器,並且HTML輸出在許多情況下不會被驗證。 (特別是輸出可能包含嵌套在周圍P標籤內的H1,H2,...和P標籤,這是由於我在此繪製的非常簡單的渲染器。)
  3. 不包含任何typolinks - 只有最基本的HTML輸出將存活。

但是,這對我的特殊問題(單一語言網站,PDF渲染器使用創建的HTML)非常有效。所以它也可以幫助其他人。

<?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渲染器,我會很樂意接受您的更好的答案!