[FEATURE] Introduce Site Handling 05/56505/56
authorChristian Kuhn <lolli@schwarzbu.ch>
Sun, 1 Apr 2018 11:15:55 +0000 (13:15 +0200)
committerAndreas Fernandez <a.fernandez@scripting-base.de>
Fri, 6 Apr 2018 20:23:20 +0000 (22:23 +0200)
commit0824e6e84b05d10fb431d9de308f37dbdce198b4
treefd3dd55e910c9bd9c93c0b71a6a2430105acd4e0
parent1eeedc59379b1698006c3b8607705df3367e0d91
[FEATURE] Introduce Site Handling

TYPO3 is famously known for the "multi-site"
functionality, allowing multiple websites running
within one TYPO3 instance.

However, configuring a multi-site had various downsides,
mostly regarding to domain/entrypoint handling for a site,
and if lots of languages were in place.

Concepts like "absRefPrefix", "baseURL", various language
related TypoScript settings, and the infamous
"L" GET parameter can now be seen obsolete.

Also, handling page-not-found or access-denied errors
have never been easier, as every admin/integrator is able
to configure this.

What TYPO3 calls a "site" is a entrypoint / pagetree,
and contains both configuration values relevant for
Backend and Frontend.

A site configuration has a unique (human-readable)
"site identifier" and the following additional values:

* Root page ID
This is a page on the root level (pid=0) or having
"is_siteroot" checked.

* The base path / base URL
This HTTP entry point e.g. https://www.mydomain.com/
 ("Base URL" / HTTP entry point,
like https://www.mydomain.com/)

-- This allows to fully identify a pagetree with
an entrypoint without having to guess during "runtime".

* The definition of all available languages for this
  pagetree, including the default language for this
  specific pagetree.

-- This includes both values for backend-related as
well as information, previously only settable via TypoScript.

This way, it is possible to have a TYPO3 installation
with 20 languages, but only using 5 languages within
one pagetree (site), using 15 different languages in
another site, while also giving meaning for all records
within one site.

A site configuration can be added or edited within the
TYPO3 Backend in a new backend module for admins,
and is then persisted in
"typo3conf/sites/site-identifier/config.yaml".

The configuration format yaml is chosen as it minimizes
the risk of doing hacks, but the concept of a SiteConfiguration
can be adapted / exchanged to be overloaded or found
in various other places in the future.

Adding a site configuration for a project has various
benefits:
- Configuration is in one place, stored in the file system
  thus, is deployable.
- Configuration can be done by an integrator/admin without
  any programming skills => in one place.
- The necessity to query sys_language is only needed when
  configuring a site.
- No need to configure TSconfig options like
  "previewDomains" and "defaultLanguageLabel" are gone.
  is
- No need to configure any TypoScript conditions, or
  even TypoScript settings related to language handling.
- It is possible to configure error handling on a per-site
  level, even language-dependant, without having to
  code or configure anything.

However, if no site is configured for a pagetree, the
previous behaviour is still in place, allowing to migrate
slowly to the sites handling, as some key functionality like
URL path handling for speaking URLs is not in place yet.

It is important to understand that adding a site
configuration comes with various restrictions:
- "sys_domain" handling is not necessary anymore, as a page
  is resolved via the domain+base URL given in the configuration
- Any previously configured TypoScript conditions based
  on L parameter do not apply anymore if a site is configured
- This also applies to any config.*language* related TypoScript
  setting.
- It is necessary to use a URI with scheme and path to configure
  a site, where as previously, TYPO3 would work without a base
  URL.
- mod_rewrite or something similar is a requirement for sites
  to work properly.

Further improvements not yet implemented:
- Ensure backend modules like Web->Page, Web->View, Web->List
and Web->Info only show records in the configured site languages.
- Enable the possibility to handle "domain entry aliases",
  also for multi-server setups with different domain names.
- Ensure the new Site module can handle "read-only" / deployable
  site configurations.
- Allow to activate a language for a site to be editable
  in the Backend but not be available in the Frontend for
  everybody.
- Handling "Storage Folder" on the top level with different
  language entries.
- Improve URL generation in frontend to skip sys_domain
  resolving.
- TypoScript conditions for [site = my-identifier] and
  [siteLanguage = dk].
- Improve proper caching for rootline resolving of pages
  without restrictions.
- Improve resolving of siteLanguage from the current request.
- Linking from one site to a page of a different site.
- Centralizing access to sys_language and sys_domain.
- Handle copying/moving of records to a different site
  with different languages and language settings.
- Handle configuration change (like deleting a language
  in the configuration - what should happen to the
  translated records?)

Next up for 9.3:
- Adding "Routers" on top of sites for URL resolving
  of pages and records.
- Handle Storage Folders on top level rootline
- Handle Mount Points

New API:
- New Entity classes "Site" and "SiteLanguage" are
  resolved as part of a PSR-15 middleware and available
  for pages in FE and BE when possible.
- A SiteFinder object is used to query Site and SiteLanguage
  objects and used in various places.
- The new PageUriBuilder allows to create links to pages
  without any relation to the current request, and
  are already in use in Frontend links and Backend preview links.
- A PageErrorHandlerInterface allows to custom error handlers
  to be introduced by extensions and configured on any site.

Site handling is considered still "under development"
until TYPO3 9 LTS, and implementation as well as the
configuration format might change in the next sprint
releases, in order to gather feedback on what is missing
in the implementation.

As a site configuration will be mandatory for TYPO3 v10.0,
some changes regarding sys_language and sys_domain will
follow.

Beware:
- Due to the definition of every record of default language
  (language=0), it might be possible to switch to locales
  for languages and get rid of the language ID.
- sys_domain won't make it any much longer.

Resolves: #84581
Releases: master
Change-Id: Iabeeb6835a98c8f5a71d502379ed63a68dfad6dd
Reviewed-on: https://review.typo3.org/56505
Tested-by: TYPO3com <no-reply@typo3.com>
Reviewed-by: Anja Leichsenring <aleichsenring@ab-softlab.de>
Tested-by: Anja Leichsenring <aleichsenring@ab-softlab.de>
Reviewed-by: Georg Ringer <georg.ringer@gmail.com>
Tested-by: Georg Ringer <georg.ringer@gmail.com>
Reviewed-by: Andreas Fernandez <a.fernandez@scripting-base.de>
Tested-by: Andreas Fernandez <a.fernandez@scripting-base.de>
51 files changed:
typo3/sysext/backend/Classes/Configuration/SiteTcaConfiguration.php [new file with mode: 0644]
typo3/sysext/backend/Classes/Controller/SiteConfigurationController.php [new file with mode: 0644]
typo3/sysext/backend/Classes/Controller/SiteInlineAjaxController.php [new file with mode: 0644]
typo3/sysext/backend/Classes/Exception/SiteValidationErrorException.php [new file with mode: 0644]
typo3/sysext/backend/Classes/Form/FieldInformation/SiteConfiguration.php [new file with mode: 0644]
typo3/sysext/backend/Classes/Form/FormDataGroup/SiteConfigurationDataGroup.php [new file with mode: 0644]
typo3/sysext/backend/Classes/Form/FormDataProvider/SiteDatabaseEditRow.php [new file with mode: 0644]
typo3/sysext/backend/Classes/Form/FormDataProvider/SiteTcaInline.php [new file with mode: 0644]
typo3/sysext/backend/Classes/Form/FormDataProvider/SiteTcaSelectItems.php [new file with mode: 0644]
typo3/sysext/backend/Classes/Middleware/SiteResolver.php [new file with mode: 0644]
typo3/sysext/backend/Classes/Routing/PageUriBuilder.php [new file with mode: 0644]
typo3/sysext/backend/Classes/Utility/BackendUtility.php
typo3/sysext/backend/Configuration/Backend/AjaxRoutes.php
typo3/sysext/backend/Configuration/RequestMiddlewares.php
typo3/sysext/backend/Configuration/SiteConfigurationTCA/sys_site.php [new file with mode: 0644]
typo3/sysext/backend/Configuration/SiteConfigurationTCA/sys_site_errorhandling.php [new file with mode: 0644]
typo3/sysext/backend/Configuration/SiteConfigurationTCA/sys_site_language.php [new file with mode: 0644]
typo3/sysext/backend/Resources/Private/Language/locallang_siteconfiguration.xlf [new file with mode: 0644]
typo3/sysext/backend/Resources/Private/Language/locallang_siteconfiguration_module.xlf [new file with mode: 0644]
typo3/sysext/backend/Resources/Private/Language/locallang_siteconfiguration_tca.xlf [new file with mode: 0644]
typo3/sysext/backend/Resources/Private/Language/siteconfiguration_fieldinformation.xlf [new file with mode: 0644]
typo3/sysext/backend/Resources/Private/Templates/SiteConfiguration/Edit.html [new file with mode: 0644]
typo3/sysext/backend/Resources/Private/Templates/SiteConfiguration/Overview.html [new file with mode: 0644]
typo3/sysext/backend/Resources/Public/Icons/module-contentelements.svg [new file with mode: 0644]
typo3/sysext/backend/Resources/Public/Icons/module-sites.svg [new file with mode: 0644]
typo3/sysext/backend/Resources/Public/Icons/module-templates.svg [new file with mode: 0644]
typo3/sysext/backend/Resources/Public/Icons/module-urls.svg [new file with mode: 0644]
typo3/sysext/backend/Resources/Public/JavaScript/SiteInlineActions.js [new file with mode: 0644]
typo3/sysext/backend/Tests/Unit/Form/FormDataGroup/SiteConfigurationTest.php [new file with mode: 0644]
typo3/sysext/backend/Tests/Unit/Form/FormDataProvider/SiteDatabaseEditRowTest.php [new file with mode: 0644]
typo3/sysext/backend/ext_localconf.php
typo3/sysext/backend/ext_tables.php
typo3/sysext/core/Classes/Configuration/SiteConfiguration.php [new file with mode: 0644]
typo3/sysext/core/Classes/Exception/SiteNotFoundException.php [new file with mode: 0644]
typo3/sysext/core/Classes/Site/Entity/Site.php [new file with mode: 0644]
typo3/sysext/core/Classes/Site/Entity/SiteLanguage.php [new file with mode: 0644]
typo3/sysext/core/Classes/Site/SiteFinder.php [new file with mode: 0644]
typo3/sysext/core/Configuration/DefaultConfiguration.php
typo3/sysext/core/Documentation/Changelog/master/Feature-84581-SiteHandling.rst [new file with mode: 0644]
typo3/sysext/frontend/Classes/Controller/ErrorController.php
typo3/sysext/frontend/Classes/Controller/TypoScriptFrontendController.php
typo3/sysext/frontend/Classes/Middleware/MaintenanceMode.php
typo3/sysext/frontend/Classes/Middleware/SiteResolver.php [new file with mode: 0644]
typo3/sysext/frontend/Classes/Page/PageGenerator.php
typo3/sysext/frontend/Classes/PageErrorHandler/DefaultPHPErrorHandler.php [new file with mode: 0644]
typo3/sysext/frontend/Classes/PageErrorHandler/FluidPageErrorHandler.php [new file with mode: 0644]
typo3/sysext/frontend/Classes/PageErrorHandler/PageContentErrorHandler.php [new file with mode: 0644]
typo3/sysext/frontend/Classes/PageErrorHandler/PageErrorHandlerInterface.php [new file with mode: 0644]
typo3/sysext/frontend/Classes/Typolink/PageLinkBuilder.php
typo3/sysext/frontend/Configuration/RequestMiddlewares.php
typo3/sysext/frontend/Tests/Unit/Controller/ErrorControllerTest.php