[BUGFIX] Using datetime field with datepicker the time information gets lost
[Packages/TYPO3.CMS.git] / t3lib / class.t3lib_div.php
index b40639f..c25d124 100644 (file)
@@ -2,7 +2,7 @@
 /***************************************************************
  *  Copyright notice
  *
- *  (c) 1999-2010 Kasper Skårhøj (kasperYYYY@typo3.com)
+ *  (c) 1999-2011 Kasper Skårhøj (kasperYYYY@typo3.com)
  *  All rights reserved
  *
  *  This script is part of the TYPO3 project. The TYPO3 project is
@@ -251,6 +251,13 @@ final class t3lib_div {
         */
        protected static $nonSingletonInstances = array();
 
+       /**
+        * Register for makeInstance with given class name and final class names to reduce number of class_exists() calls
+        *
+        * @var array Given class name => final class name
+        */
+       protected static $finalClassNameRegister = array();
+
        /*************************
         *
         * GET/POST Variables
@@ -3138,13 +3145,19 @@ final class t3lib_div {
        /**
         * Sets the file system mode and group ownership of a file or a folder.
         *
-        * @param   string   Absolute filepath of file or folder, must not be escaped.
+        * @param   string   Path of file or folder, must not be escaped. Path can be absolute or relative
         * @param   boolean  If set, also fixes permissions of files and folders in the folder (if $path is a folder)
         * @return  mixed       TRUE on success, FALSE on error, always TRUE on Windows OS
         */
        public static function fixPermissions($path, $recursive = FALSE) {
                if (TYPO3_OS != 'WIN') {
                        $result = FALSE;
+
+                               // Make path absolute
+                       if (!self::isAbsPath($path)) {
+                               $path = self::getFileAbsFileName($path, FALSE);
+                       }
+
                        if (self::isAllowedAbsPath($path)) {
                                if (@is_file($path)) {
                                                // "@" is there because file is not necessarily OWNED by the user
@@ -3193,7 +3206,7 @@ final class t3lib_div {
         *
         * @param       string          Absolute filepath to write to inside "typo3temp/". First part of this string must match PATH_site."typo3temp/"
         * @param       string          Content string to write
-        * @return      string          Returns false on success, otherwise an error string telling about the problem.
+        * @return      string          Returns NULL on success, otherwise an error string telling about the problem.
         */
        public static function writeFileToTypo3tempDir($filepath, $content) {
 
@@ -3665,6 +3678,9 @@ final class t3lib_div {
         *
         *************************/
 
+       /* Deprecated since 4.5, use t3lib_utility_Debug */
+
+
        /**
         * Returns a string with a list of ascii-values for the first $characters characters in $string
         * Usage: 0
@@ -3672,15 +3688,11 @@ final class t3lib_div {
         * @param       string          String to show ASCII value for
         * @param       integer         Number of characters to show
         * @return      string          The string with ASCII values in separated by a space char.
+        * @deprecated since TYPO3 4.5 - Use t3lib_utility_Debug::ordinalValue instead
         */
        public static function debug_ordvalue($string, $characters = 100) {
-               if (strlen($string) < $characters) {
-                       $characters = strlen($string);
-               }
-               for ($i = 0; $i < $characters; $i++) {
-                       $valuestring .= ' ' . ord(substr($string, $i, 1));
-               }
-               return trim($valuestring);
+               self::logDeprecatedFunction();
+               return t3lib_utility_Debug::ordinalValue($string, $characters);
        }
 
        /**
@@ -3691,49 +3703,11 @@ final class t3lib_div {
         *
         * @param       mixed           Array to view
         * @return      string          HTML output
+        * @deprecated since TYPO3 4.5 - Use t3lib_utility_Debug::viewArray instead
         */
        public static function view_array($array_in) {
-               if (is_array($array_in)) {
-                       $result = '
-                       <table border="1" cellpadding="1" cellspacing="0" bgcolor="white">';
-                       if (count($array_in) == 0) {
-                               $result .= '<tr><td><font face="Verdana,Arial" size="1"><strong>EMPTY!</strong></font></td></tr>';
-                       } else {
-                               foreach ($array_in as $key => $val) {
-                                       $result .= '<tr>
-                                               <td valign="top"><font face="Verdana,Arial" size="1">' . htmlspecialchars((string) $key) . '</font></td>
-                                               <td>';
-                                       if (is_array($val)) {
-                                               $result .= self::view_array($val);
-                                       } elseif (is_object($val)) {
-                                               $string = '';
-                                               if (method_exists($val, '__toString')) {
-                                                       $string .= get_class($val) . ': ' . (string) $val;
-                                               } else {
-                                                       $string .= print_r($val, TRUE);
-                                               }
-                                               $result .= '<font face="Verdana,Arial" size="1" color="red">' . nl2br(htmlspecialchars($string)) . '<br /></font>';
-                                       } else {
-                                               if (gettype($val) == 'object') {
-                                                       $string = 'Unknown object';
-                                               } else {
-                                                       $string = (string) $val;
-                                               }
-                                               $result .= '<font face="Verdana,Arial" size="1" color="red">' . nl2br(htmlspecialchars($string)) . '<br /></font>';
-                                       }
-                                       $result .= '</td>
-                                       </tr>';
-                               }
-                       }
-                       $result .= '</table>';
-               } else {
-                       $result = '<table border="1" cellpadding="1" cellspacing="0" bgcolor="white">
-                               <tr>
-                                       <td><font face="Verdana,Arial" size="1" color="red">' . nl2br(htmlspecialchars((string) $array_in)) . '<br /></font></td>
-                               </tr>
-                       </table>'; // Output it as a string.
-               }
-               return $result;
+               self::logDeprecatedFunction();
+               return t3lib_utility_Debug::viewArray($array_in);
        }
 
        /**
@@ -3743,9 +3717,11 @@ final class t3lib_div {
         * @param       mixed           Array to print visually (in a table).
         * @return      void
         * @see view_array()
+        * @deprecated since TYPO3 4.5 - Use t3lib_utility_Debug::printArray instead
         */
        public static function print_array($array_in) {
-               echo self::view_array($array_in);
+               self::logDeprecatedFunction();
+               t3lib_utility_Debug::printArray($array_in);
        }
 
        /**
@@ -3759,122 +3735,22 @@ final class t3lib_div {
         * @param       string          The header.
         * @param       string          Group for the debug console
         * @return      void
+        * @deprecated since TYPO3 4.5 - Use t3lib_utility_Debug::debug instead
         */
        public static function debug($var = '', $header = '', $group = 'Debug') {
-                       // buffer the output of debug if no buffering started before
-               if (ob_get_level() == 0) {
-                       ob_start();
-               }
-               $debug = '';
-
-               if ($header) {
-                       $debug .= '
-                       <table class="typo3-debug" border="0" cellpadding="0" cellspacing="0" bgcolor="white" style="border:0px; margin-top:3px; margin-bottom:3px;">
-                               <tr>
-                                       <td style="background-color:#bbbbbb; font-family: verdana,arial; font-weight: bold; font-size: 10px;">' .
-                                       htmlspecialchars((string) $header) .
-                                       '</td>
-                               </tr>
-                               <tr>
-                                       <td>';
-               }
-
-               if (is_array($var)) {
-                       $debug .= self::view_array($var);
-               } elseif (is_object($var)) {
-                       $debug .= '<strong>|Object:<pre>';
-                       $debug .= print_r($var, TRUE);
-                       $debug .= '</pre>|</strong>';
-               } elseif ((string) $var !== '') {
-                       $debug .= '<strong>|' . htmlspecialchars((string) $var) . '|</strong>';
-               } else {
-                       $debug .= '<strong>| debug |</strong>';
-               }
-
-               if ($header) {
-                       $debug .= '
-                                       </td>
-                               </tr>
-                       </table>';
-               }
-
-               if (TYPO3_MODE === 'BE') {
-                       $group = htmlspecialchars($group);
-
-                       if ($header !== '') {
-                               $tabHeader = htmlspecialchars($header);
-                       } else {
-                               $tabHeader = 'Debug';
-                       }
-
-                       if (is_object($var)) {
-                               $debug = str_replace(
-                                       array('"', '/', '<', "\n", "\r"),
-                                       array('\"', '\/', '\<', '<br />', ''),
-                                       $debug
-                               );
-                       } else {
-                               $debug = str_replace(
-                                       array('"', '/', '<', "\n", "\r"),
-                                       array('\"', '\/', '\<', '', ''),
-                                       $debug
-                               );
-                       }
-
-                       $script = '
-                               (function debug() {
-                                       var debugMessage = "' . $debug . '";
-                                       var header = "' . $tabHeader . '";
-                                       var group = "' . $group . '";
-
-                                       if (typeof Ext !== "object" && (top && typeof top.Ext !== "object")) {
-                                               document.write(debugMessage);
-                                               return;
-                                       }
-
-                                       if (top && typeof Ext !== "object") {
-                                               Ext = top.Ext;
-                                       }
-
-                                       Ext.onReady(function() {
-                                               var TYPO3ViewportInstance = null;
-
-                                               if (top && top.TYPO3 && typeof top.TYPO3.Backend === "object") {
-                                                       TYPO3ViewportInstance = top.TYPO3.Backend;
-                                               } else if (typeof TYPO3 === "object" && typeof TYPO3.Backend === "object") {
-                                                       TYPO3ViewportInstance = TYPO3.Backend;
-                                               }
-
-                                               if (TYPO3ViewportInstance !== null) {
-                                                       TYPO3ViewportInstance.DebugConsole.addTab(debugMessage, header, group);
-                                               } else {
-                                                       document.write(debugMessage);
-                                               }
-                                       });
-                               })();
-                       ';
-                       echo self::wrapJS($script);
-               } else {
-                       echo $debug;
-               }
+               self::logDeprecatedFunction();
+               t3lib_utility_Debug::debug($var, $header, $group);
        }
 
        /**
         * Displays the "path" of the function call stack in a string, using debug_backtrace
         *
         * @return      string
+        * @deprecated since TYPO3 4.5 - Use t3lib_utility_Debug::debugTrail instead
         */
        public static function debug_trail() {
-               $trail = debug_backtrace();
-               $trail = array_reverse($trail);
-               array_pop($trail);
-
-               $path = array();
-               foreach ($trail as $dat) {
-                       $path[] = $dat['class'] . $dat['type'] . $dat['function'] . '#' . $dat['line'];
-               }
-
-               return implode(' // ', $path);
+               self::logDeprecatedFunction();
+               return t3lib_utility_Debug::debugTrail();
        }
 
        /**
@@ -3884,52 +3760,11 @@ final class t3lib_div {
         * @param       string          Table header
         * @param       boolean         If TRUE, will return content instead of echo'ing out.
         * @return      void            Outputs to browser.
+        * @deprecated since TYPO3 4.5 - Use t3lib_utility_Debug::debugRows instead
         */
        public static function debugRows($rows, $header = '', $returnHTML = FALSE) {
-               if (is_array($rows)) {
-                       reset($rows);
-                       $firstEl = current($rows);
-                       if (is_array($firstEl)) {
-                               $headerColumns = array_keys($firstEl);
-                               $tRows = array();
-
-                                       // Header:
-                               $tRows[] = '<tr><td colspan="' . count($headerColumns) . '" style="background-color:#bbbbbb; font-family: verdana,arial; font-weight: bold; font-size: 10px;"><strong>' . htmlspecialchars($header) . '</strong></td></tr>';
-                               $tCells = array();
-                               foreach ($headerColumns as $key) {
-                                       $tCells[] = '
-                                                       <td><font face="Verdana,Arial" size="1"><strong>' . htmlspecialchars($key) . '</strong></font></td>';
-                               }
-                               $tRows[] = '
-                                               <tr>' . implode('', $tCells) . '
-                                               </tr>';
-
-                                       // Rows:
-                               foreach ($rows as $singleRow) {
-                                       $tCells = array();
-                                       foreach ($headerColumns as $key) {
-                                               $tCells[] = '
-                                                       <td><font face="Verdana,Arial" size="1">' . (is_array($singleRow[$key]) ? self::debugRows($singleRow[$key], '', TRUE) : htmlspecialchars($singleRow[$key])) . '</font></td>';
-                                       }
-                                       $tRows[] = '
-                                               <tr>' . implode('', $tCells) . '
-                                               </tr>';
-                               }
-
-                               $table = '
-                                       <table border="1" cellpadding="1" cellspacing="0" bgcolor="white">' . implode('', $tRows) . '
-                                       </table>';
-                               if ($returnHTML) {
-                                       return $table;
-                               } else {
-                                       echo $table;
-                               }
-                       } else {
-                               debug('Empty array of rows', $header);
-                       }
-               } else {
-                       debug('No array of rows', $header);
-               }
+               self::logDeprecatedFunction();
+               t3lib_utility_Debug::debugRows($rows, $header, $returnHTML);
        }
 
 
@@ -5412,7 +5247,12 @@ final class t3lib_div {
                        throw new InvalidArgumentException('$classname must not be empty.', 1288965219);
                }
 
-               $finalClassName = self::getClassName($className);
+                       // Determine final class name which must be instantiated, this takes XCLASS handling
+                       // into account. Cache in a local array to save some cycles for consecutive calls.
+               if (!isset(self::$finalClassNameRegister[$className])) {
+                       self::$finalClassNameRegister[$className] = self::getClassName($className);
+               }
+               $finalClassName = self::$finalClassNameRegister[$className];
 
                        // Return singleton instance if it is already registered
                if (isset(self::$singletonInstances[$finalClassName])) {
@@ -5468,7 +5308,13 @@ final class t3lib_div {
         * @return      string          Final class name to instantiate with "new [classname]"
         */
        protected function getClassName($className) {
-               return (class_exists($className) && class_exists('ux_' . $className, FALSE) ? self::getClassName('ux_' . $className) : $className);
+               if (class_exists($className)) {
+                       while (class_exists('ux_' . $className, FALSE)) {
+                               $className = 'ux_' . $className;
+                       }
+               }
+
+               return $className;
        }
 
        /**
@@ -5597,7 +5443,7 @@ final class t3lib_div {
                                        if (is_object($obj)) {
                                                if (!@is_callable(array($obj, 'init'))) {
                                                                // use silent logging??? I don't think so.
-                                                       die ('Broken service:' . self::view_array($info));
+                                                       die ('Broken service:' . t3lib_utility_Debug::viewArray($info));
                                                }
                                                $obj->info = $info;
                                                if ($obj->init()) { // service available?
@@ -6020,13 +5866,20 @@ final class t3lib_div {
                                // send message per mail
                        elseif ($type == 'mail') {
                                list($to, $from) = explode('/', $destination);
-                               t3lib_utility_Mail::mail($to, 'Warning - error in TYPO3 installation',
-                                               'Host: ' . $TYPO3_CONF_VARS['SC_OPTIONS']['t3lib/class.t3lib_div.php']['systemLogHost'] . LF .
+                               if (!t3lib_div::validEmail($from)) {
+                                       $from = t3lib_utility_Mail::getSystemFrom();
+                               }
+                               /** @var $mail t3lib_mail_Message */
+                               $mail = t3lib_div::makeInstance('t3lib_mail_Message');
+                               $mail->setTo($to)
+                                               ->setFrom($from)
+                                               ->setSubject('Warning - error in TYPO3 installation')
+                                               ->setBody('Host: ' . $TYPO3_CONF_VARS['SC_OPTIONS']['t3lib/class.t3lib_div.php']['systemLogHost'] . LF .
                                                                'Extension: ' . $extKey . LF .
                                                                'Severity: ' . $severity . LF .
-                                                               LF . $msg,
-                                       ($from ? 'From: ' . $from : '')
+                                                               LF . $msg
                                );
+                               $mail->send();
                        }
                                // use the PHP error log
                        elseif ($type == 'error_log') {
@@ -6105,7 +5958,7 @@ final class t3lib_div {
 
                        // do not use console in login screen
                if (stripos($log, 'console') !== FALSE && isset($GLOBALS['BE_USER']->user['uid'])) {
-                       self::debug($msg, $date, 'Deprecation Log');
+                       t3lib_utility_Debug::debug($msg, $date, 'Deprecation Log');
                }
        }
 
@@ -6155,7 +6008,7 @@ final class t3lib_div {
 
                        // write a longer message to the deprecation log: <function> <annotion> - <trace> (<source>)
                $logMsg = $trail[1]['class'] . $trail[1]['type'] . $trail[1]['function'];
-               $logMsg .= '() - ' . $msg . ' - ' . self::debug_trail();
+               $logMsg .= '() - ' . $msg.' - ' . t3lib_utility_Debug::debugTrail();
                $logMsg .= ' (' . substr($function->getFileName(), strlen(PATH_site)) . '#' . $function->getStartLine() . ')';
                self::deprecationLog($logMsg);
        }