[TASK] Remove second parameter of sL - Part 2/3
[Packages/TYPO3.CMS.git] / typo3 / sysext / backend / Classes / Utility / BackendUtility.php
index 7adeb93..5150d2b 100755 (executable)
@@ -14,17 +14,16 @@ namespace TYPO3\CMS\Backend\Utility;
  * The TYPO3 project - inspiring people to share!
  */
 
-use TYPO3\CMS\Backend\Configuration\TranslationConfigurationProvider;
 use TYPO3\CMS\Backend\Routing\UriBuilder;
 use TYPO3\CMS\Backend\Template\DocumentTemplate;
 use TYPO3\CMS\Core\Authentication\BackendUserAuthentication;
 use TYPO3\CMS\Core\Cache\CacheManager;
+use TYPO3\CMS\Core\Database\DatabaseConnection;
 use TYPO3\CMS\Core\Database\PreparedStatement;
 use TYPO3\CMS\Core\Database\RelationHandler;
-use TYPO3\CMS\Core\FormProtection\FormProtectionFactory;
 use TYPO3\CMS\Core\Imaging\Icon;
 use TYPO3\CMS\Core\Imaging\IconFactory;
-use TYPO3\CMS\Core\Messaging\FlashMessage;
+use TYPO3\CMS\Core\Resource\AbstractFile;
 use TYPO3\CMS\Core\Resource\Exception\ResourceDoesNotExistException;
 use TYPO3\CMS\Core\Resource\File;
 use TYPO3\CMS\Core\Resource\ProcessedFile;
@@ -38,7 +37,6 @@ use TYPO3\CMS\Core\Utility\MathUtility;
 use TYPO3\CMS\Core\Utility\PathUtility;
 use TYPO3\CMS\Core\Utility\StringUtility;
 use TYPO3\CMS\Core\Versioning\VersionState;
-use TYPO3\CMS\Core\Database\DatabaseConnection;
 use TYPO3\CMS\Frontend\Page\PageRepository;
 use TYPO3\CMS\Lang\LanguageService;
 
@@ -81,7 +79,7 @@ class BackendUtility
      */
     public static function deleteClause($table, $tableAlias = '')
     {
-        if ($GLOBALS['TCA'][$table]['ctrl']['delete']) {
+        if (!empty($GLOBALS['TCA'][$table]['ctrl']['delete'])) {
             return ' AND ' . ($tableAlias ?: $table) . '.' . $GLOBALS['TCA'][$table]['ctrl']['delete'] . '=0';
         } else {
             return '';
@@ -232,9 +230,11 @@ class BackendUtility
      * @param string $tablename Table name from which ids is returned
      * @param string $default_tablename $default_tablename denotes what table the number '45' is from (if nothing is prepended on the value)
      * @return string List of ids
+     * @deprecated since TYPO3 CMS 8, will be removed in TYPO3 CMS 9.
      */
     public static function getSQLselectableList($in_list, $tablename, $default_tablename)
     {
+        GeneralUtility::logDeprecatedFunction();
         $list = array();
         if ((string)trim($in_list) != '') {
             $tempItemArray = explode(',', trim($in_list));
@@ -495,183 +495,6 @@ class BackendUtility
     }
 
     /**
-     * Returns an array with the exclude-fields as defined in TCA and FlexForms
-     * Used for listing the exclude-fields in be_groups forms
-     *
-     * @return array Array of arrays with excludeFields (fieldname, table:fieldname) from all TCA entries and from FlexForms (fieldname, table:extkey;sheetname;fieldname)
-     * @deprecated since TYPO3 CMS 7, will be removed in TYPO3 CMS 8
-     */
-    public static function getExcludeFields()
-    {
-        GeneralUtility::logDeprecatedFunction();
-        $finalExcludeArray = array();
-
-        // Fetch translations for table names
-        $tableToTranslation = array();
-        $lang = static::getLanguageService();
-        // All TCA keys
-        foreach ($GLOBALS['TCA'] as $table => $conf) {
-            $tableToTranslation[$table] = $lang->sl($conf['ctrl']['title']);
-        }
-        // Sort by translations
-        asort($tableToTranslation);
-        foreach ($tableToTranslation as $table => $translatedTable) {
-            $excludeArrayTable = array();
-
-            // All field names configured and not restricted to admins
-            if (is_array($GLOBALS['TCA'][$table]['columns'])
-                    && empty($GLOBALS['TCA'][$table]['ctrl']['adminOnly'])
-                    && (empty($GLOBALS['TCA'][$table]['ctrl']['rootLevel']) || !empty($GLOBALS['TCA'][$table]['ctrl']['security']['ignoreRootLevelRestriction']))
-            ) {
-                foreach ($GLOBALS['TCA'][$table]['columns'] as $field => $_) {
-                    if ($GLOBALS['TCA'][$table]['columns'][$field]['exclude']) {
-                        // Get human readable names of fields
-                        $translatedField = $lang->sl($GLOBALS['TCA'][$table]['columns'][$field]['label']);
-                        // Add entry
-                        $excludeArrayTable[] = array($translatedTable . ': ' . $translatedField, $table . ':' . $field);
-                    }
-                }
-            }
-            // All FlexForm fields
-            $flexFormArray = static::getRegisteredFlexForms($table);
-            foreach ($flexFormArray as $tableField => $flexForms) {
-                // Prefix for field label, e.g. "Plugin Options:"
-                $labelPrefix = '';
-                if (!empty($GLOBALS['TCA'][$table]['columns'][$tableField]['label'])) {
-                    $labelPrefix = $lang->sl($GLOBALS['TCA'][$table]['columns'][$tableField]['label']);
-                }
-                // Get all sheets and title
-                foreach ($flexForms as $extIdent => $extConf) {
-                    $extTitle = $lang->sl($extConf['title']);
-                    // Get all fields in sheet
-                    foreach ($extConf['ds']['sheets'] as $sheetName => $sheet) {
-                        if (empty($sheet['ROOT']['el']) || !is_array($sheet['ROOT']['el'])) {
-                            continue;
-                        }
-                        foreach ($sheet['ROOT']['el'] as $fieldName => $field) {
-                            // Use only fields that have exclude flag set
-                            if (empty($field['TCEforms']['exclude'])) {
-                                continue;
-                            }
-                            $fieldLabel = !empty($field['TCEforms']['label']) ? $lang->sl($field['TCEforms']['label']) : $fieldName;
-                            $fieldIdent = $table . ':' . $tableField . ';' . $extIdent . ';' . $sheetName . ';' . $fieldName;
-                            $excludeArrayTable[] = array(trim($labelPrefix . ' ' . $extTitle, ': ') . ': ' . $fieldLabel, $fieldIdent);
-                        }
-                    }
-                }
-            }
-            // Sort fields by the translated value
-            if (!empty($excludeArrayTable)) {
-                usort($excludeArrayTable, function (array $array1, array $array2) {
-                    $array1 = reset($array1);
-                    $array2 = reset($array2);
-                    if (is_string($array1) && is_string($array2)) {
-                        return strcasecmp($array1, $array2);
-                    }
-                    return 0;
-                });
-                $finalExcludeArray = array_merge($finalExcludeArray, $excludeArrayTable);
-            }
-        }
-
-        return $finalExcludeArray;
-    }
-
-    /**
-     * Returns an array with explicit Allow/Deny fields.
-     * Used for listing these field/value pairs in be_groups forms
-     *
-     * @return array Array with information from all of $GLOBALS['TCA']
-     * @deprecated since TYPO3 CMS 7, will be removed in TYPO3 CMS 8
-     */
-    public static function getExplicitAuthFieldValues()
-    {
-        GeneralUtility::logDeprecatedFunction();
-        // Initialize:
-        $lang = static::getLanguageService();
-        $adLabel = array(
-            'ALLOW' => $lang->sl('LLL:EXT:lang/locallang_core.xlf:labels.allow'),
-            'DENY' => $lang->sl('LLL:EXT:lang/locallang_core.xlf:labels.deny')
-        );
-        // All TCA keys:
-        $allowDenyOptions = array();
-        foreach ($GLOBALS['TCA'] as $table => $_) {
-            // All field names configured:
-            if (is_array($GLOBALS['TCA'][$table]['columns'])) {
-                foreach ($GLOBALS['TCA'][$table]['columns'] as $field => $_) {
-                    $fCfg = $GLOBALS['TCA'][$table]['columns'][$field]['config'];
-                    if ($fCfg['type'] == 'select' && $fCfg['authMode']) {
-                        // Check for items:
-                        if (is_array($fCfg['items'])) {
-                            // Get Human Readable names of fields and table:
-                            $allowDenyOptions[$table . ':' . $field]['tableFieldLabel'] =
-                                $lang->sl($GLOBALS['TCA'][$table]['ctrl']['title']) . ': '
-                                . $lang->sl($GLOBALS['TCA'][$table]['columns'][$field]['label']);
-                            // Check for items:
-                            foreach ($fCfg['items'] as $iVal) {
-                                // Values '' is not controlled by this setting.
-                                if ((string)$iVal[1] !== '') {
-                                    // Find iMode
-                                    $iMode = '';
-                                    switch ((string)$fCfg['authMode']) {
-                                        case 'explicitAllow':
-                                            $iMode = 'ALLOW';
-                                            break;
-                                        case 'explicitDeny':
-                                            $iMode = 'DENY';
-                                            break;
-                                        case 'individual':
-                                            if ($iVal[4] === 'EXPL_ALLOW') {
-                                                $iMode = 'ALLOW';
-                                            } elseif ($iVal[4] === 'EXPL_DENY') {
-                                                $iMode = 'DENY';
-                                            }
-                                            break;
-                                    }
-                                    // Set iMode
-                                    if ($iMode) {
-                                        $allowDenyOptions[$table . ':' . $field]['items'][$iVal[1]] = array($iMode, $lang->sl($iVal[0]), $adLabel[$iMode]);
-                                    }
-                                }
-                            }
-                        }
-                    }
-                }
-            }
-        }
-        return $allowDenyOptions;
-    }
-
-    /**
-     * Returns an array with system languages:
-     *
-     * The property flagIcon returns a string <flags-xx>. The calling party should call
-     * \TYPO3\CMS\Backend\Utility\IconUtility::getSpriteIcon(<flags-xx>) to get an HTML
-     * which will represent the flag of this language.
-     *
-     * @return array Array with languages (title, uid, flagIcon - used with IconUtility::getSpriteIcon)
-     * @deprecated since TYPO3 CMS 7, will be removed in TYPO3 CMS 8
-     */
-    public static function getSystemLanguages()
-    {
-        GeneralUtility::logDeprecatedFunction();
-        /** @var TranslationConfigurationProvider $translationConfigurationProvider */
-        $translationConfigurationProvider = GeneralUtility::makeInstance(\TYPO3\CMS\Backend\Configuration\TranslationConfigurationProvider::class);
-        $languages = $translationConfigurationProvider->getSystemLanguages();
-        $sysLanguages = array();
-        foreach ($languages as $language) {
-            if ($language['uid'] !== -1) {
-                $sysLanguages[] = array(
-                    0 => htmlspecialchars($language['title']) . ' [' . $language['uid'] . ']',
-                    1 => $language['uid'],
-                    2 => $language['flagIcon']
-                );
-            }
-        }
-        return $sysLanguages;
-    }
-
-    /**
      * Gets the original translation pointer table.
      * For e.g. pages_language_overlay this would be pages.
      *
@@ -910,16 +733,10 @@ class BackendUtility
      * See unit tests for details.
      *
      * @param string $defaultExtrasString "defaultExtras" string from columns config
-     * @param string $_ @deprecated since TYPO3 CMS 7, will be removed with TYPO3 CMS 8
      * @return array
      */
-    public static function getSpecConfParts($defaultExtrasString, $_ = '')
+    public static function getSpecConfParts($defaultExtrasString)
     {
-        if (!empty($_)) {
-            GeneralUtility::deprecationLog('Second parameter of BackendUtility::getSpecConfParts() is deprecated. Will be removed with TYPO3 CMS 8');
-            // Prepend old parameter, can be overwritten by casual defaultExtras string, then.
-            $defaultExtrasString = $_ . ':' . $defaultExtrasString;
-        }
         $specConfParts = GeneralUtility::trimExplode(':', $defaultExtrasString, true);
         $reg = array();
         if (!empty($specConfParts)) {
@@ -1031,7 +848,7 @@ class BackendUtility
             if (substr($ds_array[$srcPointer], 0, 5) == 'FILE:') {
                 $file = GeneralUtility::getFileAbsFileName(substr($ds_array[$srcPointer], 5));
                 if ($file && @is_file($file)) {
-                    $dataStructArray = GeneralUtility::xml2array(GeneralUtility::getUrl($file));
+                    $dataStructArray = GeneralUtility::xml2array(file_get_contents($file));
                 } else {
                     $dataStructArray = 'The file "' . substr($ds_array[$srcPointer], 5) . '" in ds-array key "' . $srcPointer . '" was not found ("' . $file . '")';
                 }
@@ -1084,7 +901,7 @@ class BackendUtility
                         if (strpos($dataStructRec[$fName], '<') === false) {
                             if (is_file(PATH_site . $dataStructRec[$fName])) {
                                 // The value is a pointer to a file
-                                $dataStructArray = GeneralUtility::xml2array(GeneralUtility::getUrl(PATH_site . $dataStructRec[$fName]));
+                                $dataStructArray = GeneralUtility::xml2array(file_get_contents(PATH_site . $dataStructRec[$fName]));
                             } else {
                                 $dataStructArray = sprintf('File \'%s\' was not found', $dataStructRec[$fName]);
                             }
@@ -1099,7 +916,7 @@ class BackendUtility
                     // Otherwise expect it to be a file:
                     $file = GeneralUtility::getFileAbsFileName($srcPointer);
                     if ($file && @is_file($file)) {
-                        $dataStructArray = GeneralUtility::xml2array(GeneralUtility::getUrl($file));
+                        $dataStructArray = GeneralUtility::xml2array(file_get_contents($file));
                     } else {
                         // Error message.
                         $dataStructArray = 'The file "' . $srcPointer . '" was not found ("' . $file . '")';
@@ -1124,82 +941,6 @@ class BackendUtility
         return $dataStructArray;
     }
 
-    /**
-     * Returns all registered FlexForm definitions with title and fields
-     *
-     * @param string $table The content table
-     * @return array The data structures with speaking extension title
-     * @see \TYPO3\CMS\Backend\Utility\BackendUtility::getExcludeFields()
-     *  @deprecated since TYPO3 CMS 7, will be removed in TYPO3 CMS 8
-     */
-    public static function getRegisteredFlexForms($table = 'tt_content')
-    {
-        GeneralUtility::logDeprecatedFunction();
-        if (empty($table) || empty($GLOBALS['TCA'][$table]['columns'])) {
-            return array();
-        }
-        $flexForms = array();
-        foreach ($GLOBALS['TCA'][$table]['columns'] as $tableField => $fieldConf) {
-            if (!empty($fieldConf['config']['type']) && !empty($fieldConf['config']['ds']) && $fieldConf['config']['type'] == 'flex') {
-                $flexForms[$tableField] = array();
-                unset($fieldConf['config']['ds']['default']);
-                // Get pointer fields
-                $pointerFields = !empty($fieldConf['config']['ds_pointerField']) ? $fieldConf['config']['ds_pointerField'] : 'list_type,CType';
-                $pointerFields = GeneralUtility::trimExplode(',', $pointerFields);
-                // Get FlexForms
-                foreach ($fieldConf['config']['ds'] as $flexFormKey => $dataStruct) {
-                    // Get extension identifier (uses second value if it's not empty, "list" or "*", else first one)
-                    $identFields = GeneralUtility::trimExplode(',', $flexFormKey);
-                    $extIdent = $identFields[0];
-                    if (!empty($identFields[1]) && $identFields[1] != 'list' && $identFields[1] != '*') {
-                        $extIdent = $identFields[1];
-                    }
-                    // Load external file references
-                    if (!is_array($dataStruct)) {
-                        $file = GeneralUtility::getFileAbsFileName(str_ireplace('FILE:', '', $dataStruct));
-                        if ($file && @is_file($file)) {
-                            $dataStruct = GeneralUtility::getUrl($file);
-                        }
-                        $dataStruct = GeneralUtility::xml2array($dataStruct);
-                        if (!is_array($dataStruct)) {
-                            continue;
-                        }
-                    }
-                    // Get flexform content
-                    $dataStruct = GeneralUtility::resolveAllSheetsInDS($dataStruct);
-                    if (empty($dataStruct['sheets']) || !is_array($dataStruct['sheets'])) {
-                        continue;
-                    }
-                    // Use DS pointer to get extension title from TCA
-                    $title = $extIdent;
-                    $keyFields = GeneralUtility::trimExplode(',', $flexFormKey);
-                    foreach ($pointerFields as $pointerKey => $pointerName) {
-                        if (empty($keyFields[$pointerKey]) || $keyFields[$pointerKey] == '*' || $keyFields[$pointerKey] == 'list') {
-                            continue;
-                        }
-                        if (!empty($GLOBALS['TCA'][$table]['columns'][$pointerName]['config']['items'])) {
-                            $items = $GLOBALS['TCA'][$table]['columns'][$pointerName]['config']['items'];
-                            if (!is_array($items)) {
-                                continue;
-                            }
-                            foreach ($items as $itemConf) {
-                                if (!empty($itemConf[0]) && !empty($itemConf[1]) && $itemConf[1] == $keyFields[$pointerKey]) {
-                                    $title = $itemConf[0];
-                                    break 2;
-                                }
-                            }
-                        }
-                    }
-                    $flexForms[$tableField][$extIdent] = array(
-                        'title' => $title,
-                        'ds' => $dataStruct
-                    );
-                }
-            }
-        }
-        return $flexForms;
-    }
-
     /*******************************************
      *
      * Caching related
@@ -1302,7 +1043,7 @@ class BackendUtility
                                 $includeTsConfigFileAndPath = ExtensionManagementUtility::extPath($includeTsConfigFileExtensionKey) .
                                     $includeTsConfigFilename;
                                 if (file_exists($includeTsConfigFileAndPath)) {
-                                    $TSdataArray['uid_' . $v['uid'] . '_static_' . $key] = GeneralUtility::getUrl($includeTsConfigFileAndPath);
+                                    $TSdataArray['uid_' . $v['uid'] . '_static_' . $key] = file_get_contents($includeTsConfigFileAndPath);
                                 }
                             }
                         }
@@ -1341,30 +1082,6 @@ class BackendUtility
         return $TSconfig;
     }
 
-    /**
-     * Implodes a multi dimensional TypoScript array, $p, into a one-dimensional array (return value)
-     *
-     * @param array $p TypoScript structure
-     * @param string $k Prefix string
-     * @return array Imploded TypoScript objectstring/values
-     * @deprecated since TYPO3 CMS 7, will be removed in TYPO3 CMS 8
-     */
-    public static function implodeTSParams($p, $k = '')
-    {
-        GeneralUtility::logDeprecatedFunction();
-        $implodeParams = array();
-        if (is_array($p)) {
-            foreach ($p as $kb => $val) {
-                if (is_array($val)) {
-                    $implodeParams = array_merge($implodeParams, self::implodeTSParams($val, $k . $kb));
-                } else {
-                    $implodeParams[$k . $kb] = $val;
-                }
-            }
-        }
-        return $implodeParams;
-    }
-
     /*******************************************
      *
      * Users / Groups related
@@ -1623,7 +1340,7 @@ class BackendUtility
         }
         $label = static::getLanguageService()->sL('LLL:EXT:lang/locallang_core.xlf:labels.minutesHoursDaysYears');
         $age = ' (' . self::calcAge($prefix * ($GLOBALS['EXEC_TIME'] - $tstamp), $label) . ')';
-        return $date === 'date' ? self::date($tstamp) : self::datetime($tstamp) . $age;
+        return ($date === 'date' ? self::date($tstamp) : self::datetime($tstamp)) . $age;
     }
 
     /**
@@ -1631,9 +1348,11 @@ class BackendUtility
      *
      * @param string $content Value for 'alt' and 'title' attributes (will be htmlspecialchars()'ed before output)
      * @return string
+     * @deprecated since TYPO3 CMS 8, will be removed in TYPO3 CMS 9.
      */
     public static function titleAltAttrib($content)
     {
+        GeneralUtility::logDeprecatedFunction();
         $out = '';
         $out .= ' alt="' . htmlspecialchars($content) . '"';
         $out .= ' title="' . htmlspecialchars($content) . '"';
@@ -1723,16 +1442,21 @@ class BackendUtility
         $iconFactory = GeneralUtility::makeInstance(IconFactory::class);
         if ($fileReferences !== null) {
             foreach ($fileReferences as $fileReferenceObject) {
+                // Do not show previews of hidden references
+                if ($fileReferenceObject->getProperty('hidden')) {
+                    continue;
+                }
                 $fileObject = $fileReferenceObject->getOriginalFile();
 
                 if ($fileObject->isMissing()) {
-                    $flashMessage = \TYPO3\CMS\Core\Resource\Utility\BackendUtility::getFlashMessageForMissingFile($fileObject);
-                    $thumbData .= $flashMessage->render();
+                    $thumbData .= '<span class="label label-danger">'
+                        . htmlspecialchars(static::getLanguageService()->sL('LLL:EXT:lang/locallang_core.xlf:warning.file_missing'))
+                        . '</span>&nbsp;' . htmlspecialchars($fileObject->getName()) . '<br />';
                     continue;
                 }
 
                 // Preview web image or media elements
-                if (GeneralUtility::inList($GLOBALS['TYPO3_CONF_VARS']['GFX']['imagefile_ext'] . ',' . $GLOBALS['TYPO3_CONF_VARS']['SYS']['mediafile_ext'], $fileReferenceObject->getExtension())) {
+                if ($GLOBALS['TYPO3_CONF_VARS']['GFX']['thumbnails'] && GeneralUtility::inList($GLOBALS['TYPO3_CONF_VARS']['GFX']['imagefile_ext'] . ',' . $GLOBALS['TYPO3_CONF_VARS']['SYS']['mediafile_ext'], $fileReferenceObject->getExtension())) {
                     $processedImage = $fileObject->process(ProcessedFile::CONTEXT_IMAGECROPSCALEMASK, array(
                                         'width' => $sizeParts[0],
                                         'height' => $sizeParts[1] . 'c',
@@ -1748,7 +1472,7 @@ class BackendUtility
                     $imgTag = '<span title="' . htmlspecialchars($fileObject->getName()) . '">' . $iconFactory->getIconForResource($fileObject, Icon::SIZE_SMALL)->render() . '</span>';
                 }
                 if ($linkInfoPopup) {
-                    $onClick = 'top.launchView(\'_FILE\',\'' . (int)$fileObject->getUid() . '\',' . GeneralUtility::quoteJSvalue($backPath) . '); return false;';
+                    $onClick = 'top.launchView(\'_FILE\',\'' . (int)$fileObject->getUid() . '\'); return false;';
                     $thumbData .= '<a href="#" onclick="' . htmlspecialchars($onClick) . '">' . $imgTag . '</a> ';
                 } else {
                     $thumbData .= $imgTag;
@@ -1769,19 +1493,22 @@ class BackendUtility
                     try {
                         /** @var File $fileObject */
                         $fileObject = ResourceFactory::getInstance()->retrieveFileOrFolderObject($fileName);
+                        // Skip the resource if it's not of type AbstractFile. One case where this can happen if the
+                        // storage has been externally modified and the field value now points to a folder
+                        // instead of a file.
+                        if (!$fileObject instanceof AbstractFile) {
+                            continue;
+                        }
                         if ($fileObject->isMissing()) {
-                            $flashMessage = \TYPO3\CMS\Core\Resource\Utility\BackendUtility::getFlashMessageForMissingFile($fileObject);
-                            $thumbData .= $flashMessage->render();
+                            $thumbData .= '<span class="label label-danger">'
+                                . htmlspecialchars(static::getLanguageService()->sL('LLL:EXT:lang/locallang_core.xlf:warning.file_missing'))
+                                . '</span>&nbsp;' . htmlspecialchars($fileObject->getName()) . '<br />';
                             continue;
                         }
                     } catch (ResourceDoesNotExistException $exception) {
-                        /** @var FlashMessage $flashMessage */
-                        $flashMessage = GeneralUtility::makeInstance(\TYPO3\CMS\Core\Messaging\FlashMessage::class,
-                            htmlspecialchars($exception->getMessage()),
-                            static::getLanguageService()->sL('LLL:EXT:lang/locallang_core.xlf:warning.file_missing', true),
-                            FlashMessage::ERROR
-                        );
-                        $thumbData .= $flashMessage->render();
+                        $thumbData .= '<span class="label label-danger">'
+                            . htmlspecialchars(static::getLanguageService()->sL('LLL:EXT:lang/locallang_core.xlf:warning.file_missing'))
+                            . '</span>&nbsp;' . htmlspecialchars($fileName) . '<br />';
                         continue;
                     }
 
@@ -1793,7 +1520,7 @@ class BackendUtility
                         ))->getPublicUrl(true);
                         $image = '<img src="' . htmlspecialchars($imageUrl) . '" hspace="2" border="0" title="' . htmlspecialchars($fileObject->getName()) . '"' . $tparams . ' alt="" />';
                         if ($linkInfoPopup) {
-                            $onClick = 'top.launchView(\'_FILE\', ' . GeneralUtility::quoteJSvalue($fileName) . ',\'\',' . GeneralUtility::quoteJSvalue($backPath) . ');return false;';
+                            $onClick = 'top.launchView(\'_FILE\', ' . GeneralUtility::quoteJSvalue($fileName) . ',\'\');return false;';
                             $thumbData .= '<a href="#" onclick="' . htmlspecialchars($onClick) . '">' . $image . '</a> ';
                         } else {
                             $thumbData .= $image;
@@ -1802,7 +1529,7 @@ class BackendUtility
                         // Gets the icon
                         $fileIcon = '<span title="' . htmlspecialchars($fileObject->getName()) . '">' . $iconFactory->getIconForResource($fileObject, Icon::SIZE_SMALL)->render() . '</span>';
                         if ($linkInfoPopup) {
-                            $onClick = 'top.launchView(\'_FILE\', ' . GeneralUtility::quoteJSvalue($fileName) . ',\'\',' . GeneralUtility::quoteJSvalue($backPath) . '); return false;';
+                            $onClick = 'top.launchView(\'_FILE\', ' . GeneralUtility::quoteJSvalue($fileName) . ',\'\'); return false;';
                             $thumbData .= '<a href="#" onclick="' . htmlspecialchars($onClick) . '">' . $fileIcon . '</a> ';
                         } else {
                             $thumbData .= $fileIcon;
@@ -1815,29 +1542,6 @@ class BackendUtility
     }
 
     /**
-     * Returns single image tag to thumbnail using a thumbnail script (like thumbs.php)
-     *
-     * @param string $thumbScript Must point to "thumbs.php" relative to the script position
-     * @param string $theFile Must be the proper reference to the file that thumbs.php should show
-     * @param string $tparams The additional attributes for the image tag
-     * @param string $size The size of the thumbnail send along to thumbs.php
-     * @return string Image tag
-     * @deprecated since TYPO3 CMS 7, will be removed with TYPO3 CMS 8, use the corresponding Resource objects and Processing functionality
-     */
-    public static function getThumbNail($thumbScript, $theFile, $tparams = '', $size = '')
-    {
-        GeneralUtility::logDeprecatedFunction();
-        $size = trim($size);
-        $check = basename($theFile) . ':' . filemtime($theFile) . ':' . $GLOBALS['TYPO3_CONF_VARS']['SYS']['encryptionKey'];
-        $params = '&file=' . rawurlencode($theFile);
-        $params .= $size ? '&size=' . $size : '';
-        $params .= '&md5sum=' . md5($check);
-        $url = $thumbScript . '?' . $params;
-        $th = '<img src="' . htmlspecialchars($url) . '" title="' . trim(basename($theFile)) . '"' . ($tparams ? ' ' . $tparams : '') . ' alt="" />';
-        return $th;
-    }
-
-    /**
      * Returns title-attribute information for a page-record informing about id, alias, doktype, hidden, starttime, endtime, fe_group etc.
      *
      * @param array $row Input must be a page row ($row) with the proper fields set (be sure - send the full range of fields for the table)
@@ -1929,13 +1633,27 @@ class BackendUtility
     }
 
     /**
+     * Returns the combined markup for Bootstraps tooltips
+     *
+     * @param array $row
+     * @param string $table
+     * @return string
+     */
+    public static function getRecordToolTip(array $row, $table = 'pages')
+    {
+        $toolTipText = self::getRecordIconAltText($row, $table);
+        $toolTipCode = 'data-toggle="tooltip" data-title=" ' . str_replace(' - ', '<br>', $toolTipText) . '" data-html="true" data-placement="right"';
+        return $toolTipCode;
+    }
+
+    /**
      * Returns title-attribute information for ANY record (from a table defined in TCA of course)
      * The included information depends on features of the table, but if hidden, starttime, endtime and fe_group fields are configured for, information about the record status in regard to these features are is included.
      * "pages" table can be used as well and will return the result of ->titleAttribForPages() for that page.
      *
      * @param array $row Table row; $row is a row from the table, $table
      * @param string $table Table name
-     * @return         string
+     * @return string
      */
     public static function getRecordIconAltText($row, $table = 'pages')
     {
@@ -1945,14 +1663,14 @@ class BackendUtility
             $out = !empty(trim($GLOBALS['TCA'][$table]['ctrl']['descriptionColumn'])) ? $row[$GLOBALS['TCA'][$table]['ctrl']['descriptionColumn']] . ' ' : '';
             $ctrl = $GLOBALS['TCA'][$table]['ctrl']['enablecolumns'];
             // Uid is added
-            $out .= '(id=' . $row['uid'] . ')';
+            $out .= 'id=' . $row['uid'];
             if ($table == 'pages' && $row['alias']) {
                 $out .= ' / ' . $row['alias'];
             }
-            if ($GLOBALS['TCA'][$table]['ctrl']['versioningWS'] && $row['pid'] < 0) {
+            if (static::isTableWorkspaceEnabled($table) && $row['pid'] < 0) {
                 $out .= ' - v#1.' . $row['t3ver_id'];
             }
-            if ($GLOBALS['TCA'][$table]['ctrl']['versioningWS']) {
+            if (static::isTableWorkspaceEnabled($table)) {
                 switch (VersionState::cast($row['t3ver_state'])) {
                     case new VersionState(VersionState::NEW_PLACEHOLDER):
                         $out .= ' - PLH WSID#' . $row['t3ver_wsid'];
@@ -2097,20 +1815,14 @@ class BackendUtility
      *
      * @param string $table Table name, present in $GLOBALS['TCA']
      * @param string $col Field name
-     * @param string $printAllWrap Wrap value - set function description - this parameter is deprecated since TYPO3 6.2 and is removed two versions later. This parameter is a conceptual failure, as the content can then never be HSCed afterwards (which is how the method is used all the time), and then the code would be HSCed twice.
      * @return string or NULL if $col is not found in the TCA table
      */
-    public static function getItemLabel($table, $col, $printAllWrap = '')
+    public static function getItemLabel($table, $col)
     {
         // Check if column exists
         if (is_array($GLOBALS['TCA'][$table]) && is_array($GLOBALS['TCA'][$table]['columns'][$col])) {
             return $GLOBALS['TCA'][$table]['columns'][$col]['label'];
         }
-        if ($printAllWrap) {
-            GeneralUtility::deprecationLog('The third parameter of getItemLabel() is deprecated with TYPO3 CMS 6.2 and will be removed two versions later.');
-            $parts = explode('|', $printAllWrap);
-            return $parts[0] . $col . $parts[1];
-        }
 
         return null;
     }
@@ -2243,7 +1955,7 @@ class BackendUtility
      */
     public static function getNoRecordTitle($prep = false)
     {
-        $noTitle = '[' . static::getLanguageService()->sL('LLL:EXT:lang/locallang_core.xlf:labels.no_title', true) . ']';
+        $noTitle = '[' . htmlspecialchars(static::getLanguageService()->sL('LLL:EXT:lang/locallang_core.xlf:labels.no_title')) . ']';
         if ($prep) {
             $noTitle = '<em>' . $noTitle . '</em>';
         }
@@ -2615,7 +2327,7 @@ class BackendUtility
                 $fields[] = $prefix . $fieldN;
             }
         }
-        if ($GLOBALS['TCA'][$table]['ctrl']['versioningWS']) {
+        if (static::isTableWorkspaceEnabled($table)) {
             $fields[] = $prefix . 't3ver_id';
             $fields[] = $prefix . 't3ver_state';
             $fields[] = $prefix . 't3ver_wsid';
@@ -2655,9 +2367,11 @@ class BackendUtility
      * @param array $defaults Defaults
      * @param string $dataPrefix Prefix for formfields
      * @return string HTML for a form.
+     * @deprecated since TYPO3 CMS 8, will be removed in TYPO3 CMS 9.
      */
     public static function makeConfigForm($configArray, $defaults, $dataPrefix)
     {
+        GeneralUtility::logDeprecatedFunction();
         $params = $defaults;
         $lines = array();
         if (is_array($configArray)) {
@@ -2710,30 +2424,6 @@ class BackendUtility
      * Backend Modules API functions
      *
      *******************************************/
-    /**
-     * Returns help-text icon if configured for.
-     * TCA_DESCR must be loaded prior to this function
-     *
-     * Please note: since TYPO3 4.5 the UX team decided to not use CSH in its former way,
-     * but to wrap the given text (where before the help icon was, and you could hover over it)
-     * Please also note that since TYPO3 4.5 the option to enable help (none, icon only, full text)
-     * was completely removed.
-     *
-     * @param string $table Table name
-     * @param string $field Field name
-     * @param string $_ UNUSED
-     * @param bool $force Force display of icon no matter BE_USER setting for help
-     * @return string HTML content for a help icon/text
-     * @deprecated since TYPO3 CMS 7, will be removed in TYPO3 CMS 8, use cshItem() instead
-     */
-    public static function helpTextIcon($table, $field, $_ = '', $force = false)
-    {
-        GeneralUtility::logDeprecatedFunction();
-        if (is_array($GLOBALS['TCA_DESCR'][$table]) && is_array($GLOBALS['TCA_DESCR'][$table]['columns'][$field])) {
-            return self::wrapInHelp($table, $field);
-        }
-        return '';
-    }
 
     /**
      * Returns CSH help text (description), if configured for, as an array (title, description)
@@ -2758,8 +2448,10 @@ class BackendUtility
             if ($data['alttitle']) {
                 $output['title'] = $data['alttitle'];
             }
-            // If we have more information to show
-            if ($data['image_descr'] || $data['seeAlso'] || $data['details'] || $data['syntax']) {
+            // If we have more information to show and access to the cshmanual
+            if (($data['image_descr'] || $data['seeAlso'] || $data['details'] || $data['syntax'])
+                && static::getBackendUserAuthentication()->check('modules', 'help_CshmanualCshmanual')
+            ) {
                 $output['moreInfo'] = true;
             }
             // Add description
@@ -2785,7 +2477,7 @@ class BackendUtility
         $arrow = '';
         // Put header before the rest of the text
         if ($helpTextArray['title'] !== null) {
-            $output .= '<h2 class="t3-row-header">' . $helpTextArray['title'] . '</h2>';
+            $output .= '<h2>' . $helpTextArray['title'] . '</h2>';
         }
         // Add see also arrow if we have more info
         if ($helpTextArray['moreInfo']) {
@@ -2814,6 +2506,10 @@ class BackendUtility
      */
     public static function wrapInHelp($table, $field, $text = '', array $overloadHelpText = array())
     {
+        if (!ExtensionManagementUtility::isLoaded('context_help')) {
+            return $text;
+        }
+
         // Initialize some variables
         $helpText = '';
         $abbrClassAdd = '';
@@ -2850,7 +2546,7 @@ class BackendUtility
             $wrappedText .= '>' . $text . '</span>';
             return $wrappedText;
         }
-        return '';
+        return $text;
     }
 
     /**
@@ -2862,7 +2558,6 @@ class BackendUtility
      * @param string $_ (unused)
      * @param string $wrap Wrap code for icon-mode, splitted by "|". Not used for full-text mode.
      * @return string HTML content for help text
-     * @see helpTextIcon()
      */
     public static function cshItem($table, $field, $_ = '', $wrap = '')
     {
@@ -2939,6 +2634,18 @@ class BackendUtility
             $previewUrl = self::createPreviewUrl($pageUid, $rootLine, $anchorSection, $additionalGetVars, $viewScript);
         }
 
+        if (
+            isset($GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS']['t3lib/class.t3lib_befunc.php']['viewOnClickClass'])
+            && is_array($GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS']['t3lib/class.t3lib_befunc.php']['viewOnClickClass'])
+        ) {
+            foreach ($GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS']['t3lib/class.t3lib_befunc.php']['viewOnClickClass'] as $className) {
+                $hookObj = GeneralUtility::makeInstance($className);
+                if (method_exists($hookObj, 'postProcess')) {
+                    $previewUrl = $hookObj->postProcess($previewUrl, $pageUid, $rootLine, $anchorSection, $viewScript, $additionalGetVars, $switchFocus);
+                }
+            }
+        }
+
         $onclickCode = 'var previewWin = window.open(' . GeneralUtility::quoteJSvalue($previewUrl) . ',\'newTYPO3frontendWindow\');' . ($switchFocus ? 'previewWin.focus();' : '');
         return $onclickCode;
     }
@@ -3483,19 +3190,17 @@ class BackendUtility
      *
      * @param string $moduleName Name of the module
      * @param array $urlParameters URL parameters that should be added as key value pairs
-     * @param bool|string $backPathOverride (unused)
-     * @param bool $returnAbsoluteUrl If set to TRUE, the URL returned will be absolute, $backPathOverride will be ignored in this case
      * @return string Calculated URL
      */
-    public static function getModuleUrl($moduleName, $urlParameters = array(), $backPathOverride = false, $returnAbsoluteUrl = false)
+    public static function getModuleUrl($moduleName, $urlParameters = array())
     {
         /** @var UriBuilder $uriBuilder */
         $uriBuilder = GeneralUtility::makeInstance(UriBuilder::class);
         try {
-            $uri = $uriBuilder->buildUriFromRoute($moduleName, $urlParameters, $returnAbsoluteUrl ? UriBuilder::ABSOLUTE_URL : UriBuilder::ABSOLUTE_PATH);
+            $uri = $uriBuilder->buildUriFromRoute($moduleName, $urlParameters);
         } catch (\TYPO3\CMS\Backend\Routing\Exception\RouteNotFoundException $e) {
             // no route registered, use the fallback logic to check for a module
-            $uri = $uriBuilder->buildUriFromModule($moduleName, $urlParameters, $returnAbsoluteUrl ? UriBuilder::ABSOLUTE_URL : UriBuilder::ABSOLUTE_PATH);
+            $uri = $uriBuilder->buildUriFromModule($moduleName, $urlParameters);
         }
         return (string)$uri;
     }
@@ -3509,20 +3214,20 @@ class BackendUtility
      *
      * @param string $ajaxIdentifier Identifier of the AJAX callback
      * @param array $urlParameters URL parameters that should be added as key value pairs
-     * @param bool $backPathOverride (unused)
-     * @param bool $returnAbsoluteUrl If set to TRUE, the URL returned will be absolute, $backPathOverride will be ignored in this case
      * @return string Calculated URL
+     * @deprecated since TYPO3 v8, will be removed in TYPO3 v9, use the UriBuilder directly.
      */
-    public static function getAjaxUrl($ajaxIdentifier, array $urlParameters = array(), $backPathOverride = false, $returnAbsoluteUrl = false)
+    public static function getAjaxUrl($ajaxIdentifier, array $urlParameters = array())
     {
+        GeneralUtility::logDeprecatedFunction();
         /** @var UriBuilder $uriBuilder */
         $uriBuilder = GeneralUtility::makeInstance(UriBuilder::class);
         try {
             $routeIdentifier = 'ajax_' . $ajaxIdentifier;
-            $uri = $uriBuilder->buildUriFromRoute($routeIdentifier, $urlParameters, $returnAbsoluteUrl ? UriBuilder::ABSOLUTE_URL : UriBuilder::ABSOLUTE_PATH);
+            $uri = $uriBuilder->buildUriFromRoute($routeIdentifier, $urlParameters);
         } catch (\TYPO3\CMS\Backend\Routing\Exception\RouteNotFoundException $e) {
             // no route registered, use the fallback logic to check for a module
-            $uri = $uriBuilder->buildUriFromAjaxId($ajaxIdentifier, $urlParameters, $returnAbsoluteUrl ? UriBuilder::ABSOLUTE_URL : UriBuilder::ABSOLUTE_PATH);
+            $uri = $uriBuilder->buildUriFromAjaxId($ajaxIdentifier, $urlParameters);
         }
         return (string)$uri;
     }
@@ -3534,30 +3239,16 @@ class BackendUtility
      * @param string $linkTitle title for the link tag
      * @param string $linkText optional link text after the icon
      * @return string A complete <a href=""> tag
+     * @deprecated since TYPO3 v8, will be removed in TYPO3 v9, use getModuleUrl and IconFactory methods directly
      */
     public static function getListViewLink($urlParameters = array(), $linkTitle = '', $linkText = '')
     {
+        GeneralUtility::logDeprecatedFunction();
         /** @var IconFactory $iconFactory */
         $iconFactory = GeneralUtility::makeInstance(IconFactory::class);
         return '<a href="' . htmlspecialchars(self::getModuleUrl('web_list', $urlParameters)) . '" title="' . htmlspecialchars($linkTitle) . '">' . $iconFactory->getIcon('actions-system-list-open', Icon::SIZE_SMALL)->render() . htmlspecialchars($linkText) . '</a>';
     }
 
-    /**
-     * Generates a token and returns a parameter for the URL
-     *
-     * @param string $formName Context of the token
-     * @param string $tokenName The name of the token GET variable
-     * @throws \InvalidArgumentException
-     * @return string A URL GET variable including ampersand
-     * @deprecated since TYPO3 7, will be removed in TYPO3 8. All backend modules and routes are secured by default now. If you need a url parameter with a token, use the form protection directly.
-     */
-    public static function getUrlToken($formName = 'securityToken', $tokenName = 'formToken')
-    {
-        GeneralUtility::logDeprecatedFunction();
-        $formProtection = FormProtectionFactory::get();
-        return '&' . $tokenName . '=' . $formProtection->generateToken($formName);
-    }
-
     /*******************************************
      *
      * Core
@@ -3642,7 +3333,7 @@ class BackendUtility
                     $userName,
                     self::calcAge($GLOBALS['EXEC_TIME'] - $row['tstamp'], $lang->sL('LLL:EXT:lang/locallang_core.xlf:labels.minutesHoursDaysYears'))
                 );
-                if ($row['record_pid'] && !isset($GLOBALS['LOCKED_RECORDS'][($row['record_table'] . ':' . $row['record_pid'])])) {
+                if ($row['record_pid'] && !isset($GLOBALS['LOCKED_RECORDS'][$row['record_table'] . ':' . $row['record_pid']])) {
                     $GLOBALS['LOCKED_RECORDS']['pages:' . $row['record_pid']]['msg'] = sprintf(
                         $lang->sL('LLL:EXT:lang/locallang_core.xlf:labels.lockedRecordUser_content'),
                         $userType,
@@ -3657,125 +3348,6 @@ class BackendUtility
     }
 
     /**
-     * Returns select statement for MM relations (as used by TCEFORMs etc)
-     *
-     * @param array $fieldConfig Configuration array for the field, taken from $GLOBALS['TCA']
-     * @param string $field Field name
-     * @param array $TSconfig TSconfig array from which to get further configuration settings for the field name
-     * @return string Part of query
-     * @internal
-     * @deprecated since TYPO3 CMS 7, will be removed in TYPO3 CMS 8
-     */
-    public static function exec_foreign_table_where_query($fieldConfig, $field = '', $TSconfig = array())
-    {
-        GeneralUtility::logDeprecatedFunction();
-        $foreign_table = $fieldConfig['config']['foreign_table'];
-        $rootLevel = $GLOBALS['TCA'][$foreign_table]['ctrl']['rootLevel'];
-        $fTWHERE = $fieldConfig['config']['foreign_table_where'];
-        $fTWHERE = static::replaceMarkersInWhereClause($fTWHERE, $foreign_table, $field, $TSconfig);
-        $db = static::getDatabaseConnection();
-        $wgolParts = $db->splitGroupOrderLimit($fTWHERE);
-        // rootLevel = -1 means that elements can be on the rootlevel OR on any page (pid!=-1)
-        // rootLevel = 0 means that elements are not allowed on root level
-        // rootLevel = 1 means that elements are only on the root level (pid=0)
-        if ($rootLevel == 1 || $rootLevel == -1) {
-            $pidWhere = $foreign_table . '.pid' . (($rootLevel == -1) ? '<>-1' : '=0');
-            $queryParts = array(
-                'SELECT' => self::getCommonSelectFields($foreign_table, $foreign_table . '.'),
-                'FROM' => $foreign_table,
-                'WHERE' => $pidWhere . ' ' . self::deleteClause($foreign_table) . ' ' . $wgolParts['WHERE'],
-                'GROUPBY' => $wgolParts['GROUPBY'],
-                'ORDERBY' => $wgolParts['ORDERBY'],
-                'LIMIT' => $wgolParts['LIMIT']
-            );
-        } else {
-            $pageClause = static::getBackendUserAuthentication()->getPagePermsClause(1);
-            if ($foreign_table != 'pages') {
-                $queryParts = array(
-                    'SELECT' => self::getCommonSelectFields($foreign_table, $foreign_table . '.'),
-                    'FROM' => $foreign_table . ', pages',
-                    'WHERE' => 'pages.uid=' . $foreign_table . '.pid
-                                                               AND pages.deleted=0 ' . self::deleteClause($foreign_table) . ' AND ' . $pageClause . ' ' . $wgolParts['WHERE'],
-                    'GROUPBY' => $wgolParts['GROUPBY'],
-                    'ORDERBY' => $wgolParts['ORDERBY'],
-                    'LIMIT' => $wgolParts['LIMIT']
-                );
-            } else {
-                $queryParts = array(
-                    'SELECT' => self::getCommonSelectFields($foreign_table, $foreign_table . '.'),
-                    'FROM' => 'pages',
-                    'WHERE' => 'pages.deleted=0
-                                                               AND ' . $pageClause . ' ' . $wgolParts['WHERE'],
-                    'GROUPBY' => $wgolParts['GROUPBY'],
-                    'ORDERBY' => $wgolParts['ORDERBY'],
-                    'LIMIT' => $wgolParts['LIMIT']
-                );
-            }
-        }
-        return $db->exec_SELECT_queryArray($queryParts);
-    }
-
-    /**
-     * Replaces all special markers in a where clause.
-     * Special markers are:
-     * ###REC_FIELD_[field name]###
-     * ###THIS_UID### - is current element uid (zero if new).
-     * ###CURRENT_PID### - is the current page id (pid of the record).
-     * ###STORAGE_PID###
-     * ###SITEROOT###
-     * ###PAGE_TSCONFIG_ID### - a value you can set from Page TSconfig dynamically.
-     * ###PAGE_TSCONFIG_IDLIST### - a value you can set from Page TSconfig dynamically.
-     * ###PAGE_TSCONFIG_STR### - a value you can set from Page TSconfig dynamically.
-     *
-     * @param string $whereClause Where clause with markers
-     * @param string $table Name of the table of the current record row
-     * @param string $field Field name
-     * @param array $tsConfig TSconfig array from which to get further configuration settings for the field name
-     * @return string
-     * @deprecated since TYPO3 CMS 7, will be removed in TYPO3 CMS 8
-     */
-    public static function replaceMarkersInWhereClause($whereClause, $table, $field = '', $tsConfig = array())
-    {
-        GeneralUtility::logDeprecatedFunction();
-        $db = static::getDatabaseConnection();
-        if (strstr($whereClause, '###REC_FIELD_')) {
-            $whereClauseParts = explode('###REC_FIELD_', $whereClause);
-            foreach ($whereClauseParts as $key => $value) {
-                if ($key) {
-                    $whereClauseSubarts = explode('###', $value, 2);
-                    if (substr($whereClauseParts[0], -1) === '\'' && $whereClauseSubarts[1][0] === '\'') {
-                        $whereClauseParts[$key] = $db->quoteStr($tsConfig['_THIS_ROW'][$whereClauseSubarts[0]], $table) . $whereClauseSubarts[1];
-                    } else {
-                        $whereClauseParts[$key] = $db->fullQuoteStr($tsConfig['_THIS_ROW'][$whereClauseSubarts[0]], $table) . $whereClauseSubarts[1];
-                    }
-                }
-            }
-            $whereClause = implode('', $whereClauseParts);
-        }
-        return str_replace(
-            array(
-                '###CURRENT_PID###',
-                '###THIS_UID###',
-                '###STORAGE_PID###',
-                '###SITEROOT###',
-                '###PAGE_TSCONFIG_ID###',
-                '###PAGE_TSCONFIG_IDLIST###',
-                '###PAGE_TSCONFIG_STR###'
-            ),
-            array(
-                (int)$tsConfig['_CURRENT_PID'],
-                (int)$tsConfig['_THIS_UID'],
-                (int)$tsConfig['_STORAGE_PID'],
-                (int)$tsConfig['_SITEROOT'],
-                (int)$tsConfig[$field]['PAGE_TSCONFIG_ID'],
-                $db->cleanIntList($tsConfig[$field]['PAGE_TSCONFIG_IDLIST']),
-                $db->quoteStr($tsConfig[$field]['PAGE_TSCONFIG_STR'], $table)
-            ),
-            $whereClause
-        );
-    }
-
-    /**
      * Returns TSConfig for the TCEFORM object in Page TSconfig.
      * Used in TCEFORMs
      *
@@ -3787,12 +3359,12 @@ class BackendUtility
     {
         self::fixVersioningPid($table, $row);
         $res = array();
-        $typeVal = self::getTCAtypeValue($table, $row);
         // Get main config for the table
         list($TScID, $cPid) = self::getTSCpid($table, $row['uid'], $row['pid']);
         if ($TScID >= 0) {
             $tempConf = static::getBackendUserAuthentication()->getTSConfig('TCEFORM.' . $table, self::getPagesTSconfig($TScID));
             if (is_array($tempConf['properties'])) {
+                $typeVal = self::getTCAtypeValue($table, $row);
                 foreach ($tempConf['properties'] as $key => $val) {
                     if (is_array($val)) {
                         $fieldN = substr($key, 0, -1);
@@ -3809,15 +3381,6 @@ class BackendUtility
         $res['_THIS_UID'] = $row['uid'];
         // So the row will be passed to foreign_table_where_query()
         $res['_THIS_ROW'] = $row;
-        $rootLine = self::BEgetRootLine($TScID, '', true);
-        foreach ($rootLine as $rC) {
-            if (!$res['_STORAGE_PID']) {
-                $res['_STORAGE_PID'] = (int)$rC['storage_pid'];
-            }
-            if (!$res['_SITEROOT']) {
-                $res['_SITEROOT'] = $rC['is_siteroot'] ? (int)$rC['uid'] : 0;
-            }
-        }
         return $res;
     }
 
@@ -4000,42 +3563,6 @@ class BackendUtility
     }
 
     /**
-     * Returns first possible RTE object if available.
-     * Usage: $RTEobj = BackendUtility::RTEgetObj();
-     *
-     * @return mixed If available, returns RTE object, otherwise an array of messages from possible RTEs
-     * @deprecated since TYPO3 CMS 7, will be removed in TYPO3 CMS 8
-     */
-    public static function RTEgetObj()
-    {
-        GeneralUtility::logDeprecatedFunction();
-        // If no RTE object has been set previously, try to create it:
-        if (!isset($GLOBALS['T3_VAR']['RTEobj'])) {
-            // Set the object string to blank by default:
-            $GLOBALS['T3_VAR']['RTEobj'] = array();
-            // Traverse registered RTEs:
-            if (is_array($GLOBALS['TYPO3_CONF_VARS']['BE']['RTE_reg'])) {
-                foreach ($GLOBALS['TYPO3_CONF_VARS']['BE']['RTE_reg'] as $rteObjCfg) {
-                    $rteObj = GeneralUtility::getUserObj($rteObjCfg['objRef']);
-                    if (is_object($rteObj)) {
-                        if ($rteObj->isAvailable()) {
-                            $GLOBALS['T3_VAR']['RTEobj'] = $rteObj;
-                            break;
-                        } else {
-                            $GLOBALS['T3_VAR']['RTEobj'] = array_merge($GLOBALS['T3_VAR']['RTEobj'], $rteObj->errorLog);
-                        }
-                    }
-                }
-            }
-            if (empty($GLOBALS['T3_VAR']['RTEobj'])) {
-                $GLOBALS['T3_VAR']['RTEobj'][] = 'No RTEs configured at all';
-            }
-        }
-        // Return RTE object (if any!)
-        return $GLOBALS['T3_VAR']['RTEobj'];
-    }
-
-    /**
      * Returns soft-reference parser for the softRef processing type
      * Usage: $softRefObj = &BackendUtility::softRefParserObj('[parser key]');
      *
@@ -4052,15 +3579,11 @@ class BackendUtility
             $objRef = null;
             if (isset($GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS']['GLOBAL']['softRefParser'][$spKey])) {
                 $objRef = $GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS']['GLOBAL']['softRefParser'][$spKey];
-            } elseif (isset($GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS']['GLOBAL']['softRefParser_GL'][$spKey])) {
-                GeneralUtility::deprecationLog('The hook softRefParser_GL (used with parser key "'
-                    . $spKey . '") is deprecated since TYPO3 CMS 7 and will be removed in TYPO3 CMS 8');
-                $objRef = $GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS']['GLOBAL']['softRefParser_GL'][$spKey];
-            }
-            if ($objRef) {
-                $softRefParserObj = GeneralUtility::getUserObj($objRef);
-                if (is_object($softRefParserObj)) {
-                    $GLOBALS['T3_VAR']['softRefParser'][$spKey] = $softRefParserObj;
+                if ($objRef) {
+                    $softRefParserObj = GeneralUtility::getUserObj($objRef);
+                    if (is_object($softRefParserObj)) {
+                        $GLOBALS['T3_VAR']['softRefParser'][$spKey] = $softRefParserObj;
+                    }
                 }
             }
         }
@@ -4092,12 +3615,6 @@ class BackendUtility
             return $runtimeCache->get($cacheId);
         }
 
-        // Looking for global parsers:
-        if (is_array($GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS']['GLOBAL']['softRefParser_GL']) && !empty($GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS']['GLOBAL']['softRefParser_GL'])) {
-            GeneralUtility::deprecationLog('The hook softRefParser_GL is deprecated since TYPO3 CMS 7 and will be removed in TYPO3 CMS 8');
-            $parserList = implode(',', array_keys($GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS']['GLOBAL']['softRefParser_GL'])) . ',' . $parserList;
-        }
-
         // Return immediately if list is blank:
         if ($parserList === '') {
             $runtimeCache->set($cacheId, false);
@@ -4210,7 +3727,7 @@ class BackendUtility
     {
         $realPid = 0;
         $outputRows = array();
-        if ($GLOBALS['TCA'][$table] && $GLOBALS['TCA'][$table]['ctrl']['versioningWS']) {
+        if ($GLOBALS['TCA'][$table] && static::isTableWorkspaceEnabled($table)) {
             if (is_array($row) && !$includeDeletedRecords) {
                 $row['_CURRENT_VERSION'] = true;
                 $realPid = $row['pid'];
@@ -4280,7 +3797,7 @@ class BackendUtility
             return;
         }
         // Check that the input record is an offline version from a table that supports versioning:
-        if (is_array($rr) && $rr['pid'] == -1 && $GLOBALS['TCA'][$table]['ctrl']['versioningWS']) {
+        if (is_array($rr) && $rr['pid'] == -1 && static::isTableWorkspaceEnabled($table)) {
             // Check values for t3ver_oid and t3ver_wsid:
             if (isset($rr['t3ver_oid']) && isset($rr['t3ver_wsid'])) {
                 // If "t3ver_oid" is already a field, just set this:
@@ -4362,7 +3879,7 @@ class BackendUtility
             // If version was found, swap the default record with that one.
             if (is_array($wsAlt)) {
                 // Check if this is in move-state:
-                if ($previewMovePlaceholders && !$movePldSwap && ($table == 'pages' || (int)$GLOBALS['TCA'][$table]['ctrl']['versioningWS'] >= 2) && $unsetMovePointers) {
+                if ($previewMovePlaceholders && !$movePldSwap && static::isTableWorkspaceEnabled($table) && $unsetMovePointers) {
                     // Only for WS ver 2... (moving)
                     // If t3ver_state is not found, then find it... (but we like best if it is here...)
                     if (!isset($wsAlt['t3ver_state'])) {
@@ -4414,8 +3931,7 @@ class BackendUtility
      */
     public static function movePlhOL($table, &$row)
     {
-        // Only for WS ver 2... (moving)
-        if ($table == 'pages' || (int)$GLOBALS['TCA'][$table]['ctrl']['versioningWS'] >= 2) {
+        if (static::isTableWorkspaceEnabled($table)) {
             // If t3ver_move_id or t3ver_state is not found, then find it... (but we like best if it is here...)
             if (!isset($row['t3ver_move_id']) || !isset($row['t3ver_state'])) {
                 $moveIDRec = self::getRecord($table, $row['uid'], 't3ver_move_id, t3ver_state');
@@ -4448,7 +3964,7 @@ class BackendUtility
     public static function getWorkspaceVersionOfRecord($workspace, $table, $uid, $fields = '*')
     {
         if (ExtensionManagementUtility::isLoaded('version')) {
-            if ($workspace !== 0 && $GLOBALS['TCA'][$table] && $GLOBALS['TCA'][$table]['ctrl']['versioningWS']) {
+            if ($workspace !== 0 && $GLOBALS['TCA'][$table] && self::isTableWorkspaceEnabled($table)) {
                 // Select workspace version of record:
                 $row = static::getDatabaseConnection()->exec_SELECTgetSingleRow($fields, $table, 'pid=-1 AND ' . 't3ver_oid=' . (int)$uid . ' AND ' . 't3ver_wsid=' . (int)$workspace . self::deleteClause($table));
                 if (is_array($row)) {
@@ -4504,7 +4020,7 @@ class BackendUtility
      */
     public static function versioningPlaceholderClause($table)
     {
-        if ($GLOBALS['TCA'][$table] && $GLOBALS['TCA'][$table]['ctrl']['versioningWS']) {
+        if (static::isTableWorkspaceEnabled($table)) {
             $currentWorkspace = (int)static::getBackendUserAuthentication()->workspace;
             return ' AND (' . $table . '.t3ver_state <= ' . new VersionState(VersionState::DEFAULT_STATE) . ' OR ' . $table . '.t3ver_wsid = ' . $currentWorkspace . ')';
         }
@@ -4533,58 +4049,6 @@ class BackendUtility
     }
 
     /**
-     * Count number of versions on a page
-     *
-     * @param int $workspace Workspace ID
-     * @param int $pageId Page ID
-     * @return array Overview of records
-     * @deprecated since TYPO3 CMS 7. Will be removed with TYPO3 CMS 8. Please use \TYPO3\CMS\Workspaces\Service\WorkspaceService::hasPageRecordVersions to check for record versions.
-     */
-    public static function countVersionsOfRecordsOnPage($workspace, $pageId)
-    {
-        GeneralUtility::logDeprecatedFunction();
-        if ((int)$workspace === 0) {
-            return array();
-        }
-        $output = array();
-        foreach ($GLOBALS['TCA'] as $tableName => $cfg) {
-            if ($tableName != 'pages' && $cfg['ctrl']['versioningWS']) {
-                $joinStatement = 'A.t3ver_oid=B.uid';
-                // Consider records that are moved to a different page
-                if (self::isTableMovePlaceholderAware($tableName)) {
-                    $movePointer = new VersionState(VersionState::MOVE_POINTER);
-                    $joinStatement = '(A.t3ver_oid=B.uid AND A.t3ver_state<>' . $movePointer
-                        . ' OR A.t3ver_oid=B.t3ver_move_id AND A.t3ver_state=' . $movePointer . ')';
-                }
-                // Select all records from this table in the database from the workspace
-                // This joins the online version with the offline version as tables A and B
-                $output[$tableName] = static::getDatabaseConnection()->exec_SELECTgetRows(
-                    'B.uid as live_uid, A.uid as offline_uid',
-                    $tableName . ' A,' . $tableName . ' B',
-                    'A.pid=-1' . ' AND B.pid=' . (int)$pageId
-                        . ' AND A.t3ver_wsid=' . (int)$workspace . ' AND ' . $joinStatement
-                        . self::deleteClause($tableName, 'A') . self::deleteClause($tableName, 'B')
-                );
-                if (!is_array($output[$tableName]) || empty($output[$tableName])) {
-                    unset($output[$tableName]);
-                }
-            }
-        }
-        if (is_array($GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS']['t3lib/class.t3lib_befunc.php']['countVersionsOfRecordsOnPage'])) {
-            $reference = null;
-            $parameters = array(
-                'workspace' => 'workspace',
-                'pageId' => $pageId,
-                'versions' => &$output,
-            );
-            foreach ($GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS']['t3lib/class.t3lib_befunc.php']['countVersionsOfRecordsOnPage'] as $hookFunction) {
-                GeneralUtility::callUserFunction($hookFunction, $parameters, $reference);
-            }
-        }
-        return $output;
-    }
-
-    /**
      * Performs mapping of new uids to new versions UID in case of import inside a workspace.
      *
      * @param string $table Table name
@@ -4611,7 +4075,7 @@ class BackendUtility
         if ($workspace === null) {
             $workspace = static::getBackendUserAuthentication()->workspace;
         }
-        if ((int)$workspace !== 0 && $GLOBALS['TCA'][$table] && (int)$GLOBALS['TCA'][$table]['ctrl']['versioningWS'] >= 2) {
+        if ((int)$workspace !== 0 && $GLOBALS['TCA'][$table] && static::isTableWorkspaceEnabled($table)) {
             // Select workspace version of record:
             $row = static::getDatabaseConnection()->exec_SELECTgetSingleRow(
                 $fields,
@@ -4666,19 +4130,6 @@ class BackendUtility
     }
 
     /**
-     * Returns "web" if the $path (absolute) is within the DOCUMENT ROOT - and thereby qualifies as a "web" folder.
-     *
-     * @param string $path Path to evaluate
-     * @return bool
-     * @deprecated since TYPO3 CMS 7, will be removed in TYPO3 CMS 8
-     */
-    public static function getPathType_web_nonweb($path)
-    {
-        GeneralUtility::logDeprecatedFunction();
-        return GeneralUtility::isFirstPartOfStr($path, GeneralUtility::getIndpEnv('TYPO3_DOCUMENT_ROOT')) ? 'web' : '';
-    }
-
-    /**
      * Creates ADMCMD parameters for the "viewpage" extension / frontend
      *
      * @param array $pageInfo Page record
@@ -4716,9 +4167,11 @@ class BackendUtility
      *
      * @param string $params String of parameters on multiple lines to parse into key-value pairs (see function description)
      * @return array
+     * @deprecated since TYPO3 CMS 8, will be removed in TYPO3 CMS 9.
      */
     public static function processParams($params)
     {
+        GeneralUtility::logDeprecatedFunction();
         $paramArr = array();
         $lines = explode(LF, $params);
         foreach ($lines as $val) {
@@ -4765,18 +4218,6 @@ class BackendUtility
     }
 
     /**
-     * Determines whether a table is aware of using move placeholders,
-     * which means 'versioningWS' is set to 2.
-     *
-     * @param string $table
-     * @return bool
-     */
-    public static function isTableMovePlaceholderAware($table)
-    {
-        return (self::isTableWorkspaceEnabled($table) && (int)$GLOBALS['TCA'][$table]['ctrl']['versioningWS'] === 2);
-    }
-
-    /**
      * Gets the TCA configuration of a field.
      *
      * @param string $table Name of the table