[FEATURE] Allow .ts file extension for static typoscript templates
[Packages/TYPO3.CMS.git] / t3lib / class.t3lib_div.php
index 7a38913..c42ccf2 100644 (file)
@@ -41,7 +41,7 @@
  * @package TYPO3
  * @subpackage t3lib
  */
-final class t3lib_div {
+class t3lib_div {
 
                // Severity constants used by t3lib_div::sysLog()
        const SYSLOG_SEVERITY_INFO = 0;
@@ -776,7 +776,7 @@ final class t3lib_div {
         *
         * @param string $verNumberStr Version number on format x.x.x
         * @return integer Integer version of version number (where each part can count to 999)
-        * @deprecated since TYPO3 4.6, will be removed in TYPO3 4.9 - Use t3lib_utility_VersionNumber::convertVersionNumberToInteger() instead
+        * @deprecated since TYPO3 4.6, will be removed in TYPO3 6.1 - Use t3lib_utility_VersionNumber::convertVersionNumberToInteger() instead
         */
        public static function int_from_ver($verNumberStr) {
                        // Deprecation log is activated only for TYPO3 4.7 and above
@@ -2415,15 +2415,27 @@ final class t3lib_div {
         * @return string Minified script or source string if error happened
         */
        public static function minifyJavaScript($script, &$error = '') {
-               require_once(PATH_typo3 . 'contrib/jsmin/jsmin.php');
-               try {
-                       $error = '';
-                       $script = trim(JSMin::minify(str_replace(CR, '', $script)));
-               }
-               catch (JSMinException $e) {
-                       $error = 'Error while minifying JavaScript: ' . $e->getMessage();
-                       self::devLog($error, 't3lib_div', 2,
-                               array('JavaScript' => $script, 'Stack trace' => $e->getTrace()));
+               if (is_array($GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS']['t3lib/class.t3lib_div.php']['minifyJavaScript'])) {
+                       $fakeThis = FALSE;
+                       foreach ($GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS']['t3lib/class.t3lib_div.php']['minifyJavaScript'] as $hookMethod) {
+                               try {
+                                       $parameters = array('script' => $script);
+                                       $script = static::callUserFunction($hookMethod, $parameters, $fakeThis);
+                               } catch (Exception $e) {
+                                       $errorMessage = 'Error minifying java script: ' . $e->getMessage();
+                                       $error .= $errorMessage;
+                                       static::devLog(
+                                               $errorMessage,
+                                               't3lib_div',
+                                               2,
+                                               array(
+                                                       'JavaScript' => $script,
+                                                       'Stack trace' => $e->getTrace(),
+                                                       'hook' => $hookMethod
+                                               )
+                                       );
+                               }
+                       }
                }
                return $script;
        }
@@ -2843,7 +2855,7 @@ final class t3lib_div {
 
                        $result = @mkdir($fullDirectoryPath, $permissionMask, TRUE);
                        if (!$result) {
-                               throw new \RuntimeException('Could not create directory!', 1170251400);
+                               throw new \RuntimeException('Could not create directory "' . $fullDirectoryPath . '"!', 1170251400);
                        }
                }
                return $firstCreatedPath;
@@ -3942,7 +3954,7 @@ final class t3lib_div {
         * @param string $addQueryParams Query-parameters: "&xxx=yyy&zzz=uuu"
         * @return array Array with key/value pairs of query-parameters WITHOUT a certain list of variable names (like id, type, no_cache etc.) and WITH a variable, encryptionKey, specific for this server/installation
         * @see tslib_fe::makeCacheHash(), tslib_cObj::typoLink(), t3lib_div::calculateCHash()
-        * @deprecated since TYPO3 4.7 - will be removed in TYPO3 4.9 - use t3lib_cacheHash instead
+        * @deprecated since TYPO3 4.7 - will be removed in TYPO3 6.1 - use t3lib_cacheHash instead
         */
        public static function cHashParams($addQueryParams) {
                self::logDeprecatedFunction();
@@ -3991,7 +4003,7 @@ final class t3lib_div {
         *
         * @param array $params Array of key-value pairs
         * @return string Hash of all the values
-        * @deprecated since TYPO3 4.7 - will be removed in TYPO3 4.9 - use t3lib_cacheHash instead
+        * @deprecated since TYPO3 4.7 - will be removed in TYPO3 6.1 - use t3lib_cacheHash instead
         */
        public static function calculateCHash($params) {
                self::logDeprecatedFunction();
@@ -4200,17 +4212,22 @@ final class t3lib_div {
         * Calls a user-defined function/method in class
         * Such a function/method should look like this: "function proc(&$params, &$ref) {...}"
         *
-        * @param string $funcName Function/Method reference, '[file-reference":"]["&"]class/function["->"method-name]'. You can prefix this reference with "[file-reference]:" and t3lib_div::getFileAbsFileName() will then be used to resolve the filename and subsequently include it by "require_once()" which means you don't have to worry about including the class file either! Example: "EXT:realurl/class.tx_realurl.php:&tx_realurl->encodeSpURL". Finally; you can prefix the class name with "&" if you want to reuse a former instance of the same object call ("singleton").
+        * @param string $funcName Function/Method reference or Closure, '[file-reference":"]["&"]class/function["->"method-name]'. You can prefix this reference with "[file-reference]:" and t3lib_div::getFileAbsFileName() will then be used to resolve the filename and subsequently include it by "require_once()" which means you don't have to worry about including the class file either! Example: "EXT:realurl/class.tx_realurl.php:&tx_realurl->encodeSpURL". Finally; you can prefix the class name with "&" if you want to reuse a former instance of the same object call ("singleton").
         * @param mixed $params Parameters to be pass along (typically an array) (REFERENCE!)
         * @param mixed $ref Reference to be passed along (typically "$this" - being a reference to the calling object) (REFERENCE!)
-        * @param string $checkPrefix Alternative allowed prefix of class or function name
+        * @param string $checkPrefix Not used anymore since 6.0
         * @param integer $errorMode Error mode (when class/function could not be found): 0 - call debug(), 1 - do nothing, 2 - raise an exception (allows to call a user function that may return FALSE)
         * @return mixed Content from method/function call or FALSE if the class/method/function was not found
         * @see getUserObj()
         */
-       public static function callUserFunction($funcName, &$params, &$ref, $checkPrefix = 'user_', $errorMode = 0) {
+       public static function callUserFunction($funcName, &$params, &$ref, $checkPrefix = '', $errorMode = 0) {
                $content = FALSE;
 
+                       // Check if we're using a closure and invoke it directly.
+               if (is_object($funcName) && is_a($funcName, 'Closure')) {
+                       return call_user_func_array($funcName, array(&$params, &$ref));
+               }
+
                        // Check persistent object and if found, call directly and exit.
                if (is_array($GLOBALS['T3_VAR']['callUserFunction'][$funcName])) {
                        return call_user_func_array(
@@ -4239,17 +4256,6 @@ final class t3lib_div {
                        $storePersistentObject = FALSE;
                }
 
-                       // Check prefix is valid:
-               if ($checkPrefix && !self::hasValidClassPrefix($funcRef, array($checkPrefix))) {
-                       $errorMsg = 'Function/class \'' . $funcRef . '\' was not prepended with \'' . $checkPrefix . '\'';
-                       if ($errorMode == 2) {
-                               throw new InvalidArgumentException($errorMsg, 1294585864);
-                       } elseif (!$errorMode) {
-                               debug($errorMsg, 't3lib_div::callUserFunction');
-                       }
-                       return FALSE;
-               }
-
                        // Call function or method:
                $parts = explode('->', $funcRef);
                if (count($parts) == 2) { // Class
@@ -4314,15 +4320,19 @@ final class t3lib_div {
 
        /**
         * Creates and returns reference to a user defined object.
-        * This function can return an object reference if you like. Just prefix the function call with "&": "$objRef = &t3lib_div::getUserObj('EXT:myext/class.tx_myext_myclass.php:&tx_myext_myclass');". This will work ONLY if you prefix the class name with "&" as well. See description of function arguments.
+        * This function can return an object reference if you like.
+        * Just prefix the function call with "&": "$objRef = &t3lib_div::getUserObj('EXT:myext/class.tx_myext_myclass.php:&tx_myext_myclass');".
+        * This will work ONLY if you prefix the class name with "&" as well. See description of function arguments.
+        *
+        * @TODO: Deprecate the whole method in several steps: 1. Deprecated singleton pattern, 2. Deprecate file prefix/ require file, 3. Deprecate usage without valid class name. The last step should be to deprecate the method itslef.
         *
         * @param string $classRef Class reference, '[file-reference":"]["&"]class-name'. You can prefix the class name with "[file-reference]:" and t3lib_div::getFileAbsFileName() will then be used to resolve the filename and subsequently include it by "require_once()" which means you don't have to worry about including the class file either! Example: "EXT:realurl/class.tx_realurl.php:&tx_realurl". Finally; for the class name you can prefix it with "&" and you will reuse the previous instance of the object identified by the full reference string (meaning; if you ask for the same $classRef later in another place in the code you will get a reference to the first created one!).
-        * @param string $checkPrefix Required prefix of class name. By default "tx_" and "Tx_" are allowed.
-        * @param boolean $silent If set, no debug() error message is shown if class/function is not present.
+        * @param string $checkPrefix Not used anymore since 6.0
+        * @param boolean $silent Not used anymore since 6.0
         * @return object The instance of the class asked for. Instance is created with t3lib_div::makeInstance
         * @see callUserFunction()
         */
-       public static function getUserObj($classRef, $checkPrefix = 'user_', $silent = FALSE) {
+       public static function getUserObj($classRef, $checkPrefix = '', $silent = FALSE) {
                        // Check persistent object and if found, call directly and exit.
                if (is_object($GLOBALS['T3_VAR']['getUserObj'][$classRef])) {
                        return $GLOBALS['T3_VAR']['getUserObj'][$classRef];
@@ -4347,14 +4357,6 @@ final class t3lib_div {
                                $storePersistentObject = FALSE;
                        }
 
-                               // Check prefix is valid:
-                       if ($checkPrefix && !self::hasValidClassPrefix($class, array($checkPrefix))) {
-                               if (!$silent) {
-                                       debug("Class '" . $class . "' was not prepended with '" . $checkPrefix . "'", 't3lib_div::getUserObj');
-                               }
-                               return FALSE;
-                       }
-
                                // Check if class exists:
                        if (class_exists($class)) {
                                $classObj = self::makeInstance($class);
@@ -4365,10 +4367,6 @@ final class t3lib_div {
                                }
 
                                return $classObj;
-                       } else {
-                               if (!$silent) {
-                                       debug('<strong>ERROR:</strong> No class named: ' . $class, 't3lib_div::getUserObj');
-                               }
                        }
                }
        }
@@ -4379,47 +4377,22 @@ final class t3lib_div {
         * @param string $classRef The class or function to check
         * @param array $additionalPrefixes Additional allowed prefixes, mostly this will be user_
         * @return bool TRUE if name is allowed
+        * @deprecated since 6.0, will be removed two versions later
         */
        public static function hasValidClassPrefix($classRef, array $additionalPrefixes = array()) {
-               if (empty($classRef)) {
-                       return FALSE;
-               }
-               if (!is_string($classRef)) {
-                       throw new InvalidArgumentException('$classRef has to be of type string', 1313917992);
-               }
-               $hasValidPrefix = FALSE;
-               $validPrefixes = self::getValidClassPrefixes();
-               $classRef = trim($classRef);
-
-               if (count($additionalPrefixes)) {
-                       $validPrefixes = array_merge($validPrefixes, $additionalPrefixes);
-               }
-               foreach ($validPrefixes as $prefixToCheck) {
-                       if (self::isFirstPartOfStr($classRef, $prefixToCheck) || $prefixToCheck === '') {
-                               $hasValidPrefix = TRUE;
-                               break;
-                       }
-               }
-
-               return $hasValidPrefix;
+               self::logDeprecatedFunction();
+               return TRUE;
        }
 
        /**
         * Returns all valid class prefixes.
         *
         * @return array Array of valid prefixed of class names
+        * @deprecated since 6.0, will be removed two versions later
         */
        public static function getValidClassPrefixes() {
-               $validPrefixes = array('tx_', 'Tx_', 'user_', 'User_', 't3lib_');
-               if (
-                       isset($GLOBALS['TYPO3_CONF_VARS']['SYS']['additionalAllowedClassPrefixes'])
-                       && is_string($GLOBALS['TYPO3_CONF_VARS']['SYS']['additionalAllowedClassPrefixes'])
-               ) {
-                       $validPrefixes = array_merge(
-                               $validPrefixes,
-                               self::trimExplode(',', $GLOBALS['TYPO3_CONF_VARS']['SYS']['additionalAllowedClassPrefixes'])
-                       );
-               }
+               self::logDeprecatedFunction();
+               $validPrefixes = array('tx_', 'Tx_', 'user_', 'User_', 't3lib_', '');
                return $validPrefixes;
        }
 
@@ -5304,25 +5277,15 @@ final class t3lib_div {
        }
 
        /**
-        * Quotes a string for usage as JS parameter. Depends whether the value is
-        * used in script tags (it doesn't need/must not get htmlspecialchar'ed in
-        * this case).
+        * Quotes a string for usage as JS parameter.
         *
         * @param string $value the string to encode, may be empty
-        * @param boolean $withinCData
-        *              whether the escaped data is expected to be used as CDATA and thus
-        *              does not need to be htmlspecialchared
         *
         * @return string the encoded value already quoted (with single quotes),
         *                              will not be empty
         */
-       static public function quoteJSvalue($value, $withinCData = FALSE) {
-               $escapedValue = addcslashes(
-                       $value, '\'' . '"' . '\\' . TAB . LF . CR
-               );
-               if (!$withinCData) {
-                       $escapedValue = htmlspecialchars($escapedValue);
-               }
+       public static function quoteJSvalue($value) {
+               $escapedValue = t3lib_div::makeInstance('t3lib_codec_JavaScriptEncoder')->encode($value);
                return '\'' . $escapedValue . '\'';
        }