TYPO3-Extensions - Professionelle Frontend- und Backend-Programmierung

von: Bernhard Ulbrich, Patrick Lobacher, Alexander Ebner

Carl Hanser Fachbuchverlag, 2010

ISBN: 9783446423572 , 466 Seiten

Format: PDF, OL

Kopierschutz: Wasserzeichen

Windows PC,Mac OSX geeignet für alle DRM-fähigen eReader Apple iPad, Android Tablet PC's Online-Lesen für: Windows PC,Mac OSX,Linux

Preis: 39,99 EUR

Mehr zum Inhalt

TYPO3-Extensions - Professionelle Frontend- und Backend-Programmierung


 

Inhalt

6

Vorwort

18

Teil I Klassische Extensionprogrammierung

20

1 Grundlagen

22

1.1 Aufbau und Struktur von TYPO3

22

1.2 Aufbau einer Extension

25

1.3 Arten und Einteilung von Extensions

26

1.4 Der Extension-Key

27

1.5 TYPO3 Coding Guidelines

28

1.5.1 Namespace

29

1.5.2 PHP-Regeln

30

1.5.3 Dateistruktur

31

1.5.4 PHP-Syntax

34

1.5.5 phpDoc2

40

1.5.6 Changelog

41

2 Eine Extension planen undentwickeln

42

2.1 Extensions planen

42

2.1.1 Wir planen eine Blog-Extension

43

2.2 Der Kickstarter

45

2.2.1 Die Datenbank

47

2.2.2 Datenbanktabellen und Formulare – eine Erklärung

53

2.2.3 Extend existing Tables

55

2.2.4 Frontend-Plug-ins

56

2.2.5 Backend-Module

59

2.2.6 Integrate in existing Modules

60

2.2.7 Clickmenu items

60

2.2.8 Services

61

2.2.9 Static TypoScript code

62

2.2.10 TSconfig

62

2.2.11 Die Extension erstellen

63

2.3 Extension-Konfiguration mit ext_emconf.php

64

2.4 Die weiteren Dateien der Extension

69

2.4.1 Verzeichnis doc

69

2.4.2 Verzeichnis mod#

69

2.4.2.1 Datei mod#/conf.php

69

2.4.2.2 Datei mod#/index.php

70

2.4.2.3 Datei mod#/locallang.xml

70

2.4.2.4 Datei mod#/locallang_mod.xml

70

2.4.3 Verzeichnis modfunc#

70

2.4.3.1 Datei modfunc#/class.tx_extkey_modfunc1.php

70

2.4.4 Verzeichnis pi#

71

2.4.4.1 Datei pi#/class.tx_extkey_pi#.php

71

2.4.4.2 Datei pi#/class.tx_extkey_pi#_wizicon.php

71

2.4.4.3 Datei pi#/ce_wiz.gif

71

2.4.4.4 Datei pi#/clear.gif

71

2.4.4.5 Datei pi#/static/setup.txt

71

2.4.5 Verzeichnis Static

71

2.4.6 Datei Changelog

72

2.4.7 Datei README.txt

72

2.4.8 Datei ext_icon.gif

72

2.4.9 Datei ext_localconf.php

72

2.4.10 Datei ext_tables.php

72

2.4.11 Datei ext_tables.sql

73

2.4.12 Datei ext_tables_static+adt.sql

74

2.4.13 Dateien Icon_tx_extkey_tabellenname.gif

75

2.4.14 Datei locallang.xml

75

2.4.15 Datei locallang_db.xml

75

2.4.16 Datei tca.php

75

2.4.16.1 Checkboxen

76

2.4.16.2 Erweiterte Input-Felder

77

2.4.16.3 Validierung mit eval

77

2.4.16.4 Benutzerdefinierte Validierung

79

2.4.16.5 Bildupload-Feld

79

2.4.16.6 Textfelder mit RTE

80

2.4.16.7 M-M-Relationen

81

3 Backend-Module erstellen

84

3.1 Module konfigurieren und im Hauptmenü anordnen

84

3.2 Einen eigenen Navigationsbaum erstellen

88

3.3 Backend-Modul erstellen

94

3.3.1 Das Modul initialisieren

94

3.3.2 Den Modulinhalt aufbauen

98

3.3.3 Extension-Konfiguration über ext_conf_template.txt

99

3.3.4 Backend-Formulare aufrufen

101

3.3.5 Eine Datensatzliste mit Bearbeitungsfunktionen erstellen

103

3.3.5.1 Einen Pagebrowser hinzufügen

106

3.3.6 Aufgabe: Module für Kommentare, Blog und Blogroll

109

3.3.6.1 Tipps

109

3.3.6.2 Zusatzaufgabe

110

3.4 Backend User Object – $BE_USER

110

3.5 Das Systemlog

111

4 Frontend-Plug-ins

114

4.1 Das Frontend-Plug-in im Überblick

114

4.2 Feldinhalte für die Ausgabe aufbereiten

122

4.2.1 Das Bild für Teaser Image

123

4.2.2 Ausgabe des Haupttextes in der Listenansicht, wennerwünscht

124

4.2.3 Haupttext mit RTE formatieren

124

4.2.4 Haupttext statt Teasertext anzeigen, falls dieser nichtverfügbar ist

125

4.2.5 Verlinken des Autorennamens mit der Mail-Adresse desAutors

125

4.2.6 Kategorien als Namen anzeigen und verlinken (Relationen)

126

4.3 HTML-Templates für das Plug-in

128

4.4 Die Kommentarfunktion mit AJAX und eID

133

4.4.1 Ausgabe vorhandener Kommentare

134

4.4.2 Das Kommentarformular hinzufügen

137

4.5 Was sind Hooks?

142

4.6 Flexforms

144

4.6.1 Erzeugen der Flexform

145

4.7 Das Plug-in pi2

151

5 Dokumentation und Abschluß

152

5.1 Code dokumentieren mit extdeveval

152

5.2 Extension-Dokumentation schreiben

153

5.2.1 Die Vorlage

154

5.2.2 Der Aufbau der Dokumentation

154

5.2.3 Vorlagenstile

155

5.2.4 Die Dokumentation verfassen

155

5.3 Upload ins TER

156

Teil II Funktionsreferenz zur klassischenExtensionprogrammierung

158

6 Datenbank

160

6.1 $GLOBALS['TYPO3_DB']

160

6.1.1 exec_SELECTquery

160

6.1.2 exec_SELECT_queryArray

160

6.1.3 exec_SELECTgetRows

161

6.1.4 exec_SELECT_mm_query

161

6.1.5 exec_INSERTquery

162

6.1.6 exec_UPDATEquery

162

6.1.7 exec_DELETEquery

162

6.1.8 sql_fetch_assoc

162

6.1.9 sql_fetch_row

163

6.1.10 searchQuery

163

6.1.11 listQuery

163

6.1.12 splitGroupOrderLimit

164

6.1.13 quoteStr

164

6.1.14 fullQuoteStr

164

6.1.15 fullQuoteArray

165

6.1.16 escapeStrForLike

165

6.1.17 cleanIntArray

166

6.1.18 cleanIntList

166

6.1.19 debug_lastBuiltQuery

166

6.2 tslib_pibase

167

6.2.1 pi_exec_query

167

6.2.2 pi_getPidList

168

6.2.3 pi_getRecord

169

6.2.4 pi_prependFieldsWithTable

169

6.3 cObj

169

6.3.1 DBgetDelete

169

6.3.2 DBgetInsert

170

6.3.3 DBgetUpdate

171

6.3.4 enableFields

172

7 Dateisystem

174

7.1 t3lib_div

174

7.1.1 dirname

174

7.1.2 fixWindowsFilePath

174

7.1.3 formatSize

175

7.1.4 get_dirs

175

7.1.5 getAllFilesAndFoldersInPath

176

7.1.6 getFileAbsFileName

177

7.1.7 getFilesInDir

177

7.1.8 getURL

178

7.1.9 isAbsPath

178

7.1.10 isAllowedAbsPath

178

7.1.11 mkdir

179

7.1.12 mkdir_deep

179

7.1.13 removePrefixPathFromList

179

7.1.14 resolveBackPath

180

7.1.15 rmdir

180

7.1.16 split_fileref

181

7.1.17 tempnam

181

7.1.18 unlink_tempfile

181

7.1.19 upload_copy_move

181

7.1.20 upload_to_tempfile

182

7.1.21 verifyFilenameAgainstDenyPattern

182

7.1.22 writeFile

183

7.1.23 writeFileToTypo3tempDir

183

8 Strings, Arrays undUmgebungsvariablen

184

8.1 Allgemeine Funktionen

184

8.1.1 _GET

184

8.1.2 _GETset

184

8.1.3 _GP

185

8.1.4 _POST

185

8.1.5 callUserFunction

185

8.1.6 clientInfo

186

8.1.7 compat_version

186

8.1.8 compileSelectedGetVarsFromArray

187

8.1.9 getHostname

187

8.1.10 getIndpEnv

187

8.1.11 getThisUrl

187

8.1.12 linkThisScript

188

8.1.13 linkThisUrl

188

8.1.14 locationHeaderUrl

188

8.1.15 makeInstance

189

8.1.16 makeInstanceService

189

8.1.17 rmFromList

189

8.1.18 sysLog

190

8.2 String-Funktionen

190

8.2.1 calcParenthesis

190

8.2.2 cmpFQDN

190

8.2.3 cmpIP

191

8.2.4 convUmlauts

191

8.2.5 csvValues

191

8.2.6 deHSCentities

192

8.2.7 expandList

192

8.2.8 fixed_lgd

192

8.2.9 fixed_lgd_pre

193

8.2.10 formatForTextarea

193

8.2.11 generateRandomBytes

193

8.2.12 get_tag_attributes

194

8.2.13 htmlspecialchars_decode

194

8.2.14 implodeArrayForUrl

194

8.2.15 implodeAttributes

195

8.2.16 inList

195

8.2.17 int_from_ver

196

8.2.18 intInRange

196

8.2.19 intval_positive

196

8.2.20 isFirstPartOfStr

197

8.2.21 md5int

197

8.2.22 milliseconds

198

8.2.23 modifyHTMLColor

198

8.2.24 modifyHTMLColorAll

198

8.2.25 normalizeIPv6

199

8.2.26 removeXSS

199

8.2.27 revExplode

199

8.2.28 rm_endcomma

200

8.2.29 shortMD5

200

8.2.30 split_tag_attributes

200

8.2.31 splitCalc

201

8.2.32 strtolower

201

8.2.33 strtoupper

202

8.2.34 substUrlsInPlainText

202

8.2.35 testInt

203

8.2.36 trimExplode

203

8.2.37 uniqueList

204

8.2.38 validEmail

204

8.2.39 validIP

204

8.2.40 validIPv4

205

8.2.41 validIPv6

205

8.3 Array-Funktionen

205

8.3.1 addSlashesOnArray

205

8.3.2 array_merge

206

8.3.3 array_merge_recursive_overrule

206

8.3.4 array2json

207

8.3.5 array2xml

207

8.3.6 arrayToLogString

208

8.3.7 explodeUrl2Array

209

8.3.8 inArray

209

8.3.9 print_array

209

8.3.10 removeArrayEntryByValue

210

8.3.11 slashArray

210

8.3.12 view_array

211

8.3.13 xml2array

211

8.3.14 xml2tree

212

8.3.15 xmlGetHeaderAttribs

213

8.4 String-Funktionen in Frontend-Plug-ins

214

8.4.1 calcAge

214

8.4.2 checkEmail

214

8.4.3 codeString

214

8.4.4 encryptEmail

215

8.4.5 HTMLcaseshift

215

8.4.6 keywords

215

8.4.7 linebreaks

216

8.4.8 processParams

216

8.4.9 uniqueHash

217

8.4.10 URLqMark

217

9 Bilder

218

9.1 Einbinden

218

9.2 Bearbeiten

219

9.2.1 Bild umrechnen (fürs Web optimieren)

219

9.2.2 Abmessungen ändern

220

9.2.3 Zuschneiden

220

9.2.4 Graustufen

221

9.3 Erzeugen

222

9.3.1 Bild in bestehendes Bild einfügen

222

9.3.2 Text erzeugen

223

10 AJAX im Frontend

224

10.1 eID

224

10.1.1 Konfiguration

224

10.1.2 Basisdatei

225

10.2 Zusammenspiel AJAX & eID

225

10.2.1 Aufbau der XML-Response

225

10.2.2 AJAX-Request und Verarbeitung

226

11 Frontend-Plug-ins

228

11.1 Cache

228

11.1.1 cacheExpires

228

11.1.2 clearPageCacheContent

228

11.1.3 clearPageCacheContent_pidList

228

11.1.4 get_cache_timeout

229

11.1.5 set_cache_timeout_default

229

11.1.6 set_no_cache

229

11.2 Content-Elemente

230

11.2.1 cImage

230

11.2.2 cleanFormName

230

11.2.3 cObjGet

230

11.2.4 cObjGetSingle

231

11.2.5 currentPageUrl

231

11.2.6 fileResource

232

11.2.7 getImgResource

232

11.2.8 getSlidePids

232

11.2.9 gifBuilderTextBox

232

11.2.10 stdWrap

233

11.3 Links

234

11.3.1 baseUrlWrap

234

11.3.2 getMailTo

234

11.3.3 getTypoLink

235

11.3.4 getTypoLink_URL

235

11.3.5 http_makelinks

236

11.3.6 imageLinkWrap

236

11.3.7 mailto_makelinks

236

11.3.8 pi_getPageLink

237

11.3.9 pi_linkToPage

237

11.3.10 pi_linkTP

238

11.3.11 pi_linkTP_keepPIvars

238

11.3.12 pi_linkTP_keepPIvars_url

238

11.3.13 pi_openAtagHrefInJSwindow

239

11.3.14 prefixLocalAnchorsWithScript

239

11.4 Listen

239

11.4.1 pi_list_browseresults

240

11.4.2 pi_list_linkSingle

241

11.4.3 pi_list_makelist

241

11.4.4 pi_list_modeSelector

242

11.4.5 pi_list_searchBox

242

11.5 JavaScript

243

11.5.1 additionalHeaderData

243

11.5.2 additionalJavaScript

243

11.5.3 JSeventFuncCalls

244

11.5.4 minifyJavaScript

244

11.5.5 quoteJSvalue

245

11.5.6 rawUrlEncodeJS

245

11.5.7 setJS

245

11.5.8 wrapJS

246

11.6 CSS

246

11.6.1 additionalCSS

246

11.6.2 additionalHeaderData

247

11.6.3 pi_getClassName

247

11.6.4 pi_setClassStyle

247

11.6.5 setCSS

248

11.7 Mehrsprachigkeit

249

11.7.1 getLLL

249

11.7.2 pi_getLL

249

11.7.3 readLLfile

250

11.8 Umgebungsvariablen und allgemeine Funktionen

250

11.8.1 absRefPrefix

250

11.8.2 additionalHeaderData

251

11.8.3 all

251

11.8.4 anchorPrefix

252

11.8.5 applicationData

252

11.8.6 ATagParams

252

11.8.7 baseUrl

253

11.8.8 baseUrlWrap

253

11.8.9 beUserLogin

253

11.8.10 clientInfo

253

11.8.11 content

254

11.8.12 defaultBodyTag

254

11.8.13 domainStartPage

254

11.8.14 extTarget

255

11.8.15 fePreview

255

11.8.16 id

255

11.8.17 imagesOnPage

256

11.8.18 intTarget

256

11.8.19 lang

256

11.8.20 lastImageInfo

257

11.8.21 loginUser

257

11.8.22 no_cache

257

11.8.23 page

258

11.8.24 printError

258

11.8.25 rootLine

259

11.8.26 siteScript

259

11.8.27 tmpl->config, tmpl->setup

260

11.8.28 type

260

11.8.30 uniqueString

261

11.9 Konfiguration mit Flexforms

261

11.9.1 Erstellen einer Plug-in_Flexform

261

11.9.2 Auslesen der Formulardaten

262

11.10 Konfiguration mit TypoScript

262

11.11 Konfiguration im Extension-Manager

263

12 Frontend-User & Sessions

264

12.1 Frontend-User

264

12.1.1 Daten des aktuell angemeldeten Users

264

12.2 Sessions

264

12.2.1 Daten speichern

264

12.2.2 Daten auslesen

265

12.2.3 Warenkorb aufbauen

265

13 Backend & Services

268

13.1 Eigene Flexforms

268

13.1.1 Mehrsprachigkeit

269

13.1.2 Tabs

270

13.1.3 Elemente

271

13.1.4 Flexform-Daten im Frontend

275

13.2 Backend-Module

276

13.2.1 Dokumententypen für $this->doc

276

13.2.2 TypoScript einer Seite auslesen

276

13.2.3 AJAX im Backend

276

13.3 Services

278

13.4 cli

278

13.5 Debugging

279

13.5.1 debug

279

13.5.2 debug_ordvalue

280

13.5.3 debug_trail

280

13.5.4 debugRows

280

13.5.5 devLog

281

Teil III Extbase und Fluid

282

14 Der neue Weg der Extension-Programmierung

284

14.1 Grundlagen der objektorientierten Programmierung

286

14.1.1 Klassen und Objekte

286

14.1.2 Vererbung von Klassen

290

14.1.3 Kontrollierte Vererbung – abstrakte und finale Klassen

292

14.1.4 Sichtbarkeiten: public, private und protected

293

14.1.5 Interfaces

294

14.1.6 Type Hints

296

14.1.7 Statische Methoden und Eigenschaften

296

14.1.8 Namespaces

297

14.2 Neue Konzepte

298

14.2.1 Domain Driven Design

299

14.2.2 Model-View-Controller

300

14.2.3 Modellierung

301

14.2.4 Gemeinsamens Vokabular – Ubiquitous Language

301

14.2.5 Die Elemente des Modells

304

14.2.5.1 Entities (Entitäten)

304

14.2.5.2 Value Objects

304

14.2.5.3 Services

304

14.2.5.4 Aggregates

304

14.2.5.5 Factories

305

14.2.5.6 Repositories

305

15 Ein Rundgang durchs System

306

15.1 Installation von Extbase und Fluid

306

15.2 Installation der Extension blog_example

308

15.3 Datenstruktur im Blog-Example

310

15.4 Namenskonventionen

312

15.4.1 Verzeichnis- und Dateinamen

313

15.4.2 Klassennamen

313

15.4.3 Controller und Actions

314

15.5 Die Dateistruktur im Extension-Root-Verzeichnis

314

15.5.1 Die Datei ext_emconf.php

315

15.5.2 Die Datei ext_tables.php

316

15.5.3 Die Datei ext_localconf.php

320

15.5.4 Die Dateien ext_tables.sql und ext_icon.gif

321

15.6 Die Verzeichnisstruktur

321

15.6.1 Das Verzeichnis Classes

322

15.6.2 Das Verzeichnis Configuration

323

15.6.3 Das Verzeichnis Module

324

15.6.4 Das Verzeichnis Resources

324

15.6.5 Weitere Verzeichnisse

324

15.7 Der prinzipielle Ablauf

324

15.7.1 Aufruf des Dispatchers (Schritt 1)

325

15.7.2 Aufruf des Controllers (Schritt 2)

328

15.7.3 Ansprechen des Respositorys (Schritt 3)

328

15.7.4 Zurückliefern der Blog-Objekte (Schritt 4)

328

15.7.5 Das Objekt wird dem View zugeordnet (Schritt 5)

330

15.7.6 Rückgabe der Template-Ausgabe an den Controller (Schritt 6)

332

15.7.7 Rückgabe der Ausgabe an den Dispatcher (Schritt 7)

333

15.7.8 Rückgabe der Ausgabe an TYPO3 (Schritt 8)

333

16 Entwicklung eines eigenenPlug-ins

334

16.1 Aufbau einer minimal funktionstüchtigen Extension

334

16.1.1 Extension-Key

334

16.1.2 Verzeichnisse anlegen

335

16.1.3 Die Datei ext_emconf.php

335

16.1.4 Die Dateien ext_localconf.php und ext_tables.php

336

16.1.5 Einrichten eines Standard-Controllers

337

16.1.6 Installieren der Extension und das erste Erfolgserlebnis

338

16.2 Hinzufügen eines Views

339

16.3 Entitäten einführen

341

16.4 Daten persistieren (Datenspeicher)

343

16.4.1 Datenbankstruktur – die Datei ext_tables.sql

344

16.4.2 Datenbankstruktur – das TCA

348

16.5 Anlegen eines Repositorys

352

16.6 Anlegen einer neuen Action

354

16.6.1 Anlegen der Action addAction()

355

16.7 Daten per Formular eingeben und auswerten

356

16.8 Objekte aus dem Repository entfernen

357

16.8.1 Zufügen der Action delete in der Konfiguration

357

16.8.2 Anpassen der Template-Datei index.html

357

16.8.2.1 Zufügen der Action delete im Blog-Controller

358

16.9 Update von Objekten

358

16.9.1 Edit- und Update-Action hinzufügen

358

16.10 Der Query-Manager

360

16.11 Eingabevalidierung

362

16.12 Validatoren

362

16.12.1 Vordefinierte Validatoren

362

16.12.2 Eigene Validatoren

363

16.12.3 Ausgabe der Fehler

366

16.12.4 Optionale Argumente

366

16.13 Relationen zu anderen Tabellen

367

16.13.1 Erweiterung des TCA

367

16.13.2 Die Domain-Klasse Tx_Simpleblog_Domain_Model_Post

368

16.13.3 Registrieren der Actions in der Datei ext_localconf.php

369

16.13.4 Erstellung des Post-Controllers

369

16.13.5 Neue Templates und Template-Änderungen

371

16.13.6 Ändern der Blog-Identity

373

16.13.7 Aufruf der Extension im Frontend

375

16.14 Relationen zu anderen Tabellen m:n

375

16.15 Mehrsprachigkeit zufügen

380

16.16 Konfiguration mittels TypoScript

382

16.17 Backend-Module mit Extbase

384

16.18 Der Extbase-Kickstarter

385

16.18.1 Installation des Extbase-Kickstarters

386

16.18.2 Überblick über den Arbeitsbereich

387

16.18.3 Eingabe der Extension-Konfiguration

388

16.18.4 Modellierung

389

16.18.4.1 Anlegen des Blog-Objekts

390

16.18.5 Anlegen des Post-Objekts

391

16.18.6 Anlegen des Tag-Objekts

391

16.18.7 Relationen festlegen

392

16.19 Weitere Extbase-Interna

393

16.19.1 StoragePid

393

16.19.1.1 Schreibzugriffe

394

16.19.1.2 Aktualisieren

394

16.19.1.3 Lesen

395

16.19.2 MVC-Request

395

16.19.3 FlashMessages realisieren

396

17 Die Fluid-Template-Engine

398

17.1 Vorbereitung

399

17.2 Basissyntax und einfache Ausgabe

401

17.2.1 Arrays

401

17.2.2 Objekte

402

17.3 Fluid ViewHelper-Syntax

403

17.3.1 Namespace (Namensraum)

403

17.3.2 Argumente

404

17.3.2.1 Boolesche Ausdrücke

404

17.3.2.2 Komplexe boolesche Ausdrücke

405

17.3.2.3 Arrays

405

17.4 ViewHelper-Übersicht

406

17.4.1 alias

406

17.4.2 base

407

17.4.3 cObject

407

17.4.4 count

408

17.4.5 cycle

408

17.4.6 debug

409

17.4.7 else

409

17.4.8 for

409

17.4.9 form

410

17.4.9.1 form.checkbox

412

17.4.9.2 form.error

413

17.4.9.3 form.hidden

413

17.4.9.4 form.password

414

17.4.9.5 form.radio

415

17.4.9.6 form.select

416

17.4.9.7 form.submit

418

17.4.9.8 form.textarea

419

17.4.9.9 form.textbox

420

17.4.9.10 form.upload

420

17.4.10 format

421

17.4.10.1 format.crop

421

17.4.10.2 format.currency

422

17.4.10.3 format.date#

422

17.4.10.4 format.html

423

17.4.10.5 format.nl2br

424

17.4.10.6 format.number

424

17.4.10.7 format.padding

424

17.4.10.8 format.printf

425

17.4.11 groupedFor

425

17.4.12 if

426

17.4.13 image

427

17.4.14 layout

428

17.4.15 link

428

17.4.15.1 link.action

428

17.4.15.2 link.email

430

17.4.15.3 link.external

430

17.4.15.4 link.page

432

17.4.16 render

432

17.4.17 renderFlashMessages

433

17.4.18 section

434

17.4.19 then

434

17.4.20 translate

434

17.4.21 uri

435

17.5 Erstellen eines eigenen ViewHelpers

435

17.5.1 Der Dummytext-ViewHelper

436

17.5.2 Zugriff auf die übergebenen Argumente

437

17.5.3 Zufügen von Argumenten

438

17.5.4 Tag-basierende ViewHelper

438

17.5.5 Der Variablen-Container

439

17.6 Verwendung von Fluid in klassischen Extensions

440

17.7 Layouts und Partials

441

Register

446