[BUGFIX] Missing column in t3lib_TCEmain::getPreviousLocalizedRecordUid
[Packages/TYPO3.CMS.git] / t3lib / class.t3lib_extmgm.php
index ea752a9..34e7e11 100644 (file)
@@ -749,6 +749,92 @@ final class t3lib_extMgm {
        public static function allowTableOnStandardPages($table) {
                $GLOBALS['PAGES_TYPES']['default']['allowedTables'] .= ',' . $table;
        }
+       /**
+        * Adds a ExtJS module (main or sub) to the backend interface
+        * FOR USE IN ext_tables.php FILES
+        *
+        * @static
+        * @param string $extensionName
+        * @param string $mainModuleName is the main module key
+        * @param string $subModuleName is the submodule key, if blank a plain main module is generated
+        * @param string $position passed to t3lib_extMgm::addModule, see reference there
+        * @param array $moduleConfiguration icon with array keys: access, icon, labels to configure the module
+        * @throws InvalidArgumentException
+        */
+       public static function addExtJSModule($extensionName, $mainModuleName, $subModuleName = '', $position = '', array $moduleConfiguration = array()) {
+               if (empty($extensionName)) {
+                       throw new InvalidArgumentException('The extension name must not be empty', 1325938973);
+               }
+
+               $extensionKey = t3lib_div::camelCaseToLowerCaseUnderscored($extensionName);
+               $extensionName = str_replace(' ', '', ucwords(str_replace('_', ' ', $extensionName)));
+
+               $defaultModuleConfiguration = array(
+                       'access' => 'admin',
+                       'icon' => 'gfx/typo3.png',
+                       'labels' => '',
+                       'extRelPath' => t3lib_extMgm::extRelPath($extensionKey) . 'Classes/'
+               );
+
+                       // add mandatory parameter to use new pagetree
+               if ($mainModuleName === 'web') {
+                       $defaultModuleConfiguration['navigationComponentId'] = 'typo3-pagetree';
+               }
+
+               $moduleConfiguration = t3lib_div::array_merge_recursive_overrule($defaultModuleConfiguration, $moduleConfiguration);
+
+               if ((strlen($subModuleName) > 0)) {
+                       $moduleSignature = $mainModuleName . '_' . $subModuleName;
+               } else {
+                       $moduleSignature = $mainModuleName;
+               }
+
+               $moduleConfiguration['name'] = $moduleSignature;
+               $moduleConfiguration['script'] = 'extjspaneldummy.html';
+               $moduleConfiguration['extensionName'] = $extensionName;
+               $moduleConfiguration['configureModuleFunction'] = array('t3lib_extMgm', 'configureModule');
+
+               $GLOBALS['TBE_MODULES']['_configuration'][$moduleSignature] = $moduleConfiguration;
+
+               t3lib_extMgm::addModule($mainModuleName, $subModuleName, $position);
+       }
+
+       /**
+        * This method is called from t3lib_loadModules::checkMod and it replaces old conf.php.
+        *
+        * The original function for is called
+        * Tx_Extbase_Utility_Extension::configureModule, the refered function can
+        * be deprecated now
+        *
+        * @param string $moduleSignature The module name
+        * @param string $modulePath Absolute path to module (not used by Extbase currently)
+        * @return array Configuration of the module
+        */
+       public static function configureModule($moduleSignature, $modulePath) {
+               $moduleConfiguration = $GLOBALS['TBE_MODULES']['_configuration'][$moduleSignature];
+               $iconPathAndFilename = $moduleConfiguration['icon'];
+               if (substr($iconPathAndFilename, 0, 4) === 'EXT:') {
+                       list($extensionKey, $relativePath) = explode('/', substr($iconPathAndFilename, 4), 2);
+                       $iconPathAndFilename = t3lib_extMgm::extPath($extensionKey) . $relativePath;
+               }
+               // TODO: skin support
+
+               $moduleLabels = array(
+                       'tabs_images' => array(
+                               'tab' => $iconPathAndFilename,
+                       ),
+                       'labels' => array(
+                               'tablabel' => $GLOBALS['LANG']->sL($moduleConfiguration['labels'] . ':mlang_labels_tablabel'),
+                               'tabdescr' => $GLOBALS['LANG']->sL($moduleConfiguration['labels'] . ':mlang_labels_tabdescr'),
+                       ),
+                       'tabs' => array(
+                               'tab' => $GLOBALS['LANG']->sL($moduleConfiguration['labels'] . ':mlang_tabs_tab')
+                       )
+               );
+               $GLOBALS['LANG']->addModuleLabels($moduleLabels, $moduleSignature . '_');
+
+               return $moduleConfiguration;
+       }
 
        /**
         * Adds a module (main or sub) to the backend interface
@@ -810,47 +896,8 @@ final class t3lib_extMgm {
                if ($path) {
                        $GLOBALS['TBE_MODULES']['_PATHS'][$main . ($sub ? '_' . $sub : '')] = $path;
                }
-                       //add module JS
-               self::addModuleContentCard('{xtype: "iframePanel"}', $main, $sub);
-       }
-
-       /**
-        * Sets the JS card of an ExtJS module for the card layout
-        * Replaces default JS
-        * Used by Card Layout
-        *
-        * @param       string          $jsCode is plain valid JavaScript, which is added directly, usefull for small modules only!
-        * @param       string          $mainModule is the main module key, $sub is the submodule key. So $main would be an index in the $TBE_MODULES array and $sub could be an element in the lists there.
-        * @param       string          $subModule is the submodule key. If $sub is not set a blank $main module is created.
-        * @return      void
-        */
-       public static function addModuleContentCard($jsCode, $mainModule, $subModule = '') {
-               $moduleName = $mainModule . ($subModule ? '_' . $subModule : '');
-               $GLOBALS['TBE_MODULES']['_JSINIT'][$moduleName] = '
-                       TYPO3.Viewport.ContentCards.addContentCard(
-                               "' . $moduleName . '",
-                               ' . $jsCode . '
-                       );
-               ';
-       }
-
-       /**
-        * Removes the JS card of an ExtJS module directly
-        * Used by Card Layout
-        *
-        * @param       string          $mainModule is the main module key, $sub is the submodule key. So $main would be an index in the $TBE_MODULES array and $sub could be an element in the lists there.
-        * @param       string          $subModule is the submodule key. If $sub is not set a blank $main module is created.
-        * @return void
-        */
-       public static function removeModuleContentCard($mainModule, $subModule = '') {
-               $moduleName = $mainModule . ($subModule ? '_' . $subModule : '');
-               if (array_key_exists($moduleName, $GLOBALS['TBE_MODULES']['_JSINIT'])) {
-                       unset($GLOBALS['TBE_MODULES']['_JSINIT'][$moduleName]);
-               }
        }
 
-
-
        /**
         * Registers an Ext.Direct component with access restrictions.
         *
@@ -908,6 +955,23 @@ final class t3lib_extMgm {
        }
 
        /**
+        * Adds some more content to a key of TYPO3_CONF_VARS array.
+        *
+        * This also tracks which content was added by extensions (in TYPO3_CONF_VARS_extensionAdded)
+        * so that they cannot be editted again through the Install Tool.
+        *
+        * @static
+        * @param       string  The group ('FE', 'BE', 'SYS' ...)
+        * @param       string  The key of this setting within the group
+        * @param       string  The text to add (include leading "\n" in case of multi-line entries)
+        * @return      void
+        */
+       public static function appendToTypoConfVars($group, $key, $content) {
+               $GLOBALS['TYPO3_CONF_VARS_extensionAdded'][$group][$key] .= $content;
+               $GLOBALS['TYPO3_CONF_VARS'][$group][$key] .= $content;
+       }
+
+       /**
         * Adds $content to the default Page TSconfig as set in $GLOBALS['TYPO3_CONF_VARS'][BE]['defaultPageTSconfig']
         * Prefixed with a [GLOBAL] line
         * FOR USE IN ext_tables.php/ext_localconf.php FILES
@@ -916,7 +980,7 @@ final class t3lib_extMgm {
         * @return      void
         */
        public static function addPageTSConfig($content) {
-               $GLOBALS['TYPO3_CONF_VARS']['BE']['defaultPageTSconfig'] .= "\n[GLOBAL]\n" . $content;
+               self::appendToTypoConfVars('BE', 'defaultPageTSconfig', "\n[GLOBAL]\n" . $content);
        }
 
        /**
@@ -928,7 +992,7 @@ final class t3lib_extMgm {
         * @return      void
         */
        public static function addUserTSConfig($content) {
-               $GLOBALS['TYPO3_CONF_VARS']['BE']['defaultUserTSconfig'] .= "\n[GLOBAL]\n" . $content;
+               self::appendToTypoConfVars('BE', 'defaultUserTSconfig', "\n[GLOBAL]\n" . $content);
        }
 
        /**
@@ -999,14 +1063,7 @@ final class t3lib_extMgm {
         * @author      RenĂ© Fritz <r.fritz@colorcube.de>
         */
        public static function addService($extKey, $serviceType, $serviceKey, $info) {
-                       // even not available services will be included to make it possible to give the admin a feedback of non-available services.
-                       // but maybe it's better to move non-available services to a different array??
-
-               if ($serviceType &&
-                               !t3lib_div::hasValidClassPrefix($serviceType) &&
-                               t3lib_div::hasValidClassPrefix($serviceKey, array('user_')) &&
-                               is_array($info)) {
-
+               if ($serviceType && t3lib_div::hasValidClassPrefix($serviceKey) && is_array($info)) {
                        $info['priority'] = max(0, min(100, $info['priority']));
 
                        $GLOBALS['T3_SERVICES'][$serviceType][$serviceKey] = $info;
@@ -1059,7 +1116,7 @@ final class t3lib_extMgm {
         * @param       string          Service type
         * @param       string          Service sub type
         * @param       mixed           Service keys that should be excluded in the search for a service. Array or comma list.
-        * @return      mixed           Service info array if a service was found, FLASE otherwise
+        * @return      mixed           Service info array if a service was found, FALSE otherwise
         * @author      RenĂ© Fritz <r.fritz@colorcube.de>
         */
        public static function findService($serviceType, $serviceSubType = '', $excludeServiceKeys = array()) {
@@ -1073,6 +1130,7 @@ final class t3lib_extMgm {
                }
 
                if (is_array($GLOBALS['T3_SERVICES'][$serviceType])) {
+
                        foreach ($GLOBALS['T3_SERVICES'][$serviceType] as $key => $info) {
 
                                if (in_array($key, $excludeServiceKeys)) {
@@ -1080,7 +1138,7 @@ final class t3lib_extMgm {
                                }
 
                                        // select a subtype randomly
-                                       // usefull to start a service by service key without knowing his subtypes - for testing purposes
+                                       // useful to start a service by service key without knowing his subtypes - for testing purposes
                                if ($serviceSubType == '*') {
                                        $serviceSubType = key($info['serviceSubTypes']);
                                }
@@ -1093,17 +1151,8 @@ final class t3lib_extMgm {
                                                continue;
                                        }
 
-                                               // service depends on external programs - check if they exists
-                                       if (trim($info['exec'])) {
-                                               $executables = t3lib_div::trimExplode(',', $info['exec'], 1);
-                                               foreach ($executables as $executable) {
-                                                       if (!t3lib_exec::checkCommand($executable)) {
-                                                               self::deactivateService($serviceType, $key);
-                                                               $info['available'] = FALSE;
-                                                               break;
-                                                       }
-                                               }
-                                       }
+                                               // Check if the service is available
+                                       $info['available'] = self::isServiceAvailable($serviceType, $key, $info);
 
                                                // still available after exec check?
                                        if ($info['available']) {
@@ -1122,6 +1171,57 @@ final class t3lib_extMgm {
        }
 
        /**
+        * Find a specific service identified by its key
+        * Note that this completely bypasses the notions of priority and quality
+        *
+        * @param string $serviceKey Service key
+        * @return array Service info array if a service was found
+        * @throws t3lib_exception
+        */
+       public static function findServiceByKey($serviceKey) {
+               if (is_array($GLOBALS['T3_SERVICES'])) {
+                               // Loop on all service types
+                               // NOTE: we don't care about the actual type, we are looking for a specific key
+                       foreach ($GLOBALS['T3_SERVICES'] as $serviceType => $servicesPerType) {
+                               if (isset($servicesPerType[$serviceKey])) {
+                                       $serviceDetails = $servicesPerType[$serviceKey];
+                                               // Test if service is available
+                                       if (self::isServiceAvailable($serviceType, $serviceKey, $serviceDetails)) {
+                                                       // We have found the right service, return its information
+                                               return $serviceDetails;
+                                       }
+                               }
+                       }
+               }
+               throw new t3lib_exception('Service not found for key: ' . $serviceKey, 1319217244);
+       }
+
+       /**
+        * Check if a given service is available, based on the executable files it depends on
+        *
+        * @param string $serviceType Type of service
+        * @param string $serviceKey Specific key of the service
+        * @param array $serviceDetails Information about the service
+        * @return boolean Service availability
+        */
+       public static function isServiceAvailable($serviceType, $serviceKey, $serviceDetails) {
+
+                       // If the service depends on external programs - check if they exists
+               if (trim($serviceDetails['exec'])) {
+                       $executables = t3lib_div::trimExplode(',', $serviceDetails['exec'], 1);
+                       foreach ($executables as $executable) {
+                                       // If at least one executable file is not available, exit early returning FALSE
+                               if (!t3lib_exec::checkCommand($executable)) {
+                                       self::deactivateService($serviceType, $serviceKey);
+                                       return FALSE;
+                               }
+                       }
+               }
+                       // The service is available
+               return TRUE;
+       }
+
+       /**
         * Deactivate a service
         *
         * @param       string          Service type
@@ -1287,7 +1387,7 @@ tt_content.' . $key . $prefix . ' {
         * FOR USE IN ext_localconf.php FILES
         *
         * @param       string          $extKey is of course the extension key
-        * @param       string          $path is the path where the template files (fixed names) include_static.txt (integer list of uids from the table "static_templates"), constants.txt, setup.txt, editorcfg.txt, and include_static_file.txt is found (relative to extPath, eg. 'static/'). The file include_static_file.txt, allows you to include other static templates defined in files, from your static template, and thus corresponds to the field 'include_static_file' in the sys_template table. The syntax for this is a commaseperated list of static templates to include, like:  EXT:css_styled_content/static/,EXT:da_newsletter_subscription/static/,EXT:cc_random_image/pi2/static/
+        * @param       string          $path is the path where the template files (fixed names) include_static.txt (integer list of uids from the table "static_templates"), constants.txt, setup.txt, and include_static_file.txt is found (relative to extPath, eg. 'static/'). The file include_static_file.txt, allows you to include other static templates defined in files, from your static template, and thus corresponds to the field 'include_static_file' in the sys_template table. The syntax for this is a commaseperated list of static templates to include, like:  EXT:css_styled_content/static/,EXT:da_newsletter_subscription/static/,EXT:cc_random_image/pi2/static/
         * @param       string          $title is the title in the selector box.
         * @return      void
         * @see addTypoScript()
@@ -1310,7 +1410,7 @@ tt_content.' . $key . $prefix . ' {
         * @return      void
         */
        public static function addTypoScriptSetup($content) {
-               $GLOBALS['TYPO3_CONF_VARS']['FE']['defaultTypoScript_setup'] .= "\n[GLOBAL]\n" . $content;
+               self::appendToTypoConfVars('FE', 'defaultTypoScript_setup', "\n[GLOBAL]\n" . $content);
        }
 
        /**
@@ -1322,22 +1422,22 @@ tt_content.' . $key . $prefix . ' {
         * @return      void
         */
        public static function addTypoScriptConstants($content) {
-               $GLOBALS['TYPO3_CONF_VARS']['FE']['defaultTypoScript_constants'] .= "\n[GLOBAL]\n" . $content;
+               self::appendToTypoConfVars('FE', 'defaultTypoScript_constants', "\n[GLOBAL]\n" . $content);
        }
 
        /**
-        * Adds $content to the default TypoScript code for either setup, constants or editorcfg as set in $GLOBALS['TYPO3_CONF_VARS'][FE]['defaultTypoScript_*']
+        * 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
         *
         * @param       string          $key is the extension key (informative only).
-        * @param       string          $type is either "setup", "constants" or "editorcfg" and obviously determines which kind of TypoScript code we are adding.
+        * @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       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
         */
        public static function addTypoScript($key, $type, $content, $afterStaticUid = 0) {
-               if ($type == 'setup' || $type == 'editorcfg' || $type == 'constants') {
+               if ($type == 'setup' || $type == 'constants') {
                        $content = '
 
 [GLOBAL]
@@ -1405,7 +1505,7 @@ tt_content.' . $key . $prefix . ' {
                        } else { // ... but if not, configure...
 
                                        // Prepare reserved filenames:
-                               $files = array('ext_localconf.php', 'ext_tables.php', 'ext_tables.sql', 'ext_tables_static+adt.sql', 'ext_typoscript_constants.txt', 'ext_typoscript_editorcfg.txt', 'ext_typoscript_setup.txt');
+                               $files = array('ext_localconf.php', 'ext_tables.php', 'ext_tables.sql', 'ext_tables_static+adt.sql', 'ext_typoscript_constants.txt', 'ext_typoscript_setup.txt');
                                        // Traverse extensions and check their existence:
                                clearstatcache(); // Clear file state cache to make sure we get good results from is_dir()
                                $temp_extensions = array_unique(t3lib_div::trimExplode(',', $rawExtList, 1));
@@ -1706,4 +1806,4 @@ $GLOBALS[\'TYPO3_LOADED_EXT\'] = unserialize(stripslashes(\'' . addslashes(seria
        }
 }
 
-?>
\ No newline at end of file
+?>