[TASK] Enable default jQuery noConflict mode in page renderer
authorHelmut Hummel <helmut.hummel@typo3.org>
Sat, 7 Jul 2012 19:36:48 +0000 (21:36 +0200)
committerSteffen Ritter <info@rs-websystems.de>
Sun, 8 Jul 2012 08:30:52 +0000 (10:30 +0200)
If jQuery is included with TypoScript, it is not possible to enable
it with the default jQuery noConflict mode to just register "jQuery"
as a global variable.

Improve the page renderer to allow setting a custom namespace or to use
the default jQuery noConflict mode.

Change-Id: I83d427ed02505f4be30248234c605de901501f89
Resolves: #38737
Releases: 6.0
Reviewed-on: http://review.typo3.org/12699
Reviewed-by: Philipp Gampe
Tested-by: Philipp Gampe
Reviewed-by: Steffen Ritter
Tested-by: Steffen Ritter
t3lib/class.t3lib_pagerenderer.php
tests/Unit/t3lib/class.t3lib_pagerendererTest.php
typo3/sysext/cms/tslib/class.tslib_pagegen.php

index 8a412c7..c3537f3 100644 (file)
@@ -49,6 +49,11 @@ class t3lib_PageRenderer implements t3lib_Singleton {
                // jQuery Core version that is shipped with TYPO3
        const JQUERY_VERSION_LATEST = '1.8b1';
 
+               // jQuery namespace options
+       const JQUERY_NAMESPACE_NONE = 'none';
+       const JQUERY_NAMESPACE_DEFAULT = 'jQuery';
+       const JQUERY_NAMESPACE_DEFAULT_NOCONFLICT = 'defaultNoConflict';
+
        /**
         * @var boolean
         */
@@ -1495,11 +1500,11 @@ class t3lib_PageRenderer implements t3lib_Singleton {
         *
         * @param null|string $version The jQuery version that should be included, either "latest" or any available version
         * @param null|string $source The location of the jQuery source, can be "local", "google", "msn", "jquery" or just an URL to your jQuery lib
-        * @param null|string $namespace The namespace in which the jQuery object of the specific version should be stored. Can be FALSE to disable jQuery no conflict mode.
+        * @param string $namespace The namespace in which the jQuery object of the specific version should be stored.
         * @return void
         * @throws UnexpectedValueException
         */
-       public function loadJquery($version = NULL, $source = NULL, $namespace = NULL) {
+       public function loadJquery($version = NULL, $source = NULL, $namespace = self::JQUERY_NAMESPACE_DEFAULT) {
                        // Set it to the version that is shipped with the TYPO3 core
                if ($version === NULL || $version === 'latest') {
                        $version = self::JQUERY_VERSION_LATEST;
@@ -1510,12 +1515,6 @@ class t3lib_PageRenderer implements t3lib_Singleton {
                        $source = 'local';
                }
 
-               if ($namespace === NULL) {
-                       $namespace = 'jQuery';
-               } elseif ($namespace === FALSE) {
-                       $namespace = 'FALSE';
-               }
-
                if ($source === 'local' && !in_array($version, $this->availableLocalJqueryVersions)) {
                        throw new UnexpectedValueException('The requested jQuery version is not available in the local filesystem.', 1341505305);
                }
@@ -2136,10 +2135,21 @@ class t3lib_PageRenderer implements t3lib_Singleton {
                $scriptTag = '<script src="' . htmlspecialchars($jQueryFileName) . '" type="text/javascript"></script>' . LF;
 
                        // Set the noConflict mode to be available via "TYPO3.jQuery" in all installations
-               if ($namespace !== 'FALSE') {
-                       $scriptTag .= t3lib_div::wrapJS(
-                               'var TYPO3 = TYPO3 || {}; TYPO3.' . $namespace . ' = jQuery = jQuery.noConflict(true);'
-                       );
+
+               switch ($namespace) {
+                       case self::JQUERY_NAMESPACE_DEFAULT_NOCONFLICT:
+                               $scriptTag .= t3lib_div::wrapJS(
+                                       'jQuery.noConflict();'
+                               );
+                               break;
+                       case self::JQUERY_NAMESPACE_NONE:
+                               break;
+                       case self::JQUERY_NAMESPACE_DEFAULT:
+                       default:
+                               $scriptTag .= t3lib_div::wrapJS(
+                                       'var TYPO3 = TYPO3 || {}; TYPO3.' . $namespace . ' = jQuery.noConflict(true);'
+                               );
+                               break;
                }
 
                return $scriptTag;
index db3a26a..998f7fd 100644 (file)
@@ -546,7 +546,7 @@ class t3lib_PageRendererTest extends tx_phpunit_testcase {
        public function loadJqueryLoadsTheLatestJqueryMinifiedVersionInNoConflictMode() {
                $expectedRegExp =
                        '#<script src="contrib/jquery/jquery-' . t3lib_PageRenderer::JQUERY_VERSION_LATEST . '\.min\.(js|\d+\.js|js\?\d+)" type="text/javascript"></script>#';
-               $expectedStatement = 'var TYPO3 = TYPO3 || {}; TYPO3.jQuery = jQuery = jQuery.noConflict(true);';
+               $expectedStatement = 'var TYPO3 = TYPO3 || {}; TYPO3.jQuery = jQuery.noConflict(true);';
 
                $this->fixture->loadJquery();
                $out = $this->fixture->render();
@@ -569,7 +569,7 @@ class t3lib_PageRendererTest extends tx_phpunit_testcase {
        public function loadJqueryRespectsGivenNamespace() {
                $expectedRegExp =
                        '#<script src="contrib/jquery/jquery-' . t3lib_PageRenderer::JQUERY_VERSION_LATEST . '\.min\.(js|\d+\.js|js\?\d+)" type="text/javascript"></script>#';
-               $expectedStatement = 'var TYPO3 = TYPO3 || {}; TYPO3.MyNameSpace = jQuery = jQuery.noConflict(true);';
+               $expectedStatement = 'var TYPO3 = TYPO3 || {}; TYPO3.MyNameSpace = jQuery.noConflict(true);';
 
                $this->fixture->loadJquery(NULL, NULL, 'MyNameSpace');
                $out = $this->fixture->render();
@@ -589,11 +589,12 @@ class t3lib_PageRendererTest extends tx_phpunit_testcase {
         * test load jQuery
         * @test
         */
-       public function loadJqueryWithNamespaceFalseDoesNotIncludeNoConflictHandling() {
+       public function loadJqueryWithDefaultNoConflictModeDoesNotSetNamespace() {
                $expectedRegExp =
                        '#<script src="contrib/jquery/jquery-' . t3lib_PageRenderer::JQUERY_VERSION_LATEST . '\.min\.(js|\d+\.js|js\?\d+)" type="text/javascript"></script>#';
+               $expectedStatement = 'jQuery.noConflict();';
 
-               $this->fixture->loadJquery(NULL, NULL, FALSE);
+               $this->fixture->loadJquery(NULL, NULL, t3lib_PageRenderer::JQUERY_NAMESPACE_DEFAULT_NOCONFLICT);
                $out = $this->fixture->render();
 
                $this->assertRegExp(
@@ -601,7 +602,31 @@ class t3lib_PageRendererTest extends tx_phpunit_testcase {
                        $out
                );
 
-               $this->assertNotContains('jQuery.noConflict(true);', $out);
+               $this->assertContains(
+                       $expectedStatement,
+                       $out
+               );
+
+               $this->assertNotContains('var TYPO3 = TYPO3 || {}; TYPO3.', $out);
+       }
+
+       /**
+        * test load jQuery
+        * @test
+        */
+       public function loadJqueryWithNamespaceNoneDoesNotIncludeNoConflictHandling() {
+               $expectedRegExp =
+                       '#<script src="contrib/jquery/jquery-' . t3lib_PageRenderer::JQUERY_VERSION_LATEST . '\.min\.(js|\d+\.js|js\?\d+)" type="text/javascript"></script>#';
+
+               $this->fixture->loadJquery(NULL, NULL, t3lib_PageRenderer::JQUERY_NAMESPACE_NONE);
+               $out = $this->fixture->render();
+
+               $this->assertRegExp(
+                       $expectedRegExp,
+                       $out
+               );
+
+               $this->assertNotContains('jQuery.noConflict', $out);
        }
 
        /**
@@ -611,7 +636,7 @@ class t3lib_PageRendererTest extends tx_phpunit_testcase {
        public function loadJqueryLoadsTheLatestJqueryVersionInNoConflictModeUncompressedInDebugMode() {
                $expectedRegExp =
                        '#<script src="contrib/jquery/jquery-' . t3lib_PageRenderer::JQUERY_VERSION_LATEST . '\.(js|\d+\.js|js\?\d+)" type="text/javascript"></script>#';
-               $expectedStatement = 'var TYPO3 = TYPO3 || {}; TYPO3.jQuery = jQuery = jQuery.noConflict(true);';
+               $expectedStatement = 'var TYPO3 = TYPO3 || {}; TYPO3.jQuery = jQuery.noConflict(true);';
 
                $this->fixture->loadJquery();
                $this->fixture->enableDebugMode();
index 804eee3..b925ac1 100644 (file)
@@ -626,13 +626,13 @@ class TSpagegen {
                                        // Check if version / source is set, if not set variable to "NULL" to use the default of the page renderer
                                $version = isset($jQueryTS['version']) ? $jQueryTS['version'] : NULL;
                                $source = isset($jQueryTS['source']) ? $jQueryTS['source'] : NULL;
-                                       // When "noConflict" is not set or "1" use the default namespace of the page renderer, otherwise disable the namespace
+                                       // When "noConflict" is not set or "1" enable the default jQuery noConflict mode, otherwise disable the namespace
                                if (!isset($jQueryTS['noConflict']) || !empty($jQueryTS['noConflict'])) {
                                                // Set namespace to the "noConflict.namespace" value if "noConflict.namespace" has a value
                                        if (!empty($jQueryTS['noConflict.']['namespace'])) {
                                                $namespace = $jQueryTS['noConflict.']['namespace'];
                                        } else {
-                                               $namespace = NULL;
+                                               $namespace = t3lib_PageRenderer::JQUERY_NAMESPACE_DEFAULT_NOCONFLICT;
                                        }
                                } else {
                                        $namespace = FALSE;