Skip to content
Snippets Groups Projects
  1. Sep 15, 2024
  2. Sep 14, 2024
    • Sascha Nowak's avatar
      [FEATURE] Introduce CacheDataCollector API · 48d0bce0
      Sascha Nowak authored
      A new API has been introduced to collect cache tags and their
      lifetime during frontend rendering. This API is used in the
      core to collect cache tags from page cache and content object
      cache.
      
      The API is implemented as a new PSR-7 request attribute
      `frontend.cache.collector` to remove the dependency from TSFE.
      
      Every cache tag has a lifetime. The minimum lifetime is
      calculated from all given cache tags. API users don't have
      to deal with it individually. The default lifetime for a
      cache tag is 86400 seconds (24 hours).
      
      The current TSFE api is deprecated in favor of the new API
      as the current API implementation does not allow to set a
      lifetime and extension authors have to workaround it. The
      TSFE api will be removed with the next major version.
      
      The frontend employs the following strategy: A relatively
      early middleware adds an empty new cacheDataCollector
      instance as attribute to request. Extensions rendering
      code based on database records can then add cache tags
      t...
      48d0bce0
  3. May 27, 2024
  4. Mar 19, 2024
    • Christian Kuhn's avatar
      [TASK] Add FrontendTypoScriptFactory · 5712a422
      Christian Kuhn authored
      In version 12, the introduction of the new TypoScript parser
      was accompanied by the implementation of factories for
      PageTsConfig and UserTsConfig.
      A factory for Frontend TypoScript has not been added,
      though: Frontend TypoScript creation ended up in
      TSFE->getFromCache(). At this point, establishing a proper
      factory was unfeasible due to the numerous dependencies of
      TypoScript creation to TSFE internals.
      
      With recent refactorings around TSFE, coupled with lots of
      state now being represented as request attributes, it's now
      possible to decompose getFromCache() and establish a
      FrontendTypoScriptFactory.
      
      getFromCache() is a complex beast: It influences Frontend
      rendering performance a lot, and tries to trigger the least
      amount of calculations, especially in 'fully cached pages'
      context. This results in high required complexity due to
      lots of state with diverse cross dependencies.
      
      The method composes of three main steps:
      1. Bootstrap TypoScript setting ("constants") and calculate
         setup condition verdicts. This creates required TypoScript
         related state needed to calculate the page cache identifier.
      2. Access page cache, lock page rendering if needed, and see
         if a possible page cache content contains uncached ("_INT")
         sections.
      3. Calculate at least setup "config." depending on given
         type/typeNum, but create full TypoScript setup if a cached
         page contains uncached sections or could not be retrieved
         from cache.
      
      The patch extracts parts 1 and 3 to FrontendTypoScriptFactory.
      Part 2 is moved into PrepareTypoScriptFrontendRendering
      middleware.
      
      This approach allowed these related refactorings:
      * The release of rendering locks is now consolidated within the
        PrepareTypoScriptFrontendRendering middleware. This guarantees
        locks are released, even in scenarios where lower middleware
        components encounter errors. This addresses an issue where
        locks retained during crashes, leading to deadlock situations
        in subsequent requests.
      * Dependencies to TSFE within ext:redirects RedirectService
        are reduced, and it no longer locks page rendering.
      * The Extbase BackendConfigurationManager utilizes the new
        factory, eliminating the need for its own implementation.
      
      The patch unlocks further refactorings: It especially allows
      removing the cache related properties from TSFE by representing
      them as request attributes. Subsequent patches will address this
      task accordingly.
      
      Resolves: #103410
      Related: #97816
      Related: #98914
      Related: #102932
      Releases: main
      Change-Id: I7fd158cffeebe6b2c64e0e3595284b8780fb73cf
      Reviewed-on: https://review.typo3.org/c/Packages/TYPO3.CMS/+/83179
      
      
      Tested-by: default avatarChristian Kuhn <lolli@schwarzbu.ch>
      Reviewed-by: default avatarStefan Bürk <stefan@buerk.tech>
      Reviewed-by: default avatarGarvin Hicking <gh@faktor-e.de>
      Tested-by: default avatarStefan Bürk <stefan@buerk.tech>
      Tested-by: default avatarcore-ci <typo3@b13.com>
      Tested-by: default avatarGarvin Hicking <gh@faktor-e.de>
      Reviewed-by: default avatarChristian Kuhn <lolli@schwarzbu.ch>
      5712a422
  5. Jan 26, 2024
    • Christian Kuhn's avatar
      [!!!][FEATURE] Avoid TSFE->config['config'] · a085e885
      Christian Kuhn authored
      Frontend TypoScript has two special details, next to
      'configuration' ("constants") and 'setup'.
      
      First, there is the determined "PAGE" object that depends
      on type / typeNum. It allows to render multiple different
      variants of a pages content. Historically, this has often
      been a "print" view, nowadays, this is usually a "json"
      variant, or some XML for sitemaps.
      
      A frontend is not rendered without a proper PAGE object.
      The FE rendering chain determines the given 'type' and maps
      it to a configured PAGE with this 'typeNum', defaulting
      to zero '0'.
      The patch models the determined PAGE object to the Request
      attribute 'FrontendTypoScript' now, which is used by FE
      RequestHandler to manage rendering of this PAGE type.
      
      Second special thing is 'config' TypoScript as top-level
      'config' settings. Those can be overridden by the specific
      PAGE object (often 'page.config'). A typical use case is
      'json.config.disableAllHeaderCode = 1'.
      This "merged" 'config' array has been available as
      TSFE->config['config'] before. The patch makes the merged
      config available in the 'FrontendTypoScript' object as
      well, available in the Request object as
      'frontend.typoscript' attribute.
      
      The patch adapts all usages of TSFE->config['config'] to
      the attribute.
      
      There is a special quirk with 'config': This part of
      TypoScript 'setup' is so important, that it needs to be
      available in 'fully cached page' scenarios as well, to
      for instance decide if a content-length header should be
      added to the response.
      This has been the reason 'config' has been cached along
      with page cache content in 'page' cache before.
      The patch changes this and adds dedicated cache entries
      for 'merged config' in the (file based) 'typoscript' cache.
      This reduces page cache size a bit and allows re-using
      these 'config' cache accross different pages when they
      are identical, which is determined by the cache identifiers.
      
      All these changes are logical follow-ups to the TypoScript
      parser that has been implemented with v12.
      They pave the way to extract TypoScript calculation from
      TypoScriptFrontendController with upcoming patches.
      
      Next to this refactoring, the existing hooks in this area
      had to fall, especially to get rid of their dependency to
      "pObj" TypoScriptFrontendController. They are mostly
      substituted by new events, details are documented with the
      .rst files and class comments.
      
      The patch reduces usages of $GLOBALS['TSFE'] and usages
      of TypoScriptFrontendController in general.
      
      $GLOBALS['TSFE']->config['config'] is still available as
      b/w compat layer (a dedicated deprecation will follow),
      but core usages have been removed. This became a bit
      complicated with TimeTrackerInitialization and
      WorkspacePreview middlewares: Both are run before the
      final TypoScript 'config' is determined, so they do
      not have that attribute attached to their incoming
      Request. But they still need to know TS 'config'
      details to decide on details *after* calling lower handle()
      middlewares. They by now accessed $GLOBALS['TSFE'], which
      is (still) set by a lower middleware. To avoid this
      indirect state usage, these middlewares now register an event
      listener that is dispatched after TypoScript 'config' has been
      determined, and set local state to know if they should add
      additional Response data.
      
      Resolves: #102932
      Releases: main
      Change-Id: I8282f7a93fe9594e78865db63a3e656cc4d5f8da
      Reviewed-on: https://review.typo3.org/c/Packages/TYPO3.CMS/+/82522
      
      
      Tested-by: default avatarStefan Bürk <stefan@buerk.tech>
      Tested-by: default avatarBenni Mack <benni@typo3.org>
      Reviewed-by: default avatarBenni Mack <benni@typo3.org>
      Reviewed-by: default avatarStefan Bürk <stefan@buerk.tech>
      Tested-by: default avatarChristian Kuhn <lolli@schwarzbu.ch>
      Tested-by: default avatarcore-ci <typo3@b13.com>
      Reviewed-by: default avatarChristian Kuhn <lolli@schwarzbu.ch>
      a085e885
  6. Oct 24, 2023
  7. Apr 20, 2023
  8. Oct 25, 2022
    • Christian Kuhn's avatar
      [FEATURE] Add TypoScript as Request attribute · e3bbf6c9
      Christian Kuhn authored
      The patch introduces the new request attribute
      TypoScriptRequestAttribute as 'frontend.typoscript'.
      
      It is set up in the Frontend middleware chain,
      extensions and content objects can use this
      attribute to retrieve TypoScript settings and
      setup.
      
      This obsoletes usages of TSFE->tmpl, the patch
      switches usages to the request attribute.
      
      Note we're also establishing a better wording:
      The old TypoScript 'constants' are now called
      'settings'. This matches much better, should avoid
      confusion for newcomers and is in line with further
      renaming of a vaguely anticipated new 'constants
      editor' towards 'settings editing' or similar.
      Further patches in this naming area will follow.
      
      Change-Id: Ib6ffb91db9bf0976f39759b12983d78418d64efa
      Resolves: #98914
      Releases: main
      Reviewed-on: https://review.typo3.org/c/Packages/TYPO3.CMS/+/76239
      
      
      Tested-by: default avatarcore-ci <typo3@b13.com>
      Tested-by: default avatarBenni Mack <benni@typo3.org>
      Tested-by: default avatarStefan Bürk <stefan@buerk.tech>
      Tested-by: Christian Kuhn...
      e3bbf6c9
  9. Oct 03, 2022
    • Christian Kuhn's avatar
      [!!!][TASK] Use new TypoScript parser in Frontend · a927bc00
      Christian Kuhn authored
      This switches from TemplateService to new TypoScript
      parser logic in TypoScriptFrontendController.
      
      The central methods getFromcache() and getConfigArray()
      were called in PrepareTypoScriptFrontendRendering after
      each other: getConfigArray() is now merged into
      getFromcache() directly.
      
      One main goal is to get rid of the 'pagesection' cache
      and leverage the new cache strategy of the new TypoScript
      parser: This cache strategy is more effective and allows
      caching TypoScript between different pages.
      
      We essentially get rid of the pagesection query load,
      but instead need the list of relevant sys_template rows
      early, which is done with a single query. This code is
      moved out of IncludeTree/TreeBuilder to new class
      IncludeTree/SysTemplateRepository, since the result is
      now needed to build page cache identifiers and thus must
      be exposed.
      
      An event is added as well, for extensions like ext:bolt
      to manipulate sys_template rows resolving. The old
      runThroughTemplatesPostProcessing hook is marked @internal
      now and will vanish during further v12 development when
      testing-framework has been changed to deal with it.
      
      The central getFromcache() is much better documented and
      should be far easier to understand now. Some parts of
      the code are currently a bit naive and there is quite a
      bit potential to further optimize parsetime especially
      in "full cached" scenarios. We also have the potential to
      make USER_INT parsing significantly quicker. Dedicated
      patches will follow with continued v12 development.
      
      The patch also sets a couple of properties to @internal,
      and marks the old TypoScriptParser and TemplateService
      @deprecated, even though it is currently still used for
      instance for TSconfig parsing, which will switch to the
      new parser soon as well.
      
      Resolves: #98503
      Related: #97816
      Releases: main
      Change-Id: I904e9add4a425479df4a6768a1d63a54d7b252d8
      Reviewed-on: https://review.typo3.org/c/Packages/TYPO3.CMS/+/75944
      
      
      Tested-by: default avatarStefan Bürk <stefan@buerk.tech>
      Tested-by: default avatarcore-ci <typo3@b13.com>
      Tested-by: default avatarBenni Mack <benni@typo3.org>
      Reviewed-by: default avatarStefan Bürk <stefan@buerk.tech>
      Reviewed-by: default avatarBenni Mack <benni@typo3.org>
      a927bc00
  10. Mar 03, 2022
  11. Sep 16, 2021
  12. Aug 30, 2021
  13. Aug 10, 2020
  14. Jun 05, 2020
  15. Apr 15, 2020
  16. Apr 14, 2020
  17. Apr 13, 2020
  18. Mar 28, 2020
  19. Aug 06, 2019
  20. Jul 13, 2019
    • Benni Mack's avatar
      [!!!][TASK] Remove dependencies of TSFE · e50b1c1a
      Benni Mack authored
      This patch re-arranges the TYPO3 Core internally used
      middlewares for lifting off the weight of $GLOBALS['TSFE']
      as Site Handling already introduced a lot of functionality
      which can now be utilized further.
      
      For this reason, the Frontend Rendering chain has
      been adapted.
      
      * If there is a "Site" + "Language" resolved, this information can
      be used directly, as there are no dependencies currently.
      
      * Frontend + Backend User Authentication works regardless
      of TSFE, Frontend User is added to the Request object as
      attribute to be added to TSFE later-on.
      
      * Resolving the Page ("slug") and mapping them to Page
      Arguments (URL parts + GET parameters) as well as validation
      against cHash is fully decoupled from TSFE.
      
      After that, TSFE is instantiated, which now gets all resolved
      objects injected.
      
      TSFE now only resolves the rootline against the proper permissions
      (auth) and validates the final page. Once done, TypoScript is
      compiled / cached.
      
      TSFE still contains the rootline, TypoScript, and the information
      about which non-cacheables are there.
      
      RequestHandler creates or fetches cached content, but currently piped
      through TSFE. This should be simplified further later-on.
      
      Resolves: #88717
      Releases: master
      Change-Id: I12807455fd8b01493b2da45cf73a5c532b108cbe
      Reviewed-on: https://review.typo3.org/c/Packages/TYPO3.CMS/+/61155
      
      
      Tested-by: default avatarTYPO3com <noreply@typo3.com>
      Tested-by: default avatarAnja Leichsenring <aleichsenring@ab-softlab.de>
      Tested-by: default avatarAndreas Fernandez <a.fernandez@scripting-base.de>
      Reviewed-by: default avatarAnja Leichsenring <aleichsenring@ab-softlab.de>
      Reviewed-by: default avatarAndreas Fernandez <a.fernandez@scripting-base.de>
      e50b1c1a
  21. Jun 05, 2019
  22. May 24, 2019
  23. Feb 07, 2019
  24. Dec 20, 2018
    • Benni Mack's avatar
      [!!!][TASK] Remove deprecated code related to TSFE · 09632eef
      Benni Mack authored
      The following code related to TSFE has been removed:
      
      PHP classes:
      * TYPO3\CMS\Core\PageTitle\AltPageTitleProvider
      * TYPO3\CMS\Frontend\Page\ExternalPageUrlHandler
      * TYPO3\CMS\Frontend\Page\PageGenerator
      * TYPO3\CMS\Frontend\Page\EidUtility
      
      PHP interfaces:
      * TYPO3\CMS\Frontend\Http\UrlHandlerInterface
      
      Methods that have been marked as protected
      * tempPageCacheContent()
      * realPageCacheContent()
      * setPageCacheContent()
      * clearPageCacheContent_pidList()
      * setSysLastChanged()
      * contentStrReplace()
      
      Dropped TSFE methods
      * mergingWithGetVars()
      * connectToDB()
      * initFEuser()
      * checkAlternativeIdMethods()
      * initializeBackendUser()
      * getPageShortcut()
      * pageUnavailableAndExit()
      * pageNotFoundAndExit()
      * checkPageUnavailableHandler()
      * pageUnavailableHandler()
      * pageNotFoundHandler()
      * pageErrorHandler()
      * makeCacheHash()
      * initTemplate()
      * handleDataSubmission()
      * initializeRedirectUrlHandlers()
      * redirectToExternalUrl()
      * checkPageForMountpointRedirect()
      * checkPageForShortcutRedirect()
      * redirectToCurrentPage()
      * processOutput()
      * sendCacheHeaders()
      * sendHttpHeadersDirectly()
      * storeSessionData()
      * previewInfo()
      * hook_eofe()
      * addTempContentHttpHeaders()
      * setCSS()
      * getUniqueId()
      * readLLfile()
      * getLLL()
      * initLLvars()
      * convPOSTCharset()
      * convertCharsetRecursivelyToUtf8()
      * domainNameMatchesCurrentRequest()
      * getDomainDataForPid()
      * getDomainNameForPid()
      
      Dropped TSFE properties
      * activeUrlHandlers
      * page_cache_reg1
      * siteScript
      * loginUser
      * gr_list
      * beUserLogin
      * workspacePreview
      * ADMCMD_preview_BEUSER_uid
      * showHiddenPage
      * showHiddenRecords
      * debug
      * MP_defaults
      * sys_language_uid
      * sys_language_mode
      * sys_language_content
      * sys_language_contentOL
      * altPageTitle
      * lang
      
      TSFE Properties now marked as protected
      * loginAllowedInBranch
      * loginAllowedInBranch_mode
      * cacheTimeOutDefault
      * cacheContentFlag
      * cacheExpires
      * isClientCachable
      * no_cacheBeforePageGen
      * tempContent
      * pagesTSconfig
      * pageCacheTags
      * uniqueCounter
      * uniqueString
      * pageAccessFailureHistory
      
      TSFE Method Signature changes
      * calculateLinkVars now 1st parameter is required
      * preparePageContentGeneration now 1st parameter is required
      4th Parameter of TSFE->__construct() now unused
      
      Removed TypoScript
      * config.typolinkCheckRootline
      * config.titleTagFunction
      * config.USERUID_substToken
      * config.USERNAME_substToken
      
      Hooks
      $GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS']['tslib/class.tslib_fe.php']['tslib_fe-PostProc']
      
      Database fields:
      * index_phash.data_page_reg1
      
      Resolves: #87235
      Releases: master
      Change-Id: Id95bb0ccb30852fd115fb9da7754fa2e64374a41
      Reviewed-on: https://review.typo3.org/59226
      
      
      Tested-by: default avatarTYPO3com <no-reply@typo3.com>
      Reviewed-by: default avatarGeorg Ringer <georg.ringer@gmail.com>
      Tested-by: default avatarGeorg Ringer <georg.ringer@gmail.com>
      Reviewed-by: default avatarAnja Leichsenring <aleichsenring@ab-softlab.de>
      Tested-by: default avatarAnja Leichsenring <aleichsenring@ab-softlab.de>
      09632eef
  25. Dec 19, 2018
    • Benni Mack's avatar
      [!!!][TASK] Remove deprecated frontend-related hooks and include scripts · 4ea922d0
      Benni Mack authored
      The following hooks have been removed:
      - $GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS']['tslib/index_ts.php']['preBeUser']
      - $GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS']['tslib/class.tslib_fe.php']['checkAlternativeIdMethods-PostProc']
      - $GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS']['tslib/class.tslib_fe.php']['checkDataSubmission']
      - $GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS']['tslib/index_ts.php']['preprocessRequest']
      - $GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS']['tslib/class.tslib_fe.php']['connectToDB']
      - $GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS']['tslib/class.tslib_fe.php']['hook_previewInfo']
      
      The class EidRequestHandler has been removed.
      
      eID targets cannot include a scriptpath anymore:
      - $GLOBALS['TYPO3_CONF_VARS']['FE']['eID_include']['my_eID'] = 'EXT:benni/Scripts/download.php';
      
      Instead, they must contain a target (callable, class/method, function).
      
      The various hooks are still in place in deprecated methods within TSFE which will be removed
      in the next patch. Also, now hardly usable PSR-15 middlewares will be cleaned up separately
      as well.
      
      Resolves: #87220
      Releases: master
      Change-Id: Ic54af83c97f2e6d2fba4346e382240d0fac6a2dc
      Reviewed-on: https://review.typo3.org/59217
      
      
      Reviewed-by: default avatarBenjamin Franzke <bfr@qbus.de>
      Tested-by: default avatarBenjamin Franzke <bfr@qbus.de>
      Reviewed-by: default avatarChristian Kuhn <lolli@schwarzbu.ch>
      Tested-by: default avatarChristian Kuhn <lolli@schwarzbu.ch>
      Reviewed-by: default avatarWouter Wolters <typo3@wouterwolters.nl>
      Tested-by: default avatarWouter Wolters <typo3@wouterwolters.nl>
      4ea922d0
  26. Sep 30, 2018
  27. Sep 29, 2018
    • Benni Mack's avatar
      [FEATURE] Introduce RouteEnhancers for Page-based Routing · 4844fae6
      Benni Mack authored
      Page-based routing can now be configured within a site
      configuration to add so-called "route enhancers" which
      allow to add more placeholders to a route for a page.
      
      There are three Enhancers that TYPO3 now ships with:
      - SimpleEnhancer
      - PluginEnhancer
      - ExtbasePluginEnhancer
      
      It is also possible to add custom enhancers by third-
      party extensions.
      
      Each placeholder within an enhancer can receive a
      so-called "Aspect", usually used for mapping speaking
      values instead of IDs, or month-names in an archive
      link, and "modifiers" to modify a placeholder.
      
      The simple enhancer transfers a link parameter,
      previously maybe used to add a `&product=123`,
      which will now result into `/product/123` for a
      page. PluginEnhancer adds a namespace, common
      for simple plugins or Pi-Based plugins, and
      the ExtbasePluginEnhancer adds logic for multiple
      route variants to be added, depending on the
      controller/action combinations.
      
      Aspects are processors / modifiers / mappers to
      transfer a placeholder value back & forth to
      make each placeholder value more "speaking".
      
      TYPO3 Core ships with the following aspects:
      * LocaleModifier (for localized path segments)
      * StaticValueMapper (for path segments with a static list)
      * StaticRangeMapper (for pagination)
      * PersistedAliasMapper (for slug fields)
      * PersistedPatternMapper (for database records without slug fields)
      
      Routing now returns a so-called "PageArguments" object
      which is then used for evaluating site-based URL
      handling and the cHash calculation.
      
      It is highly discouraged to access _GET or _POST
      variables within any kind of code now, instead
      the PSR-7 request object should be used as much
      as possible.
      
      Releases: master
      Resolves: #86365
      Change-Id: I77e001a5790f1ab3bce75695ef0e1615411e2bd9
      Reviewed-on: https://review.typo3.org/58384
      
      
      Tested-by: default avatarTYPO3com <no-reply@typo3.com>
      Reviewed-by: default avatarSusanne Moog <susanne.moog@typo3.org>
      Tested-by: default avatarSusanne Moog <susanne.moog@typo3.org>
      Reviewed-by: default avatarOliver Hader <oliver.hader@typo3.org>
      Tested-by: default avatarOliver Hader <oliver.hader@typo3.org>
      4844fae6
  28. Sep 17, 2018
  29. Sep 13, 2018
  30. Jul 27, 2018
  31. May 31, 2018
  32. May 11, 2018
    • Benni Mack's avatar
      [TASK] Deprecate various TSFE methods · 0235c136
      Benni Mack authored
      A lot of functionality has been migrated from
      TypoScriptFrontendController into middlewares
      - functionality that has now no direct influence
      in the so-called controller of the frontend (TSFE)
      anymore. The respective methods are never called
      anymore from TYPO3 Core, and extensions that
      bootstrap their own frontend should ensure that
      the respective Middlewares are boot up and called,
      e.g. via custom stacks or just by setting up
      the "frontend" middleware stack.
      
      The following methods are now deprecated:
      - connectToDB()
      - checkAlternativeIdMethods()
      - initializeBackendUser()
      - handleDataSubmission()
      - setCSS()
      - convPOSTCharset()
      
      Additionally, there are some methods in TSFE
      which have been marked as "internal" but had the
      PHP visibility "public", which were now
      migrated to "protected".
      
      - getPageAndRootline()
      - checkRootlineForIncludeSection()
      - setSysPageWhereClause()
      - checkAndSetAlias()
      - getHash()
      - getLockHash()
      - setUrlIdToken()
      
      Resolves: #84965
      Releases: master
      Change-Id: Ia8e29268189179061c09a204bb7275d231fea0dc
      Reviewed-on: https://review.typo3.org/56916
      
      
      Tested-by: default avatarTYPO3com <no-reply@typo3.com>
      Reviewed-by: default avatarCristian Buja <cristian.buja@intera.it>
      Tested-by: default avatarCristian Buja <cristian.buja@intera.it>
      Reviewed-by: default avatarSusanne Moog <susanne.moog@typo3.org>
      Tested-by: default avatarSusanne Moog <susanne.moog@typo3.org>
      0235c136
  33. May 10, 2018
  34. May 09, 2018
  35. May 04, 2018