Preface
- Bookmark this web address
- Patrick’s Background
- Michael’s Background
- Acknowledgements
- Piracy
1.The History of Extbase and Fluid
- 1.1The Origin of TYPO3
- 1.2Berlin Manifesto
- 1.3New PHP Framework
- 1.4The Death of the Phoenix
- 1.5The Split
- 1.6Extbase and Fluid
2.PHP Programming Basics
- 2.1Object-Oriented Programming
- OOP in Extbase and Fluid
- 2.2Classes and Objects
- Syntax
- 2.3Methods
- 2.3.1The Arrow Operator
- 2.3.2The Constructor
- 2.3.3Access by Using
$this - 2.3.4Filling Methods with Content
- 2.4Inheritance of Classes
- 2.4.1Access by Using
parent - 2.4.2Verifying Class Derivation
- 2.5Abstract Classes
- 2.6Interfaces
- 2.7Visibility: Public and Protected
- Visibility in Extbase and Fluid
- 2.7.1Getter and Setter
- 2.8Type Hints
- 2.9Return Type Declarations
- 2.10Strict Types
- 2.11Static Calls
- 2.12Namespaces
- 2.13Important Design Patterns
- 2.13.1Singleton
- 2.13.2Prototype
- 2.13.3Dependency Injection
- 2.14Annotations
- 2.15Coding Standards
- PSR and PHP FIG
- 2.15.1PSR-1
- 2.15.2PSR-2
- 2.15.3Code Comments
3.Domain-driven Design
- 3.1Infrastructure Ignorance
- 3.2Vertical-Layered Architecture
- 3.3The Domain Model
- 3.3.1Ubiquitous Language
- Pragmatic Approach
- 3.3.2Building Blocks of DDD
- 3.4Structuring DDD
- 3.4.1Bounded Context
- 3.4.2Context Map
- 3.4.3Core Domain
- 3.4.4Shared Kernel
- 3.5Recap
4.Preparation
- 4.1TYPO3 Pre-installed
- 4.2Setting Up TYPO3
- TYPO3 v10 and higher
- 4.2.1System Requirements
- 4.2.2Installation Using PHP Composer
- 4.2.3Site Package
- 4.2.4Development Application Context
- 4.3Extension Fundamentals
- 4.3.1Extension Keys
- 4.3.2TYPO3 Extension Repository
- 4.3.3TER Extensions and Composer
- 4.3.4Further Publishing Methods
- 4.3.5Extensions, Plugins, Modules, and Distributions
- 4.3.6Behind the Scenes
- 4.3.7File and Directory Structure
- 4.4Development Environment
- 4.5Recap
5.Create a Domain Model
- 5.1Domain Model Used in this Book
- 5.2Basic Concept
- 5.2.1The Glossary
- 5.2.2Domain Model
- 5.3The TYPO3 Extension Builder
- 5.3.1History
- 5.3.2How the Extension Builder Works
- 5.3.3Target Audience
- 5.3.4Limitations
- 5.3.5Installation
- Extension Builder version
- 5.3.6Extension Properties
- Follow the instructions and examples
- Save your changes now!
- 5.3.7Domain Model
- The order of creating the objects matters
- 5.3.8Domain Model Properties
- Save your changes now!
- 5.3.9Domain Model Relations
- Save your changes now!
- 5.4Extension Activation
- 5.5Autoloading PHP Classes
- 5.6Recap
6.Analysing Initial Files
- 6.1Files Created by the Extension Builder
- 6.1.1Files in the Folder
Classes/ - Consistent naming makes it easy
- 6.1.2Files in the Folder
Configuration/ - 6.1.3Files in the Folder
Resources/ - 6.1.4Files in the Folder
Tests/ - 6.1.5Files in the Root Directory
- 6.2Additional Functionality of the Extension Builder
- 6.2.1Modifying the Model
- 6.3TypoScript
constantsandsetup - 6.4Recap
7.The CRUD Process
- 7.1Model-View-Controller in Extbase
- 7.2Creating an Object
- 7.2.1Create Action in Controller
- 7.2.2Creating the Template for the
listAction() - 7.2.3Side Note: Template Rendering
- Render a view without output
- 7.2.4Create Static Blogs
- 7.2.5Persisting Blogs
- 7.2.6How Persistence Works
- 7.2.7The PersistenceManager: Manual Persistence
- 7.2.8Create Your Own Action
- 7.2.9Form to Create an Object
- What to expect next
- 7.3Reading an Object
- 7.4Updating an Object
- 7.5Deleting an Object
- 7.5.1Exercise
- Action name
deleteConfirm - 7.6Fine-tuning of the Visual Appearance
- 7.6.1“Font Awesome” Icons
- 7.6.2List View: Align Buttons Right
- 7.6.3Button Margins
- 7.7Recap
8.Fluid Templating
- 8.1Templates, Layouts and Partials
- 8.2Using an Overall Layout
- 8.2.1Multiple Sections
- 8.2.2Optional Sections
- 8.3Partials
- 8.3.1Simple Partials
- Using sub-directories
- 8.3.2Complex Partials
- Passing arguments to partials
- 8.4Recap
9.Query Manager and Repositories
- 9.1Repository Class
- 9.2Magic Functions
- 9.3Default Structure of a Query
- 9.3.1Side Note: Debugging
- Not for the public!
- 9.4Adjusting Queries
- 9.4.1Determine Result Set
- 9.4.2Limiting Result Set
- 9.4.3Logical Conjunction
- 9.4.4Native SQL
- 9.4.5Query Settings
- 9.5Example: Search for Keyword in Title
- 9.6Dynamic Search in the Repository
- Converting special characters
- 9.7Side Note: Request Object
- 9.8Recap
10.TypoScript and FlexForm Configuration
- 10.1TypoScript
- 10.1.1Setup Scope
- 10.1.2Sub-keys
- 10.1.3Option:
view - 10.1.4Option:
persistence - 10.1.5Option:
objects - 10.1.6Option:
features - 10.1.7Option:
mvc - 10.1.8Option:
settings - 10.1.9Option:
_LOCAL_LANG - 10.1.10Option:
_CSS_DEFAULT_STYLE - 10.2FlexForms
- 10.2.1FlexForm Configuration
- Always click “save”
- 10.2.2Accessing the FlexForm Configuration
- 10.2.3Accessing Settings Outside of a Controller
- 10.2.4Switchable Controller Actions (SCA)
- Remove SCA configuration before continuing
- 10.3TypoScript for Backend Modules
- 10.4Adjustments for the Next Chapters
- 10.5Recap
11.Validation and Error Handling
- 11.1Point where Validation Happens
- 11.2Displaying Errors
- 11.2.1ViewHelper: Validation Results
- 11.3Validation Overview
- 11.4Property Validation
- 11.4.1Built-in Validators
- 11.4.2Multiple Validators
- 11.4.3Custom Validators
- 11.5Object Validation
- 11.6Action Validation
- 11.7Explicitly Ignore Validation
- 11.8Flash Messages
- 11.8.1Generating Flash Messages
- 11.8.2Displaying Flash Messages
- 11.8.3Flash Message Queues
- 11.8.4The Flash Message Queue in a Controller
- 11.8.5Practice Option
- 11.9Recap
12.ViewHelpers
- 12.1ViewHelpers in General
- 12.1.1Namespace
- 12.1.2PHP Class Files
- 12.2ViewHelpers in the TYPO3 Core
- 12.3ViewHelpers by the Community
- 12.4Custom ViewHelpers
- 12.4.1Text-ViewHelper
- 12.4.2TagBased-ViewHelper
- Universal tag attributes
- 12.4.3Condition-ViewHelper
- 12.4.4Widget-ViewHelper
- Make your ViewHelper foolproof
- Performance
- 12.5Test Your Knowledge
- 12.5.1Exercise: The Gravatar ViewHelper
- 12.5.2Exercise: The A-to-Z Widget
- 12.6Methods
renderStatic()andrender() - 12.7Recap
13.Relations
- 13.1Relation in Domain Model
- 13.2The Table Configuration Array (TCA)
- 13.2.1TCA:
ctrl - 13.2.2TCA:
interface - 13.2.3TCA:
types - 13.2.4TCA:
palettes - 13.2.5TCA:
columns - Keep validation in sync
- 13.3The CRUD Process of Posts
- 13.3.1Preparation
- 13.3.2Create Posts
- 13.3.3Read Posts
- 13.3.4Update Posts
- 13.3.5Delete Posts
- 13.4
m:n-Relations (Tags) - 13.4.1Creation of Tags in the Backend
- 13.4.2Repository for Tags
- 13.4.3Read Tags in the
PostController - 13.4.4Templates and Partials Adjustments
- No need to explicitly store the tags
- 13.4.5Show Tags in List of Posts
- 13.5
1:1-Relations (Authors) - 13.5.1Frontend Users and Groups
- 13.5.2Map
Authortofe_users - 13.5.3Implementing the Frontend Part
- 13.5.4Auto-Assign Frontend User
- 13.5.5Obfuscate Email Addresses
- 13.6Comments as AJAX Requests
- For didactic purposes
- 13.6.1Controller and Action
- 13.6.2Ajax Controller
- 13.6.3Display of Comments
- 13.6.4JavaScript
- Error handling
- 13.6.5AJAX Page Type in TypoScript
- 13.7Recap
14.Labels and Localization
- 14.1Why Use Language Files?
- 14.2Language Files
- 14.2.1Placeholders
- 14.2.2Variables
- 14.2.3Update all Template Files
- 14.3Overwrite Labels in TypoScript
- 14.4Language Configuration
- 14.4.1Website Language
- 14.4.2Site Configuration
- No need for these TypoScript settings
- 14.4.3Page Translation
- 14.4.4Content Element Translation
- Webserver configuration
- 14.5Localized Language File
- 14.5.1Overwrite Labels in TypoScript
- 14.6Language Labels in PHP
- 14.7Domain Object Localization
- Not a perfect example
- 14.7.1The Table Configuration Array (TCA)
- 14.7.2Translate Records
- 14.8Recap
15.Property Mapper and Type Converter
- 15.1Property Mapper
- 15.1.1Type Converter
- 15.1.2Property Mapper Configuration
- 15.2File Upload Functionality
- 15.2.1Security Aspects
- 15.2.2Blog Controller
- 15.2.3Upload FileReference Converter
- 15.2.4Blog Domain Model
- 15.2.5TCA of the Blog Domain Model
- 15.2.6
FileReferenceDomain Model - 15.2.7TypoScript
- 15.2.8Partials and Templates
- 15.2.9FormUpload-ViewHelper
- 15.3File Upload Test
- 15.4Recap
16.Backend Module
- 16.1Requirements and Solution Design
- 16.2Basic Components
- 16.2.1Module Registration
- 16.2.2Language File
- 16.2.3Abstract Backend Controller
- 16.3First Function: List Comments
- 16.3.1Comment Controller
- 16.3.2Fluid Templates
- 16.4Second Function: Dashboard
- 16.4.1Extend Module Registration
- 16.4.2Extend Action Menu
- 16.4.3Dashboard Controller
- 16.4.4Fluid Templates
- 16.4.5Visualise Statistical Data
- 16.4.6RequireJS
- 16.4.7AJAX in the TYPO3 Backend
- 16.4.8Add AJAX Functionality to JavaScript
- 16.4.9Fine-tuning and Additional Notes
- 16.5Styleguide Extension
- 16.5.1Installation
- 16.5.2Usage
- 16.6Recap
17.Clean-up and Finalisation
- 17.1Annotations
- 17.2PSR-2 Coding Standard (“PHP CodeSniffer”)
- 17.3DocBlocks (“phpDocumentor”)
- 17.4Documentation
- 17.5Recap
18.Security Basics
- 18.1TYPO3 Security Team
- 18.2Security in TYPO3 Extensions
- 18.3Most Common Security Vulnerabilities
- 18.3.1OWASP Top 10
- 18.3.2Injection Flaws
- 18.3.3Cross-site Scripting
- 18.3.4Cross-Site Request Forgery
- 18.3.5Lack of Access Control
- 18.4Further Typical Security Vulnerabilities
19.What’s Next
- 19.1Get Officially Certified
Appendix
- TYPO3 Release History
- Extension Declaration File
- References and Further Reading
- Unofficial Websites
- PHP Security
- Glossary
- Changelog