CertiFUNcation 2017 Best Practices Extension Development for TYPO3 8 LTS
1. 0CertiFUNcation 2017, Best Practices Extension Development for TYPO3 8 LTS, Nicole Cordes, CPS-IT Mehr Wert im Netz
CertiFUNcation 2017
Best Practices Extension Development for TYPO3 8 LTS
2. 1CertiFUNcation 2017, Best Practices Extension Development for TYPO3 8 LTS, Nicole Cordes, CPS-IT Mehr Wert im Netz
Summary
3. 2CertiFUNcation 2017, Best Practices Extension Development for TYPO3 8 LTS, Nicole Cordes, CPS-IT Mehr Wert im Netz
Summary
Changes
» Configuration Bootstrap
» Doctrine
» Fluid Standalone
4. 3CertiFUNcation 2017, Best Practices Extension Development for TYPO3 8 LTS, Nicole Cordes, CPS-IT Mehr Wert im Netz
Structure
5. 4CertiFUNcation 2017, Best Practices Extension Development for TYPO3 8 LTS, Nicole Cordes, CPS-IT Mehr Wert im Netz
Structure
Directories
» Classes
» Configuration
» Documentation
» Resources
» Tests
6. 5CertiFUNcation 2017, Best Practices Extension Development for TYPO3 8 LTS, Nicole Cordes, CPS-IT Mehr Wert im Netz
Structure
Classes
» Home of your PHP files
» Common subfolders:
» Controller
» Domain
» Model
» Repository
» Hooks
» Plugin
» Service
» ViewHelpers
7. 6CertiFUNcation 2017, Best Practices Extension Development for TYPO3 8 LTS, Nicole Cordes, CPS-IT Mehr Wert im Netz
Structure
Configuration
» FlexForms
» XML files used to make extension plugins configurable
» TCA
» configuration for own extension tables; file names supposed to equal table name; an array has to be
returned
» subfolder: Overrides
» contains general table changes for non-extension tables
» TSconfig
» contains page and/or user TypoScript configuration files
» TypoScript
» constants.typoscript
» setup.typoscript
8. 7CertiFUNcation 2017, Best Practices Extension Development for TYPO3 8 LTS, Nicole Cordes, CPS-IT Mehr Wert im Netz
Structure
Documentation
» user manual
» reStructuredText (ReST) files
» typical files:
» Includes.txt
» Index.rst
» Settings.yml
» can be rendered by using EXT:sphinx
9. 8CertiFUNcation 2017, Best Practices Extension Development for TYPO3 8 LTS, Nicole Cordes, CPS-IT Mehr Wert im Netz
Structure
Resources
» Private
» Language – XLF files for your language labels
» Layouts – HTML files for Fluid Templates
» Partials – HTML files for Fluid Templates
» Php – external PHP-Code (e.g. phar files, libraries)
» Templates – HTML files for Fluid
» TypeScript – TS files for JavaScript compiling
» Public
» Css – CSS Stylesheet files
» Fonts – font files used in Stylesheet (e.g. EOT, SVG, TTF, WOFF)
» Icons – Icons used in Frontend and/or Backend
» Images – Images used in Frontend and/or Backend
» JavaScript – JS files used in Frontend and/or Backend
10. 9CertiFUNcation 2017, Best Practices Extension Development for TYPO3 8 LTS, Nicole Cordes, CPS-IT Mehr Wert im Netz
Structure
Tests
» Acceptance
» tests based on Codeception
» Functional
» tests based on PHPUnit with an isolated TYPO3 instance and database access
» JavaScript
» tests based on JUNIT
» Unit
» tests based on PHPUnit to test smaller parts of your code
11. 10CertiFUNcation 2017, Best Practices Extension Development for TYPO3 8 LTS, Nicole Cordes, CPS-IT Mehr Wert im Netz
Structure
Files
» ext_emconf.php
» mandatory file to describe your extension
» ext_icon.svg, ext_icon.png or ext_icon.gif
» icon used to display your extension in Extension Manager and on typo3.org
» note: icons moved to Resources/Public/Icons/Extension.[svg, png, gif] with a legacy handling, but
TER isn’t compatible at the moment and still uses old icon file names
» ext_localconf.php
» Configuration file for hook/slot registration, plugin configuration, TYPO3_CONF_VARS configuration
» ext_tables.php
» backend configuration e.g. for modules, hook/slot registration
» ext_tables.sql
» SQL definitions for your extension tables as well as changes to existing database tables
12. 11CertiFUNcation 2017, Best Practices Extension Development for TYPO3 8 LTS, Nicole Cordes, CPS-IT Mehr Wert im Netz
Configuration
files
13. 12CertiFUNcation 2017, Best Practices Extension Development for TYPO3 8 LTS, Nicole Cordes, CPS-IT Mehr Wert im Netz
Configuration files
TCA
» table configuration for new extension tables
» additional table configuration for existing tables
» TYPO3CMSCoreUtilityExtensionManagementUtility::addStaticFile()
» add own TypoScript files
» TYPO3CMSCoreUtilityExtensionManagementUtility::makeCategorizable()
» turn a field into a category field
» TYPO3CMSCoreUtilityExtensionManagementUtility::registerPageTSConfigFile()
» add a page TSconfig file to pages `Include Page TSConfig` field
» TYPO3CMSExtbaseUtilityExtensionUtility::registerPlugin()
» TYPO3CMSCoreUtilityExtensionManagementUtility::addPlugin()
» add plugin to tt_content `Selected Plugin` field
14. 13CertiFUNcation 2017, Best Practices Extension Development for TYPO3 8 LTS, Nicole Cordes, CPS-IT Mehr Wert im Netz
Configuration files
ext_localconf.php
» earliest Boostrap entry point
» contains:
» TYPO3_CONF_VARS configuration
» hook/slot registration
» TYPO3CMSCoreUtilityExtensionManagementUtility::addPageTSConfig()
» TYPO3CMSCoreUtilityExtensionManagementUtility::addUserTSConfig()
» add own TSconfig configuration
» TYPO3CMSCoreUtilityExtensionManagementUtility::addTypoScript()
» add additional (plain) TypoScript
» TYPO3CMSCoreUtilityExtensionManagementUtility::registerAjaxHandler()
» add own ajax handler
15. 14CertiFUNcation 2017, Best Practices Extension Development for TYPO3 8 LTS, Nicole Cordes, CPS-IT Mehr Wert im Netz
Configuration files
ext_tables.php
» loaded in backend mode only
» (in frontend mode only with valid backend user authentication)
» contains:
» TYPO3CMSCoreUtilityExtensionManagementUtility::addLLrefForTCAdescr()
» load additional description reference files
» TYPO3CMSCoreUtilityExtensionManagementUtility::addModule()
» add an own backend module
» TYPO3CMSCoreUtilityExtensionManagementUtility::allowTableOnStandardPages()
» allow records on standard pages
16. 15CertiFUNcation 2017, Best Practices Extension Development for TYPO3 8 LTS, Nicole Cordes, CPS-IT Mehr Wert im Netz
Configuration files
General recommendation
» check TYPO3 mode
» defined('TYPO3_MODE') or die('Access denied.');
» prevent global scope
» (function()
{
// your code goes in here
})();
17. 16CertiFUNcation 2017, Best Practices Extension Development for TYPO3 8 LTS, Nicole Cordes, CPS-IT Mehr Wert im Netz
Doctrine DBAL
18. 17CertiFUNcation 2017, Best Practices Extension Development for TYPO3 8 LTS, Nicole Cordes, CPS-IT Mehr Wert im Netz
Doctrine DBAL
Database API
» support different database system (MySQL, PostgreSQL, MSSQL)
» use PHP standard packages
» remove old legacy dependencies
» define different database credentials (table mapping)
19. 18CertiFUNcation 2017, Best Practices Extension Development for TYPO3 8 LTS, Nicole Cordes, CPS-IT Mehr Wert im Netz
Doctrine DBAL
QueryBuilder
» $queryBuilder = TYPO3CMSCoreUtilityGeneralUtility::makeInstance(
TYPO3CMSCoreDatabaseConnectionPool::class
)
->getQueryBuilderForTable('pages');
» $queryBuilder
->select('*')
->from('pages')
->execute();
» while ($row = $result->fetch()) {
}
20. 19CertiFUNcation 2017, Best Practices Extension Development for TYPO3 8 LTS, Nicole Cordes, CPS-IT Mehr Wert im Netz
Doctrine DBAL
Restrictions
» applied automatically to the QueryBuilder
» TYPO3CMSCoreDatabaseQueryRestrictionDeletedRestriction
» TYPO3CMSCoreDatabaseQueryRestrictionHiddenRestriction
» TYPO3CMSCoreDatabaseQueryRestrictionStartTimeRestriction
» TYPO3CMSCoreDatabaseQueryRestrictionEndTimeRestriction
» remove all restrictions and add only single ones
» $queryBuilder
->getRestrictions()
->removeAll()
->add(TYPO3CMSCoreUtilityGeneralUtility::makeInstance(
TYPO3CMSCoreDatabaseQueryRestrictionDeletedRestriction::class
));
21. 20CertiFUNcation 2017, Best Practices Extension Development for TYPO3 8 LTS, Nicole Cordes, CPS-IT Mehr Wert im Netz
Common
pitfalls
22. 21CertiFUNcation 2017, Best Practices Extension Development for TYPO3 8 LTS, Nicole Cordes, CPS-IT Mehr Wert im Netz
Common pitfalls
Dependencies
» set dependencies to TYPO3 core extensions you are using
» e.g. backend, core, extbase, fluid, scheduler
» set version constraints only to existing versions
» you don‘t know which changes will come in the future
» prevent versions like 7.99.99, 8.99.99
» test the extension in the version(s) you claim to be compatible
23. 22CertiFUNcation 2017, Best Practices Extension Development for TYPO3 8 LTS, Nicole Cordes, CPS-IT Mehr Wert im Netz
Common pitfalls
Fluid
» variables containing objects do not belong into quotes
» wrong: {f:uri.image(image: '{slide}')}
» throws an error because Fluid tries to encode strings automatically
» fix: {f:uri.image(image: slide)}
24. 23CertiFUNcation 2017, Best Practices Extension Development for TYPO3 8 LTS, Nicole Cordes, CPS-IT Mehr Wert im Netz
Common pitfalls
Fluid
» output encoding due to Fluid Standalone’s behavior change
» you need to explicitly turn encoding off in the ViewHelper
» two new properties of ViewHelpers to turn escaping off
» protected $escapeChildren = false;
» variables in the renderChildren clause are not encoded by default
» necessary if the ViewHelper handles the encoding itself
» protected $escapeOutput = false;
» the whole ViewHelper output will not be encoded by default
» necessary if the ViewHelper returns HTML
25. 24CertiFUNcation 2017, Best Practices Extension Development for TYPO3 8 LTS, Nicole Cordes, CPS-IT Mehr Wert im Netz
General
recommendations
26. 25CertiFUNcation 2017, Best Practices Extension Development for TYPO3 8 LTS, Nicole Cordes, CPS-IT Mehr Wert im Netz
General recommendations
Use PHP7 features
» strict type declaration
» declare (strict_types = 1);
» type hinting for function parameter
» return type annotation
» public function getInformationForTable(string $tableName): array
» null coalescing operator
» $username = $_GET['user'] ?? 'nobody';
27. 26CertiFUNcation 2017, Best Practices Extension Development for TYPO3 8 LTS, Nicole Cordes, CPS-IT Mehr Wert im Netz
General recommendations
Publish on GitHub
» not TYPO3 only
» wide range of users
» they can give feedback (add issues/requests)
» they can easily fix or extend your extension (pull requests)
» multiple services as integrations
28. 27CertiFUNcation 2017, Best Practices Extension Development for TYPO3 8 LTS, Nicole Cordes, CPS-IT Mehr Wert im Netz
General recommendations
Publish on Packagist
» if a composer.json file is present, the registration on Packagist is mandatory
» claim your vendor name for security reason
» choose your vendor name wisely
» otherwise you will never be able to publish the extension on Packagist
» GitHub offers an integration for Packagist
» you never have to do anything again
29. 28CertiFUNcation 2017, Best Practices Extension Development for TYPO3 8 LTS, Nicole Cordes, CPS-IT Mehr Wert im Netz
General recommendations
Watch your Code Style
» use PSR-2 code style in your PHP code
» add Style CI for automated code style tests
» GitHub offers an integration
» faster than running CI server with PHP-CS-Fixer
» offer PHP-CS-Fixer configuration for easy command-line fixing
30. 29CertiFUNcation 2017, Best Practices Extension Development for TYPO3 8 LTS, Nicole Cordes, CPS-IT Mehr Wert im Netz
General recommendations
Test your code
» You don't have tests?
» There is still something to test!
» run PHP linting
» integrate Travis CI for automated testing
» GitHub offers an integration
» build is triggered for push and pull requests
» try to write unit and/or functional tests for bugs
31. 30CertiFUNcation 2017, Best Practices Extension Development for TYPO3 8 LTS, Nicole Cordes, CPS-IT Mehr Wert im Netz
Additional
information
32. 31CertiFUNcation 2017, Best Practices Extension Development for TYPO3 8 LTS, Nicole Cordes, CPS-IT Mehr Wert im Netz
Additional information
Links
» TYPO3 documentation
» Extension directory structure
» https://docs.typo3.org/typo3cms/CodingGuidelinesReference/FileSystemConventions/ExtensionDirec
toryStructure/Index.html
» TYPO3 documentation
» TCA Reference
» https://docs.typo3.org/typo3cms/TCAReference/Introduction/Index.html
» TYPO3Wiki
» Extension Developers Guide
» https://wiki.typo3.org/Extension_Developers_Guide
» Use TYPO3
» Good Practices in Extensions
» https://usetypo3.com/good-practices-in-extensions.html
33. 32CertiFUNcation 2017, Best Practices Extension Development for TYPO3 8 LTS, Nicole Cordes, CPS-IT Mehr Wert im Netz
Additional information
Links
» Jans Blog
» Migrate from the TYPO3 database wrapper to the Doctrine DBAL syntax
» http://jans-blog.helke.de/2016/04/14/migrate-from-the-typo3-database-wrapper-to-the-doctrine-dbal-
syntax/
» doc_core_insight
» TYPO3 Extension dependencies revisited
» http://insight.helhum.io/post/155297666635/typo3-extension-dependencies-revisited
» PHP
» Migrating from PHP 5.6.x to PHP 7.0.x
» http://php.net/manual/de/migration70.php
34. 33CertiFUNcation 2017, Best Practices Extension Development for TYPO3 8 LTS, Nicole Cordes, CPS-IT Mehr Wert im Netz
33
Thanks
for your attention!