Teil 3 - wir wollen unsere Datensätze ausgeben
Also auf zur Ausgabe. Wir löschen alles was zu $content gehört und fangen an.
Wir wollen 2 Sachen ausgeben
- eine Liste aller Datensätz
- eine Detailansicht
Beides soll auf der gleichen Seite passiseren, die Unterscheidung wird über einen GET-Parameter gehen (item), der die uid des Datensatzes enthält.
Da wir in unserer Extension kein HTML erzeugen wollen, machen wir uns ein HTML-Template, das wir im root der Extension speichern
HTML-Code:
<!-- ###LISTVIEW### -->
<h2>Listenansicht</h2>
<ul>
<!-- ###ROW### -->
<li>###LINK###</li>
<!-- ###ROW### -->
</ul>
<!-- ###LISTVIEW### -->
<!-- ###DETAILVIEW### -->
<h2>Detailansicht</h2>
<p>###BACKLINK###</p>
<h3>###TITLE###</h3>
<p>###DATUM###</p>
<div>###TEXT###</div>
<p>###IMAGE###</p>
<p>###LINK###</p>
<!-- ###DETAILVIEW### -->
Das eingebaute Template-System ist extrem einfach. Es gibt 3 Teile
###MARKER### (einfache Marker)
<!-- ###SUBPARTMARKER -->...<!-- ###SUBPARTMARKER --> (einfache Subparts)
<!-- ###LINKSUBPARTMARKER -->...<!-- ###LINKSUBPARTMARKER --> (einfache Subparts für Links)
Wir sammeln unsere Marker in Arrays
$markerArray -> es werden die Marker durch den entsprechenden Inhalt ersetzt
$subpartArray -> es werden die Subparts durch den entsprechenden Inhalt ersetzt
$linkpartArray -> es werden die Links gesetzt nach dem Muster $linkpartArray[0] ... $linkpartArray[1]
zum Ersetzen haben wir eine Funktion:
$content = $this->cObj->substituteMarkerArrayCached($subpart,$markerArray,$subpartArray,$linkpartArray);
Wir wollen das Template laden:
PHP-Code:
$this->template=$this->cObj->fileResource('EXT:tp_test/template.html');
wir sehen was schönes: EXT: ist das Synonym für den Pfad typo3conf/ext.
Für die Ansichten machen wir also eine Fallunterscheidung
PHP-Code:
if($this->piVars['item']) {
$content = $this->detailView();
} else {
$content = $this->listView();
}
wir haben also die Ansichten in 2 Funktionen ausgelagert, damit es übersichtlicher bleibt.
Wir wollen uns einmal die fertige Extension anschauen
PHP-Code:
class tx_tptest_pi1 extends tslib_pibase {
var $prefixId = 'tx_tptest_pi1'; // Same as class name
var $scriptRelPath = 'pi1/class.tx_tptest_pi1.php'; // Path to this script relative to the extension dir.
var $extKey = 'tp_test'; // The extension key.
var $pi_checkCHash = true;
var $template;
var $id;
/**
* The main method of the PlugIn
*
* @param string $content: The PlugIn content
* @param array $conf: The PlugIn configuration
* @return The content that is displayed on the website
*/
function main($content,$conf) {
$this->conf=$conf;
$this->pi_setPiVarDefaults();
$this->pi_loadLL();
#ein paar Vorbelegungen
$this->id=$GLOBALS['TSFE']->id;
$this->template=$this->cObj->fileResource('EXT:tp_test/template.html');
#welche Ansicht?
if($this->piVars['item']) {
$content = $this->detailView();
} else {
$content = $this->listView();
}
return $this->pi_wrapInBaseClass($content);
}
function listView() {
#unser Subpart
$subpart=$this->cObj->getSubpart($this->template,'###LISTVIEW###');
#eine einzelne Reihe
$singlerow=$this->cObj->getSubpart($subpart,'###ROW###');
#Datensätze holen
$res=$GLOBALS['TYPO3_DB']->exec_SELECTquery(
'*', #select
'tx_tptest_items', #from
'hidden=0 and deleted=0 and pid='.$this->id, #where
$groupBy='',
$orderBy='',
$limit='');
if($res) {
$liste='';
while($row=$GLOBALS['TYPO3_DB']->sql_fetch_assoc($res)) {
$markerArray['###LINK###']=$this->pi_linkTP($row['title'],array($this->prefixId.'[item]'=> $row['uid']));
$liste .= $this->cObj->substituteMarkerArrayCached($singlerow,$markerArray);
}
$subpartArray['###ROW###']=$liste;
} else {
return $this->pi_getLL('nodata');
}
return $this->cObj->substituteMarkerArrayCached($subpart,$markerArray,$subpartArray,array());
}
function detailView() {
#unser Subpart
$subpart=$this->cObj->getSubpart($this->template,'###DETAILVIEW###');
#Datensatz holen
$record=$this->pi_getRecord('tx_tptest_items',$this->piVars['item']);
#Marker füllen
$markerArray['###TITLE###']=$record['title'];
$markerArray['###DATUM###']=date('d.m.Y',$record['date']);
$markerArray['###TEXT###']=$this->pi_RTEcssText($record['text']);
$markerArray['###IMAGE###']=$this->cObj->IMAGE(array(
'file' => 'uploads/tx_tptest/'.$record['image'],
'file.maxW' => 140,
));
$markerArray['###LINK###']=$this->cObj->typolink($record['link'],array(
'parameter' => $record['link'],
'extTarget' => '_blank',
));
#backlink als einfachen Link ohne Parameter
$markerArray['###BACKLINK###']=$this->pi_linkToPage($this->pi_getLL('back'),$this->id);
return $this->cObj->substituteMarkerArrayCached($subpart,$markerArray,array(),array());
}
}
und die entsprechende locallang.xml
Code:
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<T3locallang>
<meta type="array">
<type>module</type>
<description>Language labels for plugin "tx_tptest_pi1"</description>
</meta>
<data type="array">
<languageKey index="default" type="array">
<label index="back">Back to list</label>
<label index="nodata">no data available!</label>
</languageKey>
<languageKey index="de" type="array">
<label index="back">zurück zur Liste</label>
<label index="nodata">keine Daten vorhanden!</label>
</languageKey>
</data>
</T3locallang>
Achtung: die locallang.xml muss im utf8-Format gespeichert werden!
Erklärungen
Datenbank: wir müssen keine Verbindung aufbauen, da die bereits besteht. Statt normale mysql-Anweisungen nutzen wir die TYPO3-DBwrapper-Klasse. Das hat den Grund, da das nicht nur für mySql funktioniert, sondern auch mit dBal mit anderen DB-Engines funktioniert. Der Syntax ist in der Doku der extdeveval erklärt, klick auf DB.
Als Faustregel kann man die üblichen php-Befehle benutzen nach dem Muster
mysql_query($sql) => $GLOBALS['TYPO3_DB']->sql_query($sql)
mysql_num_rows($res) => $GLOBALS['TYPO3_DB']->sql_num_rows($res)
usw.
cObj (Abk. für Content-Object) ist die Klasse tslib_content (typo3/sysext/cms/tslib/class.tslib_content.php)
Die Objekte und Methoden finden wir wieder bei extdeveval unter cObj
Die Funktion $this->pi_RTEcssText wandelt einen Richtext in das entsprechende HTML um.
Soweit erstmal, ich denke, das es nicht besonders kompliziert war - wenn Fragen auftauchen, können die hier gestellt werden,
Erstmal viel Spass beim Nachbauen und Experimentieren !