Fixed bug #9318: Enhance and fix tslib_eidtools
authorDmitry Dulepov <dmitry.dulepov@gmail.com>
Sat, 13 Sep 2008 14:40:02 +0000 (14:40 +0000)
committerDmitry Dulepov <dmitry.dulepov@gmail.com>
Sat, 13 Sep 2008 14:40:02 +0000 (14:40 +0000)
git-svn-id: https://svn.typo3.org/TYPO3v4/Core/trunk@4100 709f56b5-9817-0410-a4d7-c38de5d9e867

ChangeLog
NEWS.txt
typo3/sysext/cms/tslib/class.tslib_eidtools.php

index fb4475a..cc10f83 100755 (executable)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,7 @@
+2008-09-13  Dmitry Dulepov  <dmitry@typo3.org>
+
+       * Fixed bug #9318: Enhance and fix tslib_eidtools
+
 2008-09-12  Dmitry Dulepov  <dmitry@typo3.org>
 
        * Fixed bug #8985: Enable USER object to become USER_INT on the fly
index 2beb601..81610d2 100644 (file)
--- a/NEWS.txt
+++ b/NEWS.txt
@@ -68,6 +68,15 @@ Frontend features
                                return '';
                        }
 
+       * Class tslib_eidtools is enhanced with new methods for eID/AJAX applications:
+               public static function initLanguage($language = 'default');
+                       Creates $GLOBALS['LANG'] for the given language
+               public static function initTCA();
+                       Loads 'ctrl' sections for TCA tables from all installed extensions
+               public static function initExtensionTCA($extensionKey);
+                       Similar to initTCA() but loads the table only for the given extension
+               
+
 Backend skin
 ============
 
index b22246b..3bb9441 100644 (file)
 /**
  * [CLASS/FUNCTION INDEX of SCRIPT]
  *
+ *   71: public static function initFeUser()
+ *   98: public static function connectDB()
+ *  117: public static function initLanguage($language = 'default')
+ *  131: public static function initTCA()
+ *  150: public static function initExtensionTCA($extensionKey)
+ *  167: private static function getTSFE()
  *
- *
- *   74: class tslib_eidtools
- *   81:     function initFeUser()
- *  108:     function connectDB()
- *
- * TOTAL FUNCTIONS: 2
+ * TOTAL FUNCTIONS: 6
  * (This index is automatically created/updated by the extension "extdeveval")
  *
  */
 
-
-
-
-
-
-
-
-
-
-
-
-
-
 /**
  * Tools for scripts using the eID feature of index.php
  *
  * @author     Kasper Skaarhoj <kasperYYYY@typo3.com>
+ * @author     Dmitry Dulepov <dmitry@typo3.org>
  * @package TYPO3
  * @subpackage tslib
  */
-class tslib_eidtools {
+final class tslib_eidtools {
 
        /**
-        * Load and initialize Frontend User
+        * Load and initialize Frontend User. Note, this process is slow because
+        * it creates a calls many objects. Call this method only if necessary!
         *
         * @return      object          Frontend User object (usually known as TSFE->fe_user)
         */
        public static function initFeUser()     {
-                       // Include classes necessary for initializing frontend user:
-                       // We will use tslib_fe to do that:
-               require_once(PATH_tslib.'class.tslib_fe.php');
-               require_once(PATH_t3lib.'class.t3lib_cs.php');
-               require_once(PATH_t3lib.'class.t3lib_userauth.php');
-               require_once(PATH_tslib.'class.tslib_feuserauth.php');
-
-                       // Make new instance of TSFE object for initializing user:
-               $temp_TSFEclassName = t3lib_div::makeInstanceClassName('tslib_fe');
-               $TSFE = new $temp_TSFEclassName($GLOBALS['TYPO3_CONF_VARS'],0,0);
-               $TSFE->connectToDB();
-
-                       // Initialize FE user:
-               $TSFE->initFEuser();
-
-                       // Return FE user object:
-               return $TSFE->fe_user;
+               // Initialize the database. Do not use TSFE method as it may redirect to
+               // Install tool and call hooks, which do not expect to be called from eID
+               self::connectDB();
+
+               // Get TSFE instance. It knows how to initialize the user. We also
+               // need TCA because services may need extra tables!
+               self::initTCA();
+               $tsfe = self::getTSFE();
+               /* @var $tsfe tslib_fe */
+
+               // Include classes necessary for initializing frontend user
+               require_once(PATH_t3lib . 'class.t3lib_userauth.php');
+               require_once(PATH_tslib . 'class.tslib_feuserauth.php');
+
+               $tsfe->initFEuser();
+
+               // Return FE user object:
+               return $tsfe->fe_user;
        }
 
        /**
-        * Connecting to database
+        * Connecting to database. If the function fails, last error message
+        * can be retrieved using $GLOBALS['TYPO3_DB']->sql_error().
         *
-        * @return      void
+        * @return      boolean         true if connection was successful
         */
        public static function connectDB()      {
-               /* @var $TYPO3_DB t3lib_db */
-               $GLOBALS['TYPO3_DB']->connectDB();
+               static $dbConnected = false;
+
+               if (!$dbConnected) {
+                       // Attempt to connect to the database
+                       if ($GLOBALS['TYPO3_DB']->sql_pconnect(TYPO3_db_host, TYPO3_db_username, TYPO3_db_password) &&
+                                       $GLOBALS['TYPO3_DB']->sql_select_db(TYPO3_db)) {
+                               $dbConnected = true;
+                       }
+               }
+               return $dbConnected;
+       }
+
+       /**
+        * Initializes $GLOBALS['LANG'] for use in eID scripts.
+        *
+        * @param       string          $language       TYPO3 language code
+        * @return      void
+        */
+       public static function initLanguage($language = 'default') {
+               if (!is_object($GLOBALS['LANG'])) {
+                       require_once(PATH_t3lib . 'class.t3lib_cs.php');
+                       require_once(t3lib_extMgm::extPath('lang', 'lang.php'));
+                       $GLOBALS['LANG'] = t3lib_div::makeInstance('language');
+                       $GLOBALS['LANG']->init($language);
+               }
+       }
+
+       /**
+        * Makes TCA available inside eID
+        *
+        * @return      void
+        */
+       public static function initTCA() {
+               // Some badly made extensions attempt to manipulate TCA in a wrong way
+               // (inside ext_localconf.php). Therefore $TCA may become an array
+               // but in fact it is not loaded. The check below ensure that
+               // TCA is still loaded if such bad extensions are installed
+               if (!is_array($GLOBALS['TCA']) || !isset($GLOBALS['TCA']['pages'])) {
+                       // Load TCA using TSFE
+                       self::getTSFE()->includeTCA(false);
+               }
+       }
+
+       /**
+        * Makes TCA for the extension available inside eID. Use this function if
+        * you need not to include the whole $TCA. However, you still need to call
+        * t3lib_div::loadTCA() if you want to access column array!
+        *
+        * @param       string          $extensionKey   Extension key
+        * @return      void
+        */
+       public static function initExtensionTCA($extensionKey) {
+               $extTablesPath = t3lib_extMgm::extPath($extensionKey, 'ext_tables.php');
+               if (file_exists($extTablesPath)) {
+                       $GLOBALS['_EXTKEY'] = $extensionKey;
+                       require_once($extTablesPath);
+                       unset($GLOBALS['_EXTKEY']);
+                       // We do not need to save restore the value of $GLOBALS['_EXTKEY']
+                       // because it is not defined to anything real outside of
+                       // ext_tables.php or ext_localconf.php scope.
+               }
+       }
+
+       /**
+        * Creating a single static cached instance of TSFE to use with this class.
+        *
+        * @return      tslib_fe                New instance of tslib_fe
+        */
+       private static function getTSFE() {
+               // Cached instance
+               static $tsfe = null;
+
+               if (is_null($tsfe)) {
+                       require_once(PATH_tslib . 'class.tslib_fe.php');
+                       require_once(PATH_t3lib . 'class.t3lib_cs.php');
+
+                       $tsfeClassName = t3lib_div::makeInstanceClassName('tslib_fe');
+                       $tsfe = new $tsfeClassName($GLOBALS['TYPO3_CONF_VARS'], 0, 0);
+               }
+
+               return $tsfe;
        }
 }