[TASK] Make TS content templates more flexible 87/27587/5
authorBenjamin Mack <benni@typo3.org>
Wed, 12 Feb 2014 17:24:57 +0000 (18:24 +0100)
committerStefan Neufeind <typo3.neufeind@speedpartner.de>
Mon, 3 Mar 2014 19:17:12 +0000 (20:17 +0100)
If an extension used static content ID 43 (content default),
it also added itself (during each runtime of ext_localconf.php)
to all available content blocks.
The original way is problematic as an extension that
provides content templates may be included after
an extension that wants to add itself after all content
templates.
This is now more confusing as the package manager
resolves the ordering of extensions and now,
CSS Styled Content gets loaded after felogin and
indexed_search.

To resolve this problem completely, the additional
TypoScript for each "contentRenderingTemplate",
a TS template that provides default content renderings,
is added to one global default TypoScript and is only
merged at the TemplateService class.

Therefore the extension loading ordering does not
matter anymore.

Resolves: #55942
Resolves: #55174
Resolves: #55557
Releases: 6.2
Change-Id: Id0c983bf96a3a76fde2183c57a17066ef8fd4ac8
Reviewed-on: https://review.typo3.org/27587
Reviewed-by: Stefan Neufeind
Tested-by: Stefan Neufeind
typo3/sysext/core/Classes/TypoScript/TemplateService.php
typo3/sysext/core/Classes/Utility/ExtensionManagementUtility.php
typo3/sysext/core/Configuration/DefaultConfiguration.php
typo3/sysext/css_styled_content/ext_localconf.php

index d8bc46e..f88446e 100644 (file)
@@ -856,7 +856,7 @@ class TemplateService {
 
        /**
         * Appends (not prepends) additional TypoScript code to static template records/files as set in TYPO3_CONF_VARS
-        * For records the "uid" value is the integer of the "static_template" record
+        * For DB records the "uid" value is the integer of the "static_template" record.
         * For files the "uid" value is the extension key but with any underscores removed. Possibly with a path if its a static file selected in the template record
         *
         * @param array $subrow Static template record/file
@@ -866,8 +866,15 @@ class TemplateService {
         * @todo Define visibility
         */
        public function prependStaticExtra($subrow) {
-               $subrow['config'] .= $GLOBALS['TYPO3_CONF_VARS']['FE']['defaultTypoScript_setup.'][$subrow['uid']];
-               $subrow['constants'] .= $GLOBALS['TYPO3_CONF_VARS']['FE']['defaultTypoScript_constants.'][$subrow['uid']];
+               // the identifier can be "43" if coming from "static template" extension or a path like "cssstyledcontent/static/"
+               $identifier = $subrow['uid'];
+               $subrow['config'] .= $GLOBALS['TYPO3_CONF_VARS']['FE']['defaultTypoScript_setup.'][$identifier];
+               $subrow['constants'] .= $GLOBALS['TYPO3_CONF_VARS']['FE']['defaultTypoScript_constants.'][$identifier];
+               // if this is a template of type "default content rendering", also see if other extensions have added their TypoScript that should be included after the content definitions
+               if (in_array($identifier, $GLOBALS['TYPO3_CONF_VARS']['FE']['contentRenderingTemplates'], TRUE)) {
+                       $subrow['config'] .= $GLOBALS['TYPO3_CONF_VARS']['FE']['defaultTypoScript_setup.']['defaultContentRendering'];
+                       $subrow['constants'] .= $GLOBALS['TYPO3_CONF_VARS']['FE']['defaultTypoScript_constants.']['defaultContentRendering'];
+               }
                return $subrow;
        }
 
index b048f6a..2d0b70f 100644 (file)
@@ -1369,16 +1369,21 @@ tt_content.' . $key . $prefix . ' {
         * Adds $content to the default TypoScript code for either setup or constants as set in $GLOBALS['TYPO3_CONF_VARS'][FE]['defaultTypoScript_*']
         * (Basically this function can do the same as addTypoScriptSetup and addTypoScriptConstants - just with a little more hazzle, but also with some more options!)
         * FOR USE IN ext_localconf.php FILES
+        * Note: As of TYPO3 CMS 6.2, static template #43 (content: default) was replaced with "defaultContentRendering" which makes it
+        * possible that a first extension like css_styled_content registers a "contentRendering" template (= a template that defines default content rendering TypoScript)
+        * by adding itself to $TYPO3_CONF_VARS[FE][contentRenderingTemplates][] = 'myext/Configuration/TypoScript'.
+        * An extension calling addTypoScript('myext', 'setup', $typoScript, 'defaultContentRendering') will add its TypoScript directly after;
+        * For now, "43" and "defaultContentRendering" can be used, but defaultContentRendering is more descriptive and should be used in the future
         *
         * @param string $key Is the extension key (informative only).
         * @param string $type Is either "setup" or "constants" and obviously determines which kind of TypoScript code we are adding.
-        * @param string $content Is the TS content, prefixed with a [GLOBAL] line and a comment-header.
-        * @param integer $afterStaticUid Is either an integer pointing to a uid of a static_template or a string pointing to the "key" of a static_file template ([reduced extension_key]/[local path]). The points is that the TypoScript you add is included only IF that static template is included (and in that case, right after). So effectively the TypoScript you set can specifically overrule settings from those static templates.
+        * @param string $content Is the TS content, will be prefixed with a [GLOBAL] line and a comment-header.
+        * @param int|string $afterStaticUid Is either an integer pointing to a uid of a static_template or a string pointing to the "key" of a static_file template ([reduced extension_key]/[local path]). The points is that the TypoScript you add is included only IF that static template is included (and in that case, right after). So effectively the TypoScript you set can specifically overrule settings from those static templates.
         *
         * @return void
         */
        static public function addTypoScript($key, $type, $content, $afterStaticUid = 0) {
-               if ($type == 'setup' || $type == 'constants') {
+               if ($type === 'setup' || $type === 'constants') {
                        $content = '
 
 [GLOBAL]
@@ -1389,11 +1394,10 @@ tt_content.' . $key . $prefix . ' {
 ' . $content;
                        if ($afterStaticUid) {
                                $GLOBALS['TYPO3_CONF_VARS']['FE']['defaultTypoScript_' . $type . '.'][$afterStaticUid] .= $content;
-                               // If 'content (default)' is targeted, also add to other 'content rendering templates', eg. css_styled_content
-                               if ($afterStaticUid == 43 && is_array($GLOBALS['TYPO3_CONF_VARS']['FE']['contentRenderingTemplates'])) {
-                                       foreach ($GLOBALS['TYPO3_CONF_VARS']['FE']['contentRenderingTemplates'] as $templateName) {
-                                               $GLOBALS['TYPO3_CONF_VARS']['FE']['defaultTypoScript_' . $type . '.'][$templateName] .= $content;
-                                       }
+                               // If 'content (default)' is targeted (static uid 43),
+                               // the content is added after typoscript of type contentRendering, eg. css_styled_content, see EXT:frontend/TemplateService for that
+                               if ($afterStaticUid == 43 || $afterStaticUid === 'defaultContentRendering') {
+                                       $GLOBALS['TYPO3_CONF_VARS']['FE']['defaultTypoScript_' . $type . '.']['defaultContentRendering'] .= $content;
                                }
                        } else {
                                $GLOBALS['TYPO3_CONF_VARS']['FE']['defaultTypoScript_' . $type] .= $content;
index 235e422..3f5ab3d 100644 (file)
@@ -780,6 +780,7 @@ return array(
                'cHashExcludedParametersIfEmpty' => '',         // Optional: Configure Parameters that are only relevant for the chash if there's an associated value available. And asterisk "*" can be used to skip all empty parameters.
                'workspacePreviewLogoutTemplate' => '',         // If set, points to an HTML file relative to the TYPO3_site root which will be read and outputted as template for this message. Example: fileadmin/templates/template_workspace_preview_logout.html. Inside you can put the marker %1$s to insert the URL to go back to. Use this in &lt;a href="%1$s"&gt;Go back...&lt;/a&gt; links
                'versionNumberInFilename' => 'querystring',             // String: embed,querystring,''. Allows to automatically include a version number (timestamp of the file) to referred CSS and JS filenames on the rendered page. This will make browsers and proxies reload the files if they change (thus avoiding caching issues). Set to 'embed' will have the timestamp embedded in the filename, ie. filename.1269312081.js. IMPORTANT: 'embed' requires extra .htaccess rules to work (please refer to _.htaccess or the _.htaccess file from the dummy package)<p>Set to 'querystring' (default setting) to append the version number as a query parameter (doesn't require mod_rewrite). Set to '' will turn this functionality off (behaves like TYPO3 &lt; v4.4).</p>
+               'contentRenderingTemplates' => array(), // Array to define the TypoScript parts that define the main content rendering. Extensions like "css_styled_content" provide content rendering templates. Other extensions like "felogin" or "indexed search" extend these templates and their TypoScript parts are added directly after the content templates. See EXT:css_styled_content/ext_localconf.php and EXT:frontend/Classes/TypoScript/TemplateService.php
                'XCLASS' => array(),            // See 'Inside TYPO3' document for more information.
        ),
        'MAIL' => array( // Mail configurations to tune how \TYPO3\CMS\Core\Mail\ classes will send their mails.
index c012733..9ae9fca 100755 (executable)
@@ -42,12 +42,11 @@ $GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS']['ext/install']['compat_version']['tx_c
        'version' => 6002000,
        'description' => '<p>lib.stdheader: The &lt;header&gt; tag now only wraps the header if the header element has a date set, else the output is just a straight &lt;hX&gt; tag.</p>',
 );
-// Register ourselves as "content rendering template" (providing the hooks of "static template 43" = content (default) )
-$GLOBALS['TYPO3_CONF_VARS']['FE']['contentRenderingTemplates'] = array(
-       'cssstyledcontent/static/',
-       'cssstyledcontent/static/v6.1/',
-       'cssstyledcontent/static/v6.0/',
-       'cssstyledcontent/static/v4.7/',
-       'cssstyledcontent/static/v4.6/',
-       'cssstyledcontent/static/v4.5/',
-);
+
+// Mark the delivered TypoScript templates as "content rendering template" (providing the hooks of "static template 43" = content (default))
+$GLOBALS['TYPO3_CONF_VARS']['FE']['contentRenderingTemplates'][] = 'cssstyledcontent/static/';
+$GLOBALS['TYPO3_CONF_VARS']['FE']['contentRenderingTemplates'][] = 'cssstyledcontent/static/v6.1/';
+$GLOBALS['TYPO3_CONF_VARS']['FE']['contentRenderingTemplates'][] = 'cssstyledcontent/static/v6.0/';
+$GLOBALS['TYPO3_CONF_VARS']['FE']['contentRenderingTemplates'][] = 'cssstyledcontent/static/v4.7/';
+$GLOBALS['TYPO3_CONF_VARS']['FE']['contentRenderingTemplates'][] = 'cssstyledcontent/static/v4.6/';
+$GLOBALS['TYPO3_CONF_VARS']['FE']['contentRenderingTemplates'][] = 'cssstyledcontent/static/v4.5/';