Prepare your extension for
Joomla 4
Allon Moritz
Joomla World Conference 19. November 2017
https://joomla.digital-peak.com
Joomla World Conference 2017
About Me
Allon Moritz
@digitpeak / @laoneo
Founder Digital Peak GmbH
Doing Joomla extensions since 2007
Joomla 4 Working group
Team Lead Media Manager
GsoC Mentor
https://joomla.digital-peak.com
Joomla World Conference 2017
Agenda
Namespaces in PHP
MVC Layer
Component
Namespacing
Dispatcher
Form
Modules
Plugins
Backwards compatibility
Demo Weblinks migration
Questions
https://joomla.digital-peak.com
Joomla World Conference 2017
Namespaces in PHP
Organising classes in a defined structure
Autoloaded through the classloader, no manual include or require anymore
Example ContentModelArticles becomes
\Joomla\Component\Content\Administrator\Model\ArticlesModel
JLoader can handle the namespaces automatically
We can distinguish between front end and back end classes
Files can be found in /libraries/src
https://joomla.digital-peak.com
Joomla World Conference 2017
Namespaces in PHP
https://joomla.digital-peak.com
Joomla World Conference 2017
MVC Layer: Introduction
Basically the legacy layer becomes the default MVC in Joomla 4
“New MVC” layer will be deprecated
FOF2 got removed from core
Use Bootstrap 4 in the layouts
JModelLegacy::getInstance will be deprecated, use the models directly
MVCFactoryInterface to create model instances
https://joomla.digital-peak.com
Joomla World Conference 2017
MVC Layer: Libraries
The old classes are still working but the real files do exist in
JControllerLegacy is now \Joomla\CMS\MVC\Controller\BaseController
JModelLegacy is now \Joomla\CMS\MVC\Model\BaseDatabaseModel
JViewLegacy is now \Joomla\CMS\MVC\View\AbstractView
JTable stays is now \Joomla\CMS\Table\Table
JPlugin is now \Joomla\CMS\Plugin\CMSPlugin
https://joomla.digital-peak.com
Joomla World Conference 2017
Component: Namespacing
A Joomla 4 component will have the
structure as in the picture
Uppercase folders have classes
Lowercase folders do hold the rest like
forms or template files
Dispatcher is not namespaced
Root classes do become a \ and front
Controller and Model need an additional
parameter MVCFactoryInterface
Front end namespace is
\FooVendor\Component\Bar\Site
Back end namespace is
\FooVendor\Component\Bar\Administrator
https://joomla.digital-peak.com
Joomla World Conference 2017
Component: Namespacing Todo
Helpers are need to be done on a case
per case basis
ContentHelper
RouteHelper
QueryHelper
AssociationsHelper
How to register the services in JHtml
https://joomla.digital-peak.com
Joomla World Conference 2017
Component: Dispatcher
Replacement single entry file content.php in root
Get the application injected
Dispatches the controller
https://joomla.digital-peak.com
Joomla World Conference 2017
Component: Form
Forms are in the folder forms under root in the extension on, eg.
/forms/article.xml
Extra fields are registered with addfieldprefix attribute which adds the
namespace
https://joomla.digital-peak.com
Joomla World Conference 2017
Modules
Module file stays as single entry file
Namespacing is done on the additional classes
Modules namespace is \FooVendor\Module\Bar\Administrator for front end
Modules namespace is \FooVendor\Module\Bar\Site for front end
All core modules are namespaced
https://joomla.digital-peak.com
Joomla World Conference 2017
Plugins
Plugin file stays the same not namespaced
When you have additional classes, they can be namespaced
Plugin namespace is \FooVendor\Plugin\Content\Bar
https://joomla.digital-peak.com
Joomla World Conference 2017
Backwards compatibility
https://joomla.digital-peak.com
Joomla World Conference 2017
Backwards compatibility
Target is that a Joomla 3 extension will run on Joomla 4
Target is that a Joomla 4 extension will run on Joomla 3.9
Classmapping for libraries so JForm still exists and maps to
\Joomla\CMS\Form\Form
Changes are added not replaced to make sure the old code works
Removed old deprecated code
Changing to a more service oriented architecture, using interfaces
Class overloading should be avoided
Event system has changed completely. JEventDispatcher is removed, use
Factory::getApplication()->triggerEvent(‘’);
https://joomla.digital-peak.com
Joomla World Conference 2017
Weblinks migration: Introduction
Weblinks is a core supported Joomla extension
Manages links
Development happens on Github
https://github.com/joomla-extensions/weblinks
It runs on Joomla 4 with a few modifications
https://github.com/joomla-extensions/weblinks/pull/362
https://joomla.digital-peak.com
Joomla World Conference 2017
Weblinks migration: Dispatcher
Create the dispatcher
Namespace the WeblinksController as DisplayController
https://joomla.digital-peak.com
Joomla World Conference 2017
Weblinks migration: List view
Define the default view in the
DisplayController
Namespace the weblinks list
controller
Namespace the weblinks model
Namespace the weblinks list view
Move the weblinks template files to
the right position
https://joomla.digital-peak.com
Joomla World Conference 2017
Weblinks migration: Form View
Namespace the weblink controller
Namespace the weblink model
Namespace the weblink table
Namespace the weblink view
Move the weblink template files to
the right position
https://joomla.digital-peak.com
Joomla World Conference 2017
Weblinks migration: Bootstrap 4
The layout files do need to be adapted
default.php and edit.php change from row-fluid to row
default.php and edit.php change from spanX to col-md-X
https://joomla.digital-peak.com
Joomla World Conference 2017
Weblinks migration: Misc
The XML forms are moved to the root folder of the component
The fields should be put into the folder Field
For front end applies the same as back end
https://joomla.digital-peak.com
Joomla World Conference 2017
Questions?
Slides on
https://joomla.digital-peak.com/blog/215-joomla-world-conference-2017
https://joomla.digital-peak.com
Joomla World Conference 2017
Thank you and enjoy the day :-)