Ebner / Ulbrich / Lobacher TYPO3-Extensions
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)
Autoren/Hrsg.
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."