Ebner / Ulbrich / Lobacher | TYPO3-Extensions | E-Book | sack.de
E-Book

E-Book, Deutsch, 466 Seiten

Ebner / Ulbrich / Lobacher TYPO3-Extensions

Professionelle Frontend- und Backend-Programmierung mit extbase und fluid
1. Auflage 2010
ISBN: 978-3-446-42357-2
Verlag: Hanser, Carl
Format: PDF
Kopierschutz: Adobe DRM (»Systemvoraussetzungen)

Professionelle Frontend- und Backend-Programmierung mit extbase und fluid

E-Book, Deutsch, 466 Seiten

ISBN: 978-3-446-42357-2
Verlag: Hanser, Carl
Format: PDF
Kopierschutz: Adobe DRM (»Systemvoraussetzungen)



Das frei verfügbare TYPO3 spielt im Markt der Content Management Systeme eine zentrale Rolle. Mit ein Grund für diesen Erfolg sind die vielfältigen Möglichkeiten der Erweiterung des Systems durch eigene Extensions (Erweiterungen).Das vorliegende Buch steigt an dieser Stelle ein, indem es zunächst in das TYPO3-Framework einführt und alle daran beteiligten Komponenten vorstellt. Schritt für Schritt wird der Leser durch die Welt der Extensionprogrammierung für das TYPO3-Backend und -Frontend geleitet; dabei werden alle Aspekte der Extensionentwicklung behandelt. Unterstützt wird die Darstellung durch zahlreiche anschauliche Beispiele. Ein abschließender Referenzteil nennt und erläutert sämtliche Referenzen, API‘s, Strukturen und Funktionen.Das Buch empfiehlt sich allen TYPO3-Anwendern und -Entwicklern, die mithilfe von eigenen Erweiterungen und Extensions das TYPO3-Grundsystem leistungsfähiger machen möchten.Besonderheit des Buches: Die am häufigsten verwendeten Referenzen, APIs und Strukturen wie Flexform oder TCA/TCE, die nur wenige Entwickler parat haben, sind auf einer dem Buch beiliegenden Referenzkarte zusammengefasst.
Ebner / Ulbrich / Lobacher TYPO3-Extensions jetzt bestellen!

Weitere Infos & Material


1;Inhalt;6
2;Vorwort;18
3;Teil I Klassische Extensionprogrammierung;20
3.1;1 Grundlagen;22
3.1.1;1.1 Aufbau und Struktur von TYPO3;22
3.1.2;1.2 Aufbau einer Extension;25
3.1.3;1.3 Arten und Einteilung von Extensions;26
3.1.4;1.4 Der Extension-Key;27
3.1.5;1.5 TYPO3 Coding Guidelines;28
3.1.5.1;1.5.1 Namespace;29
3.1.5.2;1.5.2 PHP-Regeln;30
3.1.5.3;1.5.3 Dateistruktur;31
3.1.5.4;1.5.4 PHP-Syntax;34
3.1.5.5;1.5.5 phpDoc2;40
3.1.5.6;1.5.6 Changelog;41
3.2;2 Eine Extension planen undentwickeln;42
3.2.1;2.1 Extensions planen;42
3.2.1.1;2.1.1 Wir planen eine Blog-Extension;43
3.2.2;2.2 Der Kickstarter;45
3.2.2.1;2.2.1 Die Datenbank;47
3.2.2.2;2.2.2 Datenbanktabellen und Formulare – eine Erklärung;53
3.2.2.3;2.2.3 Extend existing Tables;55
3.2.2.4;2.2.4 Frontend-Plug-ins;56
3.2.2.5;2.2.5 Backend-Module;59
3.2.2.6;2.2.6 Integrate in existing Modules;60
3.2.2.7;2.2.7 Clickmenu items;60
3.2.2.8;2.2.8 Services;61
3.2.2.9;2.2.9 Static TypoScript code;62
3.2.2.10;2.2.10 TSconfig;62
3.2.2.11;2.2.11 Die Extension erstellen;63
3.2.3;2.3 Extension-Konfiguration mit ext_emconf.php;64
3.2.4;2.4 Die weiteren Dateien der Extension;69
3.2.4.1;2.4.1 Verzeichnis doc;69
3.2.4.2;2.4.2 Verzeichnis mod#;69
3.2.4.2.1;2.4.2.1 Datei mod#/conf.php;69
3.2.4.2.2;2.4.2.2 Datei mod#/index.php;70
3.2.4.2.3;2.4.2.3 Datei mod#/locallang.xml;70
3.2.4.2.4;2.4.2.4 Datei mod#/locallang_mod.xml;70
3.2.4.3;2.4.3 Verzeichnis modfunc#;70
3.2.4.3.1;2.4.3.1 Datei modfunc#/class.tx_extkey_modfunc1.php;70
3.2.4.4;2.4.4 Verzeichnis pi#;71
3.2.4.4.1;2.4.4.1 Datei pi#/class.tx_extkey_pi#.php;71
3.2.4.4.2;2.4.4.2 Datei pi#/class.tx_extkey_pi#_wizicon.php;71
3.2.4.4.3;2.4.4.3 Datei pi#/ce_wiz.gif;71
3.2.4.4.4;2.4.4.4 Datei pi#/clear.gif;71
3.2.4.4.5;2.4.4.5 Datei pi#/static/setup.txt;71
3.2.4.5;2.4.5 Verzeichnis Static;71
3.2.4.6;2.4.6 Datei Changelog;72
3.2.4.7;2.4.7 Datei README.txt;72
3.2.4.8;2.4.8 Datei ext_icon.gif;72
3.2.4.9;2.4.9 Datei ext_localconf.php;72
3.2.4.10;2.4.10 Datei ext_tables.php;72
3.2.4.11;2.4.11 Datei ext_tables.sql;73
3.2.4.12;2.4.12 Datei ext_tables_static+adt.sql;74
3.2.4.13;2.4.13 Dateien Icon_tx_extkey_tabellenname.gif;75
3.2.4.14;2.4.14 Datei locallang.xml;75
3.2.4.15;2.4.15 Datei locallang_db.xml;75
3.2.4.16;2.4.16 Datei tca.php;75
3.2.4.16.1;2.4.16.1 Checkboxen;76
3.2.4.16.2;2.4.16.2 Erweiterte Input-Felder;77
3.2.4.16.3;2.4.16.3 Validierung mit eval;77
3.2.4.16.4;2.4.16.4 Benutzerdefinierte Validierung;79
3.2.4.16.5;2.4.16.5 Bildupload-Feld;79
3.2.4.16.6;2.4.16.6 Textfelder mit RTE;80
3.2.4.16.7;2.4.16.7 M-M-Relationen;81
3.3;3 Backend-Module erstellen;84
3.3.1;3.1 Module konfigurieren und im Hauptmenü anordnen;84
3.3.2;3.2 Einen eigenen Navigationsbaum erstellen;88
3.3.3;3.3 Backend-Modul erstellen;94
3.3.3.1;3.3.1 Das Modul initialisieren;94
3.3.3.2;3.3.2 Den Modulinhalt aufbauen;98
3.3.3.3;3.3.3 Extension-Konfiguration über ext_conf_template.txt;99
3.3.3.4;3.3.4 Backend-Formulare aufrufen;101
3.3.3.5;3.3.5 Eine Datensatzliste mit Bearbeitungsfunktionen erstellen;103
3.3.3.5.1;3.3.5.1 Einen Pagebrowser hinzufügen;106
3.3.3.6;3.3.6 Aufgabe: Module für Kommentare, Blog und Blogroll;109
3.3.3.6.1;3.3.6.1 Tipps;109
3.3.3.6.2;3.3.6.2 Zusatzaufgabe;110
3.3.4;3.4 Backend User Object – $BE_USER;110
3.3.5;3.5 Das Systemlog;111
3.4;4 Frontend-Plug-ins;114
3.4.1;4.1 Das Frontend-Plug-in im Überblick;114
3.4.2;4.2 Feldinhalte für die Ausgabe aufbereiten;122
3.4.2.1;4.2.1 Das Bild für Teaser Image;123
3.4.2.2;4.2.2 Ausgabe des Haupttextes in der Listenansicht, wennerwünscht;124
3.4.2.3;4.2.3 Haupttext mit RTE formatieren;124
3.4.2.4;4.2.4 Haupttext statt Teasertext anzeigen, falls dieser nichtverfügbar ist;125
3.4.2.5;4.2.5 Verlinken des Autorennamens mit der Mail-Adresse desAutors;125
3.4.2.6;4.2.6 Kategorien als Namen anzeigen und verlinken (Relationen);126
3.4.3;4.3 HTML-Templates für das Plug-in;128
3.4.4;4.4 Die Kommentarfunktion mit AJAX und eID;133
3.4.4.1;4.4.1 Ausgabe vorhandener Kommentare;134
3.4.4.2;4.4.2 Das Kommentarformular hinzufügen;137
3.4.5;4.5 Was sind Hooks?;142
3.4.6;4.6 Flexforms;144
3.4.6.1;4.6.1 Erzeugen der Flexform;145
3.4.7;4.7 Das Plug-in pi2;151
3.5;5 Dokumentation und Abschluß;152
3.5.1;5.1 Code dokumentieren mit extdeveval;152
3.5.2;5.2 Extension-Dokumentation schreiben;153
3.5.2.1;5.2.1 Die Vorlage;154
3.5.2.2;5.2.2 Der Aufbau der Dokumentation;154
3.5.2.3;5.2.3 Vorlagenstile;155
3.5.2.4;5.2.4 Die Dokumentation verfassen;155
3.5.3;5.3 Upload ins TER;156
4;Teil II Funktionsreferenz zur klassischenExtensionprogrammierung;158
4.1;6 Datenbank;160
4.1.1;6.1 $GLOBALS['TYPO3_DB'];160
4.1.1.1;6.1.1 exec_SELECTquery;160
4.1.1.2;6.1.2 exec_SELECT_queryArray;160
4.1.1.3;6.1.3 exec_SELECTgetRows;161
4.1.1.4;6.1.4 exec_SELECT_mm_query;161
4.1.1.5;6.1.5 exec_INSERTquery;162
4.1.1.6;6.1.6 exec_UPDATEquery;162
4.1.1.7;6.1.7 exec_DELETEquery;162
4.1.1.8;6.1.8 sql_fetch_assoc;162
4.1.1.9;6.1.9 sql_fetch_row;163
4.1.1.10;6.1.10 searchQuery;163
4.1.1.11;6.1.11 listQuery;163
4.1.1.12;6.1.12 splitGroupOrderLimit;164
4.1.1.13;6.1.13 quoteStr;164
4.1.1.14;6.1.14 fullQuoteStr;164
4.1.1.15;6.1.15 fullQuoteArray;165
4.1.1.16;6.1.16 escapeStrForLike;165
4.1.1.17;6.1.17 cleanIntArray;166
4.1.1.18;6.1.18 cleanIntList;166
4.1.1.19;6.1.19 debug_lastBuiltQuery;166
4.1.2;6.2 tslib_pibase;167
4.1.2.1;6.2.1 pi_exec_query;167
4.1.2.2;6.2.2 pi_getPidList;168
4.1.2.3;6.2.3 pi_getRecord;169
4.1.2.4;6.2.4 pi_prependFieldsWithTable;169
4.1.3;6.3 cObj;169
4.1.3.1;6.3.1 DBgetDelete;169
4.1.3.2;6.3.2 DBgetInsert;170
4.1.3.3;6.3.3 DBgetUpdate;171
4.1.3.4;6.3.4 enableFields;172
4.2;7 Dateisystem;174
4.2.1;7.1 t3lib_div;174
4.2.1.1;7.1.1 dirname;174
4.2.1.2;7.1.2 fixWindowsFilePath;174
4.2.1.3;7.1.3 formatSize;175
4.2.1.4;7.1.4 get_dirs;175
4.2.1.5;7.1.5 getAllFilesAndFoldersInPath;176
4.2.1.6;7.1.6 getFileAbsFileName;177
4.2.1.7;7.1.7 getFilesInDir;177
4.2.1.8;7.1.8 getURL;178
4.2.1.9;7.1.9 isAbsPath;178
4.2.1.10;7.1.10 isAllowedAbsPath;178
4.2.1.11;7.1.11 mkdir;179
4.2.1.12;7.1.12 mkdir_deep;179
4.2.1.13;7.1.13 removePrefixPathFromList;179
4.2.1.14;7.1.14 resolveBackPath;180
4.2.1.15;7.1.15 rmdir;180
4.2.1.16;7.1.16 split_fileref;181
4.2.1.17;7.1.17 tempnam;181
4.2.1.18;7.1.18 unlink_tempfile;181
4.2.1.19;7.1.19 upload_copy_move;181
4.2.1.20;7.1.20 upload_to_tempfile;182
4.2.1.21;7.1.21 verifyFilenameAgainstDenyPattern;182
4.2.1.22;7.1.22 writeFile;183
4.2.1.23;7.1.23 writeFileToTypo3tempDir;183
4.3;8 Strings, Arrays undUmgebungsvariablen;184
4.3.1;8.1 Allgemeine Funktionen;184
4.3.1.1;8.1.1 _GET;184
4.3.1.2;8.1.2 _GETset;184
4.3.1.3;8.1.3 _GP;185
4.3.1.4;8.1.4 _POST;185
4.3.1.5;8.1.5 callUserFunction;185
4.3.1.6;8.1.6 clientInfo;186
4.3.1.7;8.1.7 compat_version;186
4.3.1.8;8.1.8 compileSelectedGetVarsFromArray;187
4.3.1.9;8.1.9 getHostname;187
4.3.1.10;8.1.10 getIndpEnv;187
4.3.1.11;8.1.11 getThisUrl;187
4.3.1.12;8.1.12 linkThisScript;188
4.3.1.13;8.1.13 linkThisUrl;188
4.3.1.14;8.1.14 locationHeaderUrl;188
4.3.1.15;8.1.15 makeInstance;189
4.3.1.16;8.1.16 makeInstanceService;189
4.3.1.17;8.1.17 rmFromList;189
4.3.1.18;8.1.18 sysLog;190
4.3.2;8.2 String-Funktionen;190
4.3.2.1;8.2.1 calcParenthesis;190
4.3.2.2;8.2.2 cmpFQDN;190
4.3.2.3;8.2.3 cmpIP;191
4.3.2.4;8.2.4 convUmlauts;191
4.3.2.5;8.2.5 csvValues;191
4.3.2.6;8.2.6 deHSCentities;192
4.3.2.7;8.2.7 expandList;192
4.3.2.8;8.2.8 fixed_lgd;192
4.3.2.9;8.2.9 fixed_lgd_pre;193
4.3.2.10;8.2.10 formatForTextarea;193
4.3.2.11;8.2.11 generateRandomBytes;193
4.3.2.12;8.2.12 get_tag_attributes;194
4.3.2.13;8.2.13 htmlspecialchars_decode;194
4.3.2.14;8.2.14 implodeArrayForUrl;194
4.3.2.15;8.2.15 implodeAttributes;195
4.3.2.16;8.2.16 inList;195
4.3.2.17;8.2.17 int_from_ver;196
4.3.2.18;8.2.18 intInRange;196
4.3.2.19;8.2.19 intval_positive;196
4.3.2.20;8.2.20 isFirstPartOfStr;197
4.3.2.21;8.2.21 md5int;197
4.3.2.22;8.2.22 milliseconds;198
4.3.2.23;8.2.23 modifyHTMLColor;198
4.3.2.24;8.2.24 modifyHTMLColorAll;198
4.3.2.25;8.2.25 normalizeIPv6;199
4.3.2.26;8.2.26 removeXSS;199
4.3.2.27;8.2.27 revExplode;199
4.3.2.28;8.2.28 rm_endcomma;200
4.3.2.29;8.2.29 shortMD5;200
4.3.2.30;8.2.30 split_tag_attributes;200
4.3.2.31;8.2.31 splitCalc;201
4.3.2.32;8.2.32 strtolower;201
4.3.2.33;8.2.33 strtoupper;202
4.3.2.34;8.2.34 substUrlsInPlainText;202
4.3.2.35;8.2.35 testInt;203
4.3.2.36;8.2.36 trimExplode;203
4.3.2.37;8.2.37 uniqueList;204
4.3.2.38;8.2.38 validEmail;204
4.3.2.39;8.2.39 validIP;204
4.3.2.40;8.2.40 validIPv4;205
4.3.2.41;8.2.41 validIPv6;205
4.3.3;8.3 Array-Funktionen;205
4.3.3.1;8.3.1 addSlashesOnArray;205
4.3.3.2;8.3.2 array_merge;206
4.3.3.3;8.3.3 array_merge_recursive_overrule;206
4.3.3.4;8.3.4 array2json;207
4.3.3.5;8.3.5 array2xml;207
4.3.3.6;8.3.6 arrayToLogString;208
4.3.3.7;8.3.7 explodeUrl2Array;209
4.3.3.8;8.3.8 inArray;209
4.3.3.9;8.3.9 print_array;209
4.3.3.10;8.3.10 removeArrayEntryByValue;210
4.3.3.11;8.3.11 slashArray;210
4.3.3.12;8.3.12 view_array;211
4.3.3.13;8.3.13 xml2array;211
4.3.3.14;8.3.14 xml2tree;212
4.3.3.15;8.3.15 xmlGetHeaderAttribs;213
4.3.4;8.4 String-Funktionen in Frontend-Plug-ins;214
4.3.4.1;8.4.1 calcAge;214
4.3.4.2;8.4.2 checkEmail;214
4.3.4.3;8.4.3 codeString;214
4.3.4.4;8.4.4 encryptEmail;215
4.3.4.5;8.4.5 HTMLcaseshift;215
4.3.4.6;8.4.6 keywords;215
4.3.4.7;8.4.7 linebreaks;216
4.3.4.8;8.4.8 processParams;216
4.3.4.9;8.4.9 uniqueHash;217
4.3.4.10;8.4.10 URLqMark;217
4.4;9 Bilder;218
4.4.1;9.1 Einbinden;218
4.4.2;9.2 Bearbeiten;219
4.4.2.1;9.2.1 Bild umrechnen (fürs Web optimieren);219
4.4.2.2;9.2.2 Abmessungen ändern;220
4.4.2.3;9.2.3 Zuschneiden;220
4.4.2.4;9.2.4 Graustufen;221
4.4.3;9.3 Erzeugen;222
4.4.3.1;9.3.1 Bild in bestehendes Bild einfügen;222
4.4.3.2;9.3.2 Text erzeugen;223
4.5;10 AJAX im Frontend;224
4.5.1;10.1 eID;224
4.5.1.1;10.1.1 Konfiguration;224
4.5.1.2;10.1.2 Basisdatei;225
4.5.2;10.2 Zusammenspiel AJAX & eID;225
4.5.2.1;10.2.1 Aufbau der XML-Response;225
4.5.2.2;10.2.2 AJAX-Request und Verarbeitung;226
4.6;11 Frontend-Plug-ins;228
4.6.1;11.1 Cache;228
4.6.1.1;11.1.1 cacheExpires;228
4.6.1.2;11.1.2 clearPageCacheContent;228
4.6.1.3;11.1.3 clearPageCacheContent_pidList;228
4.6.1.4;11.1.4 get_cache_timeout;229
4.6.1.5;11.1.5 set_cache_timeout_default;229
4.6.1.6;11.1.6 set_no_cache;229
4.6.2;11.2 Content-Elemente;230
4.6.2.1;11.2.1 cImage;230
4.6.2.2;11.2.2 cleanFormName;230
4.6.2.3;11.2.3 cObjGet;230
4.6.2.4;11.2.4 cObjGetSingle;231
4.6.2.5;11.2.5 currentPageUrl;231
4.6.2.6;11.2.6 fileResource;232
4.6.2.7;11.2.7 getImgResource;232
4.6.2.8;11.2.8 getSlidePids;232
4.6.2.9;11.2.9 gifBuilderTextBox;232
4.6.2.10;11.2.10 stdWrap;233
4.6.3;11.3 Links;234
4.6.3.1;11.3.1 baseUrlWrap;234
4.6.3.2;11.3.2 getMailTo;234
4.6.3.3;11.3.3 getTypoLink;235
4.6.3.4;11.3.4 getTypoLink_URL;235
4.6.3.5;11.3.5 http_makelinks;236
4.6.3.6;11.3.6 imageLinkWrap;236
4.6.3.7;11.3.7 mailto_makelinks;236
4.6.3.8;11.3.8 pi_getPageLink;237
4.6.3.9;11.3.9 pi_linkToPage;237
4.6.3.10;11.3.10 pi_linkTP;238
4.6.3.11;11.3.11 pi_linkTP_keepPIvars;238
4.6.3.12;11.3.12 pi_linkTP_keepPIvars_url;238
4.6.3.13;11.3.13 pi_openAtagHrefInJSwindow;239
4.6.3.14;11.3.14 prefixLocalAnchorsWithScript;239
4.6.4;11.4 Listen;239
4.6.4.1;11.4.1 pi_list_browseresults;240
4.6.4.2;11.4.2 pi_list_linkSingle;241
4.6.4.3;11.4.3 pi_list_makelist;241
4.6.4.4;11.4.4 pi_list_modeSelector;242
4.6.4.5;11.4.5 pi_list_searchBox;242
4.6.5;11.5 JavaScript;243
4.6.5.1;11.5.1 additionalHeaderData;243
4.6.5.2;11.5.2 additionalJavaScript;243
4.6.5.3;11.5.3 JSeventFuncCalls;244
4.6.5.4;11.5.4 minifyJavaScript;244
4.6.5.5;11.5.5 quoteJSvalue;245
4.6.5.6;11.5.6 rawUrlEncodeJS;245
4.6.5.7;11.5.7 setJS;245
4.6.5.8;11.5.8 wrapJS;246
4.6.6;11.6 CSS;246
4.6.6.1;11.6.1 additionalCSS;246
4.6.6.2;11.6.2 additionalHeaderData;247
4.6.6.3;11.6.3 pi_getClassName;247
4.6.6.4;11.6.4 pi_setClassStyle;247
4.6.6.5;11.6.5 setCSS;248
4.6.7;11.7 Mehrsprachigkeit;249
4.6.7.1;11.7.1 getLLL;249
4.6.7.2;11.7.2 pi_getLL;249
4.6.7.3;11.7.3 readLLfile;250
4.6.8;11.8 Umgebungsvariablen und allgemeine Funktionen;250
4.6.8.1;11.8.1 absRefPrefix;250
4.6.8.2;11.8.2 additionalHeaderData;251
4.6.8.3;11.8.3 all;251
4.6.8.4;11.8.4 anchorPrefix;252
4.6.8.5;11.8.5 applicationData;252
4.6.8.6;11.8.6 ATagParams;252
4.6.8.7;11.8.7 baseUrl;253
4.6.8.8;11.8.8 baseUrlWrap;253
4.6.8.9;11.8.9 beUserLogin;253
4.6.8.10;11.8.10 clientInfo;253
4.6.8.11;11.8.11 content;254
4.6.8.12;11.8.12 defaultBodyTag;254
4.6.8.13;11.8.13 domainStartPage;254
4.6.8.14;11.8.14 extTarget;255
4.6.8.15;11.8.15 fePreview;255
4.6.8.16;11.8.16 id;255
4.6.8.17;11.8.17 imagesOnPage;256
4.6.8.18;11.8.18 intTarget;256
4.6.8.19;11.8.19 lang;256
4.6.8.20;11.8.20 lastImageInfo;257
4.6.8.21;11.8.21 loginUser;257
4.6.8.22;11.8.22 no_cache;257
4.6.8.23;11.8.23 page;258
4.6.8.24;11.8.24 printError;258
4.6.8.25;11.8.25 rootLine;259
4.6.8.26;11.8.26 siteScript;259
4.6.8.27;11.8.27 tmpl->config, tmpl->setup;260
4.6.8.28;11.8.28 type;260
4.6.8.29;11.8.30 uniqueString;261
4.6.9;11.9 Konfiguration mit Flexforms;261
4.6.9.1;11.9.1 Erstellen einer Plug-in_Flexform;261
4.6.9.2;11.9.2 Auslesen der Formulardaten;262
4.6.10;11.10 Konfiguration mit TypoScript;262
4.6.11;11.11 Konfiguration im Extension-Manager;263
4.7;12 Frontend-User & Sessions;264
4.7.1;12.1 Frontend-User;264
4.7.1.1;12.1.1 Daten des aktuell angemeldeten Users;264
4.7.2;12.2 Sessions;264
4.7.2.1;12.2.1 Daten speichern;264
4.7.2.2;12.2.2 Daten auslesen;265
4.7.2.3;12.2.3 Warenkorb aufbauen;265
4.8;13 Backend & Services;268
4.8.1;13.1 Eigene Flexforms;268
4.8.1.1;13.1.1 Mehrsprachigkeit;269
4.8.1.2;13.1.2 Tabs;270
4.8.1.3;13.1.3 Elemente;271
4.8.1.4;13.1.4 Flexform-Daten im Frontend;275
4.8.2;13.2 Backend-Module;276
4.8.2.1;13.2.1 Dokumententypen für $this->doc;276
4.8.2.2;13.2.2 TypoScript einer Seite auslesen;276
4.8.2.3;13.2.3 AJAX im Backend;276
4.8.3;13.3 Services;278
4.8.4;13.4 cli;278
4.8.5;13.5 Debugging;279
4.8.5.1;13.5.1 debug;279
4.8.5.2;13.5.2 debug_ordvalue;280
4.8.5.3;13.5.3 debug_trail;280
4.8.5.4;13.5.4 debugRows;280
4.8.5.5;13.5.5 devLog;281
5;Teil III Extbase und Fluid;282
5.1;14 Der neue Weg der Extension-Programmierung;284
5.1.1;14.1 Grundlagen der objektorientierten Programmierung;286
5.1.1.1;14.1.1 Klassen und Objekte;286
5.1.1.2;14.1.2 Vererbung von Klassen;290
5.1.1.3;14.1.3 Kontrollierte Vererbung – abstrakte und finale Klassen;292
5.1.1.4;14.1.4 Sichtbarkeiten: public, private und protected;293
5.1.1.5;14.1.5 Interfaces;294
5.1.1.6;14.1.6 Type Hints;296
5.1.1.7;14.1.7 Statische Methoden und Eigenschaften;296
5.1.1.8;14.1.8 Namespaces;297
5.1.2;14.2 Neue Konzepte;298
5.1.2.1;14.2.1 Domain Driven Design;299
5.1.2.2;14.2.2 Model-View-Controller;300
5.1.2.3;14.2.3 Modellierung;301
5.1.2.4;14.2.4 Gemeinsamens Vokabular – Ubiquitous Language;301
5.1.2.5;14.2.5 Die Elemente des Modells;304
5.1.2.5.1;14.2.5.1 Entities (Entitäten);304
5.1.2.5.2;14.2.5.2 Value Objects;304
5.1.2.5.3;14.2.5.3 Services;304
5.1.2.5.4;14.2.5.4 Aggregates;304
5.1.2.5.5;14.2.5.5 Factories;305
5.1.2.5.6;14.2.5.6 Repositories;305
5.2;15 Ein Rundgang durchs System;306
5.2.1;15.1 Installation von Extbase und Fluid;306
5.2.2;15.2 Installation der Extension blog_example;308
5.2.3;15.3 Datenstruktur im Blog-Example;310
5.2.4;15.4 Namenskonventionen;312
5.2.4.1;15.4.1 Verzeichnis- und Dateinamen;313
5.2.4.2;15.4.2 Klassennamen;313
5.2.4.3;15.4.3 Controller und Actions;314
5.2.5;15.5 Die Dateistruktur im Extension-Root-Verzeichnis;314
5.2.5.1;15.5.1 Die Datei ext_emconf.php;315
5.2.5.2;15.5.2 Die Datei ext_tables.php;316
5.2.5.3;15.5.3 Die Datei ext_localconf.php;320
5.2.5.4;15.5.4 Die Dateien ext_tables.sql und ext_icon.gif;321
5.2.6;15.6 Die Verzeichnisstruktur;321
5.2.6.1;15.6.1 Das Verzeichnis Classes;322
5.2.6.2;15.6.2 Das Verzeichnis Configuration;323
5.2.6.3;15.6.3 Das Verzeichnis Module;324
5.2.6.4;15.6.4 Das Verzeichnis Resources;324
5.2.6.5;15.6.5 Weitere Verzeichnisse;324
5.2.7;15.7 Der prinzipielle Ablauf;324
5.2.7.1;15.7.1 Aufruf des Dispatchers (Schritt 1);325
5.2.7.2;15.7.2 Aufruf des Controllers (Schritt 2);328
5.2.7.3;15.7.3 Ansprechen des Respositorys (Schritt 3);328
5.2.7.4;15.7.4 Zurückliefern der Blog-Objekte (Schritt 4);328
5.2.7.5;15.7.5 Das Objekt wird dem View zugeordnet (Schritt 5);330
5.2.7.6;15.7.6 Rückgabe der Template-Ausgabe an den Controller (Schritt 6);332
5.2.7.7;15.7.7 Rückgabe der Ausgabe an den Dispatcher (Schritt 7);333
5.2.7.8;15.7.8 Rückgabe der Ausgabe an TYPO3 (Schritt 8);333
5.3;16 Entwicklung eines eigenenPlug-ins;334
5.3.1;16.1 Aufbau einer minimal funktionstüchtigen Extension;334
5.3.1.1;16.1.1 Extension-Key;334
5.3.1.2;16.1.2 Verzeichnisse anlegen;335
5.3.1.3;16.1.3 Die Datei ext_emconf.php;335
5.3.1.4;16.1.4 Die Dateien ext_localconf.php und ext_tables.php;336
5.3.1.5;16.1.5 Einrichten eines Standard-Controllers;337
5.3.1.6;16.1.6 Installieren der Extension und das erste Erfolgserlebnis;338
5.3.2;16.2 Hinzufügen eines Views;339
5.3.3;16.3 Entitäten einführen;341
5.3.4;16.4 Daten persistieren (Datenspeicher);343
5.3.4.1;16.4.1 Datenbankstruktur – die Datei ext_tables.sql;344
5.3.4.2;16.4.2 Datenbankstruktur – das TCA;348
5.3.5;16.5 Anlegen eines Repositorys;352
5.3.6;16.6 Anlegen einer neuen Action;354
5.3.6.1;16.6.1 Anlegen der Action addAction();355
5.3.7;16.7 Daten per Formular eingeben und auswerten;356
5.3.8;16.8 Objekte aus dem Repository entfernen;357
5.3.8.1;16.8.1 Zufügen der Action delete in der Konfiguration;357
5.3.8.2;16.8.2 Anpassen der Template-Datei index.html;357
5.3.8.2.1;16.8.2.1 Zufügen der Action delete im Blog-Controller;358
5.3.9;16.9 Update von Objekten;358
5.3.9.1;16.9.1 Edit- und Update-Action hinzufügen;358
5.3.10;16.10 Der Query-Manager;360
5.3.11;16.11 Eingabevalidierung;362
5.3.12;16.12 Validatoren;362
5.3.12.1;16.12.1 Vordefinierte Validatoren;362
5.3.12.2;16.12.2 Eigene Validatoren;363
5.3.12.3;16.12.3 Ausgabe der Fehler;366
5.3.12.4;16.12.4 Optionale Argumente;366
5.3.13;16.13 Relationen zu anderen Tabellen;367
5.3.13.1;16.13.1 Erweiterung des TCA;367
5.3.13.2;16.13.2 Die Domain-Klasse Tx_Simpleblog_Domain_Model_Post;368
5.3.13.3;16.13.3 Registrieren der Actions in der Datei ext_localconf.php;369
5.3.13.4;16.13.4 Erstellung des Post-Controllers;369
5.3.13.5;16.13.5 Neue Templates und Template-Änderungen;371
5.3.13.6;16.13.6 Ändern der Blog-Identity;373
5.3.13.7;16.13.7 Aufruf der Extension im Frontend;375
5.3.14;16.14 Relationen zu anderen Tabellen m:n;375
5.3.15;16.15 Mehrsprachigkeit zufügen;380
5.3.16;16.16 Konfiguration mittels TypoScript;382
5.3.17;16.17 Backend-Module mit Extbase;384
5.3.18;16.18 Der Extbase-Kickstarter;385
5.3.18.1;16.18.1 Installation des Extbase-Kickstarters;386
5.3.18.2;16.18.2 Überblick über den Arbeitsbereich;387
5.3.18.3;16.18.3 Eingabe der Extension-Konfiguration;388
5.3.18.4;16.18.4 Modellierung;389
5.3.18.4.1;16.18.4.1 Anlegen des Blog-Objekts;390
5.3.18.5;16.18.5 Anlegen des Post-Objekts;391
5.3.18.6;16.18.6 Anlegen des Tag-Objekts;391
5.3.18.7;16.18.7 Relationen festlegen;392
5.3.19;16.19 Weitere Extbase-Interna;393
5.3.19.1;16.19.1 StoragePid;393
5.3.19.1.1;16.19.1.1 Schreibzugriffe;394
5.3.19.1.2;16.19.1.2 Aktualisieren;394
5.3.19.1.3;16.19.1.3 Lesen;395
5.3.19.2;16.19.2 MVC-Request;395
5.3.19.3;16.19.3 FlashMessages realisieren;396
5.4;17 Die Fluid-Template-Engine;398
5.4.1;17.1 Vorbereitung;399
5.4.2;17.2 Basissyntax und einfache Ausgabe;401
5.4.2.1;17.2.1 Arrays;401
5.4.2.2;17.2.2 Objekte;402
5.4.3;17.3 Fluid ViewHelper-Syntax;403
5.4.3.1;17.3.1 Namespace (Namensraum);403
5.4.3.2;17.3.2 Argumente;404
5.4.3.2.1;17.3.2.1 Boolesche Ausdrücke;404
5.4.3.2.2;17.3.2.2 Komplexe boolesche Ausdrücke;405
5.4.3.2.3;17.3.2.3 Arrays;405
5.4.4;17.4 ViewHelper-Übersicht;406
5.4.4.1;17.4.1 alias;406
5.4.4.2;17.4.2 base;407
5.4.4.3;17.4.3 cObject;407
5.4.4.4;17.4.4 count;408
5.4.4.5;17.4.5 cycle;408
5.4.4.6;17.4.6 debug;409
5.4.4.7;17.4.7 else;409
5.4.4.8;17.4.8 for;409
5.4.4.9;17.4.9 form;410
5.4.4.9.1;17.4.9.1 form.checkbox;412
5.4.4.9.2;17.4.9.2 form.error;413
5.4.4.9.3;17.4.9.3 form.hidden;413
5.4.4.9.4;17.4.9.4 form.password;414
5.4.4.9.5;17.4.9.5 form.radio;415
5.4.4.9.6;17.4.9.6 form.select;416
5.4.4.9.7;17.4.9.7 form.submit;418
5.4.4.9.8;17.4.9.8 form.textarea;419
5.4.4.9.9;17.4.9.9 form.textbox;420
5.4.4.9.10;17.4.9.10 form.upload;420
5.4.4.10;17.4.10 format;421
5.4.4.10.1;17.4.10.1 format.crop;421
5.4.4.10.2;17.4.10.2 format.currency;422
5.4.4.10.3;17.4.10.3 format.date#;422
5.4.4.10.4;17.4.10.4 format.html;423
5.4.4.10.5;17.4.10.5 format.nl2br;424
5.4.4.10.6;17.4.10.6 format.number;424
5.4.4.10.7;17.4.10.7 format.padding;424
5.4.4.10.8;17.4.10.8 format.printf;425
5.4.4.11;17.4.11 groupedFor;425
5.4.4.12;17.4.12 if;426
5.4.4.13;17.4.13 image;427
5.4.4.14;17.4.14 layout;428
5.4.4.15;17.4.15 link;428
5.4.4.15.1;17.4.15.1 link.action;428
5.4.4.15.2;17.4.15.2 link.email;430
5.4.4.15.3;17.4.15.3 link.external;430
5.4.4.15.4;17.4.15.4 link.page;432
5.4.4.16;17.4.16 render;432
5.4.4.17;17.4.17 renderFlashMessages;433
5.4.4.18;17.4.18 section;434
5.4.4.19;17.4.19 then;434
5.4.4.20;17.4.20 translate;434
5.4.4.21;17.4.21 uri;435
5.4.5;17.5 Erstellen eines eigenen ViewHelpers;435
5.4.5.1;17.5.1 Der Dummytext-ViewHelper;436
5.4.5.2;17.5.2 Zugriff auf die übergebenen Argumente;437
5.4.5.3;17.5.3 Zufügen von Argumenten;438
5.4.5.4;17.5.4 Tag-basierende ViewHelper;438
5.4.5.5;17.5.5 Der Variablen-Container;439
5.4.6;17.6 Verwendung von Fluid in klassischen Extensions;440
5.4.7;17.7 Layouts und Partials;441
6;Register;446


14 Der neue Weg der Extension- Programmierung (S. 265-266)

Das TYPO3-Projekt steht am Scheideweg. Einerseits wird weiterhin auf die allseits bewährte Basis der Version 4.x vertraut - andererseits steht mit dem Rewrite der Version 5.x eine architektonisch komplett neue Version in den Startlöchern bzw. ist gar schon erschienen. Technisch gesehen handelt es sich dabei um zwei völlig verschiedene Programme. Während der 4er-Zweig in den letzten elf Jahren organisch gewachsen und so auch vom Code her selbst für Experten unübersichtlich und weitläufig ist, baut die 5er-Version auf einem der modernsten Frameworks auf, die es momentan auf dem Markt gibt - namentlich FLOW3.

Dieses Framework wurde von Anfang an gezielt so konzipiert, dass es all jene Unzulänglichkeiten der technischen Basis der 4er-Version vermeidet und neue, leistungsstarke Konzepte einführt, die es ermöglichen, moderne und zeitgemäße Webapplikationen zu erschaffen. Man hatte anfangs zwar darüber nachgedacht, ob dieses Ziel auch möglich wäre, wenn man den bestehenden Code der 4er-Version anpasst, hat aber dann bald feststellen müssen, dass dies aufgrund der dort verwendeten Architektur nicht möglich ist.

So hat man beschlossen, TYPO3 5.x komplett neu zu entwickeln, und dabei festgestellt, dass es sinnvoll ist, dieses Projekt in zwei Teile zu trennen - in das zugrunde liegende PHP-Webapplikations-Framework FLOW3 und das Content-Management-System TYPO3 5 - das lediglich" eine sogenannte Komponente, also eine Art Extension für FLOW3 ist.

Mit dem Architekturwechsel einher geht aber auch ein relativ dramatischer Sachverhalt. Während es für das Kernsystem letztlich egal ist, wenn der komplette Quellcode ausgetauscht wird, trifft dies für die Extension nicht zu. Es gibt momentan weit über 3500 Extensions für TYPO3 4.x. Keine dieser Extensions kann in der Version TYPO3 5.x wieder verwendet werden. Letztlich müssen alle (oder zumindest die wichtigsten) Extensions komplett neu geschrieben werden. Dies muss freilich nicht sofort geschehen. Im Oktober 2008 wurde von den Kernentwicklern beider TYPO3-Entwicklungszweige das sogenannte Berlin Manifesto1 verabschiedet.

Dieses besagt zwar grundsätzlich, dass die Entwicklung von TYPO3 4.x noch einige Jahre weitergehen wird und man somit mit der klassischen Art, Extensions zu schreiben, ebenso lange weitermachen könnte, aber die Erfahrung zeigt, dass Kunden sicherlich bei neuen Projekten direkt auch auf die zukunftsträchtigere Technologie der Version 5.x setzen wollen. Immerhin wird oftmals viel Geld in die Entwicklung gesteckt, und daher will man sicher sein, dieses auch bei einem eventuellen Technologiewechsel nicht erneut investieren zu müssen. Dies geht allerdings natürlich erst, wenn eine stabile Version von TYPO3 5.x erschienen ist. Bestehende Projekte werden sicherlich nicht bei Erscheinen der neuen Version gleich neu aufgebaut werden.

Ebenso befinden sich Projekte, die jetzt begonnen werden sollen, in der Zwickmühle. Die neue Version von TYPO3 ist noch nicht stabil, aber die "alte" Version erscheint nicht zukunftsträchtig genug. Hier wäre es sinnvoll, eine Möglichkeit zu haben, direkt in TYPO3 4.x Extensions nach den neuen Methoden und Paradigmen der Version 5.x zu schreiben, die man dann später - bei Erscheinen der stabilen Version von TYPO3 5.x - mit geringem änderungsaufwand wieder verwenden kann. Damit könnte man gleich hier und heute anfangen, neue Entwicklungen zu starten, die aber auch in der Zukunft einsetzbar sind."


Alexander Ebner arbeitet als TYPO3-Entwickler beim Münchner Reiseveranstalter FTI Frosch Touristik GmbH. TYPO3 begleitet ihn seit Jahren.Patrick Lobacher ist freier Entwickler, Mitglied in der TYPO3-Association und berät seit 1996 Unternehmen beim Einsatz von Webtechnologien.Tobias Hauser & Christian Wenz sind Herausgeber der Content Management-Bibliothek bei Hanser und beschäftigen sich seit Mitte der Neunziger Jahre mit Webtechnologien. Dabei haben sie zahlreiche CMS- und Portal-Projekte realisiert. Ihre Erfahrungen geben sie als Trainer, Berater und Autoren an ihre Kunden und Leser weiter.



Ihre Fragen, Wünsche oder Anmerkungen
Vorname*
Nachname*
Ihre E-Mail-Adresse*
Kundennr.
Ihre Nachricht*
Lediglich mit * gekennzeichnete Felder sind Pflichtfelder.
Wenn Sie die im Kontaktformular eingegebenen Daten durch Klick auf den nachfolgenden Button übersenden, erklären Sie sich damit einverstanden, dass wir Ihr Angaben für die Beantwortung Ihrer Anfrage verwenden. Selbstverständlich werden Ihre Daten vertraulich behandelt und nicht an Dritte weitergegeben. Sie können der Verwendung Ihrer Daten jederzeit widersprechen. Das Datenhandling bei Sack Fachmedien erklären wir Ihnen in unserer Datenschutzerklärung.