Teil 2 - Die Extension (der eigentliche PHP-Teil)
Als ertes schauen wir uns mal die erzeugten Dateien an (im Verzeichnis typo3conf/ext/tp_test)
- doc
-- wizard_form.dat (für den kickstarter relevant)
-- wizard_form.html (für den kickstarter relevant)
- pi1 (das ist unsere Extensionklasse)
-- static
--- editorcfg.txt (Die RTE-Konfiguration)
-- class.tx_tptest_pi1.php (unsere Hauptklasse)
-- locallang.xml (die Sprachdatei unserer Hauptklasse)
- ChangeLog (hier können wir Versionsbeschreibungen einfügen)
- ext_emconf.php (die Infos zur Extension)
- ext_icon.gif (das Extension-Icon, sichtbar im Extensionmanager)
- ext_localconf.php (Konfigurationsdatei)
- ext_tables.php (Konfiguration des TCA)
- ext_tables.sql (Die Tabellendefinitionen)
- icon_tx_tptest_items.gif (Das Icon für unsere Datensätze)
- locallang_db.xml (Die Sprachdatei für die Labels im backend)
- README.txt (Notizen)
- tca.php (das TCA-Array unserer Extension)
Es taucht ein Begriff auf: TCA (Table Configuration Array). Eine genauere Beschreibung dieses Arrays finden wir unter [1]
Für uns ist jetzt die pi1-Klasse entscheidend, wir öffnen die class.tx_tptest_pi1.php und die locallang.xml im Editor.
Der Kickstarter hat uns schon einiges an Code erzeugt. Dies ist nur ein Demo, wir schauen uns das mal an
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;
/**
* 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();
$content='
<strong>This is a few paragraphs:</strong><br />
<p>This is line 1</p>
<p>This is line 2</p>
<h3>This is a form:</h3>
<form action="'.$this->pi_getPageLink($GLOBALS['TSFE']->id).'" method="POST">
<input type="hidden" name="no_cache" value="1">
<input type="text" name="'.$this->prefixId.'[input_field]" value="'.htmlspecialchars($this->piVars['input_field']).'">
<input type="submit" name="'.$this->prefixId.'[submit_button]" value="'.htmlspecialchars($this->pi_getLL('submit_button_label')).'">
</form>
<br />
<p>You can click here to '.$this->pi_linkToPage('get to this page again',$GLOBALS['TSFE']->id).'</p>
';
return $this->pi_wrapInBaseClass($content);
}
}
Die main-Funktion wird aufgerufen, wenn wir das Plugin in einer Seite haben - das wollen wir jetzt machen. Wenn wir die Seite uns anschauen, sollten wir folgende Ausgabe sehen:
Was passiert da?
In der Funktion wird die Ausgabe in der Variablen $content gesammelt und am Schluss zurückgegeben (Kein echo oder print!).
Wir sehen laufend etwas mit pi_ - was soll das?
Unsere Hauptklasse ist eine Erweiterung der Klasse tslib_pibase. Diese befindet sich in typo3/sysext/cms/tslib/class.tslib_pibase.php
Alle Methoden dieser Klasse lassen sich also über $this->methode() aufrufen.
Was sind piVars?
Jede pi-Klasse hat ein eigenes Array für GET/POST-Variablen. Damit man sich nicht in die Quere kommt, ist das Array mit dem Prefix der Klasse versehen, in unserem Beispiel
tx_tptest_pi1[irgendwas]
Damit wir darauf leich zugreifen können werden diese am Anfang in ein Array verfrachtet ($
this->pi_setPiVarDefaults();) und sind über $this->piVars['irgendwas'] abrufbar. Dabei ist es egal, ob es GET oder POST-Vars sind.
Das schauen wir uns mal an, wir wollen debug nutzen (cc_debug installiert?)
Wir fügen folgende Zeile vor dem return ein:
PHP-Code:
debug($this->piVars);
Alternativ können wir auch ohne cc_debug ausgeben:
PHP-Code:
t3lib_div::debug($this->piVars,'unser debug');
Wir erhalten eine Ansicht unseres piVar-Arrays. Das überprüfen wir, in dem wir einfach über die Url eine Var hinzufügen:
index.php?id=15&tx_tptest_pi1[test]=20 wobei die 15 natürlich durch die Id der aktuellen Seite zu ersetzen ist.
nun sollten wir die Variable test in unserem Array sehen.
$this->pi_loadLL(); => mit dieser Anweisung wird die Sprachdatei geladen. Wir schauen sie uns an, es ist ein xml-Array
Wichtig ist die Sektion <languageKey index="default" type="array"> , die immer da sein muss. Default ist immer die englische Sprache, wollen wir auch deutsch anbieten, kopieren wir diese Sektion und fügen sie darunter an und ändern nach index="de"
Die Labels lassen sich in unserer pi1 einfach aufrufen mit
$this->pi_getLL('labelname') - wunderbar, Mehrsprachigkeit ist also kein Thema mehr.
Zusätzlich lässt sich unsere Extension über Typoscript konnfigurieren, die Konfiguration wird in $conf übergeben und ist in der Klasse über
$this->conf abrufbar.
Wir testen das und tragen in unser Setup folgende Zeilen ein:
Code:
plugin.tx_tptest_pi1 {
test = 20
test1 = 15
help = Ich bin ein Hilfetext
}
Nach speichern wollen wir sehen, ob es in der Extension ankommt, wir fügen folgende Debug-Anweisung ein:
PHP-Code:
debug($this->conf);
Wir sollten folgendes sehen:
Ein globales Objekt spielt für uns eine Rolle, es ist das $GLOBALS['TSFE']-Array. Ein debug dieses Arrays sprengt den Rahmen, es sind alle Objekte für das Rendern der Seite enthalten.
Für uns sind erstmal nur 2 Sachen wichtig:
$GLOBALS['TSFE']->id das ist die id der aktuellen Seite
$GLOBALS['TSFE']->page das sind die Infos der aktuellen Seite (der komplette Datensatz aus pages mit der uid der aktuellen Seite)
Wir brauchen uns diese Infos also nicht aus der DB holen.
Wir nutzen das gleich mal und basteln uns einen Link:
PHP-Code:
$content.=$this->pi_linkToPage($GLOBALS['TSFE']->page['title'],$GLOBALS['TSFE']->id);
wir sollten einen Link auf die aktuelle Seite mit dem Titel der Seite als Linktext sehen.
Woher kenne ich die Methoden der pibase ?
Wir haben uns ja extdeveval installiert, im BE haben wir oben eine Leiste mit der Offline-Doku, alle Methoden der pibase sehen wir durch Klick auf pibase.
Ihr könnt ein wenig damit spielen, bevor es dann zur relevanten Ausgabe kommt (im nächsten Teil)
[1]
http://typo3.org/documentation/docum...e_api/current/