[BUGFIX] Fix several typos in php comments
[Packages/TYPO3.CMS.git] / typo3 / sysext / backend / Classes / Tree / View / FolderTreeView.php
index 9cadfd1..3c9273e 100644 (file)
@@ -17,6 +17,7 @@ namespace TYPO3\CMS\Backend\Tree\View;
 use TYPO3\CMS\Backend\Utility\BackendUtility;
 use TYPO3\CMS\Core\Imaging\Icon;
 use TYPO3\CMS\Core\Imaging\IconFactory;
+use TYPO3\CMS\Core\Localization\LanguageService;
 use TYPO3\CMS\Core\Messaging\FlashMessage;
 use TYPO3\CMS\Core\Messaging\FlashMessageService;
 use TYPO3\CMS\Core\Resource\Folder;
@@ -24,11 +25,12 @@ use TYPO3\CMS\Core\Resource\FolderInterface;
 use TYPO3\CMS\Core\Resource\InaccessibleFolder;
 use TYPO3\CMS\Core\Resource\ResourceStorage;
 use TYPO3\CMS\Core\Utility\GeneralUtility;
-use TYPO3\CMS\Lang\LanguageService;
 
 /**
  * Generate a folder tree,
  * specially made for browsing folders in the File module
+ *
+ * @internal This class is a TYPO3 Backend implementation and is not considered part of the Public TYPO3 API.
  */
 class FolderTreeView extends AbstractTreeView
 {
@@ -37,7 +39,7 @@ class FolderTreeView extends AbstractTreeView
      *
      * @var ResourceStorage[]
      */
-    protected $storages = null;
+    protected $storages;
 
     /**
      * @var array
@@ -63,12 +65,6 @@ class FolderTreeView extends AbstractTreeView
     protected $iconFactory;
 
     /**
-     * If file-drag mode is set, temp and recycler folders are filtered out.
-     * @var bool
-     */
-    public $ext_noTempRecyclerDirs = false;
-
-    /**
      * override to not use a title attribute
      * @var string
      */
@@ -133,11 +129,10 @@ class FolderTreeView extends AbstractTreeView
     public function PMiconATagWrap($icon, $cmd, $isExpand = true)
     {
         if (empty($this->scope)) {
-            $this->scope = array(
-                'class' => get_class($this),
+            $this->scope = [
+                'class' => static::class,
                 'script' => $this->thisScript,
-                'ext_noTempRecyclerDirs' => $this->ext_noTempRecyclerDirs
-            );
+            ];
         }
 
         if ($this->thisScript) {
@@ -146,9 +141,8 @@ class FolderTreeView extends AbstractTreeView
             $scopeHash = GeneralUtility::hmac($scopeData);
             $js = htmlspecialchars('Tree.load(' . GeneralUtility::quoteJSvalue($cmd) . ', ' . (int)$isExpand . ', this, ' . GeneralUtility::quoteJSvalue($scopeData) . ', ' . GeneralUtility::quoteJSvalue($scopeHash) . ');');
             return '<a class="list-tree-control' . (!$isExpand ? ' list-tree-control-open' : ' list-tree-control-closed') . '" onclick="' . $js . '"><i class="fa"></i></a>';
-        } else {
-            return $icon;
         }
+        return $icon;
     }
 
     /**
@@ -179,7 +173,8 @@ class FolderTreeView extends AbstractTreeView
         if (!$this->ext_IconMode) {
             // Check storage access to wrap with click menu
             if (!$folderObject instanceof InaccessibleFolder) {
-                $theFolderIcon = BackendUtility::wrapClickMenuOnIcon($icon, $folderObject->getCombinedIdentifier(), '', 0);
+                $tableName = $this->getTableNameForClickMenu($folderObject);
+                $theFolderIcon = BackendUtility::wrapClickMenuOnIcon($icon, $tableName, $folderObject->getCombinedIdentifier(), 'tree');
             }
         } elseif ($this->ext_IconMode === 'titlelink') {
             $aOnClick = 'return jumpTo(' . GeneralUtility::quoteJSvalue($this->getJumpToParam($folderObject)) . ',this,' . GeneralUtility::quoteJSvalue($this->domIdPrefix . $this->getId($folderObject)) . ',' . $this->bank . ');';
@@ -205,7 +200,8 @@ class FolderTreeView extends AbstractTreeView
             return $title;
         }
         $aOnClick = 'return jumpTo(' . GeneralUtility::quoteJSvalue($this->getJumpToParam($folderObject)) . ', this, ' . GeneralUtility::quoteJSvalue($this->domIdPrefix . $this->getId($folderObject)) . ', ' . $bank . ');';
-        $clickMenuParts = BackendUtility::wrapClickMenuOnIcon('', $folderObject->getCombinedIdentifier(), '', 0, ('&bank=' . $this->bank), '', true);
+        $tableName = $this->getTableNameForClickMenu($folderObject);
+        $clickMenuParts = BackendUtility::wrapClickMenuOnIcon('', $tableName, $folderObject->getCombinedIdentifier(), 'tree', '', '', true);
 
         return '<a href="#" title="' . htmlspecialchars(strip_tags($title)) . '" onclick="' . htmlspecialchars($aOnClick) . '" ' . GeneralUtility::implodeAttributes($clickMenuParts) . '>' . $title . '</a>';
     }
@@ -219,7 +215,7 @@ class FolderTreeView extends AbstractTreeView
      */
     public function getId($folderObject)
     {
-        return GeneralUtility::md5Int($folderObject->getCombinedIdentifier());
+        return GeneralUtility::md5int($folderObject->getCombinedIdentifier());
     }
 
     /**
@@ -235,7 +231,7 @@ class FolderTreeView extends AbstractTreeView
     }
 
     /**
-     * Returns the title for the input record. If blank, a "no title" labele (localized) will be returned.
+     * Returns the title for the input record. If blank, a "no title" label (localized) will be returned.
      * '_title' is used for setting an alternative title for folders.
      *
      * @param array $row The input row array (where the key "_title" is used for the title)
@@ -244,7 +240,7 @@ class FolderTreeView extends AbstractTreeView
      */
     public function getTitleStr($row, $titleLen = 30)
     {
-        return $row['_title'] ?: parent::getTitleStr($row, $titleLen);
+        return $row['_title'] ?? parent::getTitleStr($row, $titleLen);
     }
 
     /**
@@ -270,7 +266,7 @@ class FolderTreeView extends AbstractTreeView
         // Get stored tree structure AND updating it if needed according to incoming PM GET var.
         $this->initializePositionSaving();
         // Init done:
-        $treeItems = array();
+        $treeItems = [];
         // Traverse mounts:
         foreach ($this->storages as $storageObject) {
             $this->getBrowseableTreeForStorage($storageObject);
@@ -284,31 +280,30 @@ class FolderTreeView extends AbstractTreeView
      * Get a tree for one storage
      *
      * @param ResourceStorage $storageObject
-     * @return void
      */
     public function getBrowseableTreeForStorage(ResourceStorage $storageObject)
     {
         // If there are filemounts, show each, otherwise just the rootlevel folder
         $fileMounts = $storageObject->getFileMounts();
-        $rootLevelFolders = array();
+        $rootLevelFolders = [];
         if (!empty($fileMounts)) {
             foreach ($fileMounts as $fileMountInfo) {
-                $rootLevelFolders[] = array(
+                $rootLevelFolders[] = [
                     'folder' => $fileMountInfo['folder'],
                     'name' => $fileMountInfo['title']
-                );
+                ];
             }
         } elseif ($this->BE_USER->isAdmin()) {
-            $rootLevelFolders[] = array(
+            $rootLevelFolders[] = [
                 'folder' => $storageObject->getRootLevelFolder(),
                 'name' => $storageObject->getName()
-            );
+            ];
         }
         // Clean the tree
         $this->reset();
         // Go through all "root level folders" of this tree (can be the rootlevel folder or any file mount points)
         foreach ($rootLevelFolders as $rootLevelFolderInfo) {
-            /** @var $rootLevelFolder Folder */
+            /** @var Folder $rootLevelFolder */
             $rootLevelFolder = $rootLevelFolderInfo['folder'];
             $rootLevelFolderName = $rootLevelFolderInfo['name'];
             $folderHashSpecUID = GeneralUtility::md5int($rootLevelFolder->getCombinedIdentifier());
@@ -329,26 +324,26 @@ class FolderTreeView extends AbstractTreeView
             // Mark a storage which is not online, as offline
             // maybe someday there will be a special icon for this
             if ($storageObject->isOnline() === false) {
-                $rootLevelFolderName .= ' (' . $this->getLanguageService()->sL('LLL:EXT:lang/locallang_mod_file.xlf:sys_file_storage.isOffline') . ')';
+                $rootLevelFolderName .= ' (' . $this->getLanguageService()->sL('LLL:EXT:core/Resources/Private/Language/locallang_mod_file.xlf:sys_file_storage.isOffline') . ')';
             }
             // Preparing rootRec for the mount
-            $icon = $this->iconFactory->getIconForResource($rootLevelFolder, Icon::SIZE_SMALL, null, array('mount-root' => true));
+            $icon = $this->iconFactory->getIconForResource($rootLevelFolder, Icon::SIZE_SMALL, null, ['mount-root' => true]);
             $firstHtml .= $this->wrapIcon($icon, $rootLevelFolder);
-            $row = array(
+            $row = [
                 'uid' => $folderHashSpecUID,
                 'title' => $rootLevelFolderName,
                 'path' => $rootLevelFolder->getCombinedIdentifier(),
                 'folder' => $rootLevelFolder
-            );
+            ];
             // Add the storage root to ->tree
-            $this->tree[] = array(
+            $this->tree[] = [
                 'HTML' => $firstHtml,
                 'row' => $row,
                 'bank' => $this->bank,
                 // hasSub is TRUE when the root of the storage is expanded
                 'hasSub' => $isOpen && $storageObject->isBrowsable(),
                 'invertedDepth' => 1000,
-            );
+            ];
             // If the mount is expanded, go down:
             if ($isOpen && $storageObject->isBrowsable()) {
                 // Set depth:
@@ -374,7 +369,7 @@ class FolderTreeView extends AbstractTreeView
         // This generates the directory tree
         /* array of \TYPO3\CMS\Core\Resource\Folder */
         if ($folderObject instanceof InaccessibleFolder) {
-            $subFolders = array();
+            $subFolders = [];
         } else {
             $subFolders = $folderObject->getSubfolders();
             $subFolders = \TYPO3\CMS\Core\Resource\Utility\ListUtility::resolveSpecialFolderNames($subFolders);
@@ -389,19 +384,19 @@ class FolderTreeView extends AbstractTreeView
         foreach ($subFolders as $subFolderName => $subFolder) {
             $subFolderCounter++;
             // Reserve space.
-            $this->tree[] = array();
+            $this->tree[] = [];
             // Get the key for this space
             end($this->tree);
             $isLocked = $subFolder instanceof InaccessibleFolder;
             $treeKey = key($this->tree);
             $specUID = GeneralUtility::md5int($subFolder->getCombinedIdentifier());
             $this->specUIDmap[$specUID] = $subFolder->getCombinedIdentifier();
-            $row = array(
+            $row = [
                 'uid' => $specUID,
                 'path' => $subFolder->getCombinedIdentifier(),
                 'title' => $subFolderName,
                 'folder' => $subFolder
-            );
+            ];
             // Make a recursive call to the next level
             if (!$isLocked && $depth > 1 && $this->expandNext($specUID)) {
                 $nextCount = $this->getFolderTree($subFolder, $depth - 1, $type);
@@ -422,12 +417,12 @@ class FolderTreeView extends AbstractTreeView
                     $row['_title'] = '<strong>' . $subFolderName . '</strong>';
                 }
                 $icon = '<span title="' . htmlspecialchars($subFolderName) . '">'
-                    . $this->iconFactory->getIconForResource($subFolder, Icon::SIZE_SMALL, null, array('folder-open' => (bool)$isOpen))
+                    . $this->iconFactory->getIconForResource($subFolder, Icon::SIZE_SMALL, null, ['folder-open' => (bool)$isOpen])
                     . '</span>';
                 $HTML .= $this->wrapIcon($icon, $subFolder);
             }
             // Finally, add the row/HTML content to the ->tree array in the reserved key.
-            $this->tree[$treeKey] = array(
+            $this->tree[$treeKey] = [
                 'row' => $row,
                 'HTML' => $HTML,
                 'hasSub' => $nextCount && $this->expandNext($specUID),
@@ -435,7 +430,7 @@ class FolderTreeView extends AbstractTreeView
                 'isLast' => false,
                 'invertedDepth' => $depth,
                 'bank' => $this->bank
-            );
+            ];
         }
         if ($subFolderCounter > 0) {
             $this->tree[$treeKey]['isLast'] = true;
@@ -466,9 +461,9 @@ class FolderTreeView extends AbstractTreeView
                 $this->getLanguageService()->sL('LLL:EXT:backend/Resources/Private/Language/locallang.xlf:foldertreeview.noFolders.title'),
                 FlashMessage::INFO
             );
-            /** @var $flashMessageService \TYPO3\CMS\Core\Messaging\FlashMessageService */
+            /** @var \TYPO3\CMS\Core\Messaging\FlashMessageService $flashMessageService */
             $flashMessageService = GeneralUtility::makeInstance(FlashMessageService::class);
-            /** @var $defaultFlashMessageQueue \TYPO3\CMS\Core\Messaging\FlashMessageQueue */
+            /** @var \TYPO3\CMS\Core\Messaging\FlashMessageQueue $defaultFlashMessageQueue */
             $defaultFlashMessageQueue = $flashMessageService->getMessageQueueByIdentifier();
             $defaultFlashMessageQueue->enqueue($message);
             return $defaultFlashMessageQueue->renderFlashMessages();
@@ -488,11 +483,11 @@ class FolderTreeView extends AbstractTreeView
         }
         // We need to count the opened <ul>'s every time we dig into another level,
         // so we know how many we have to close when all children are done rendering
-        $closeDepth = array();
+        $closeDepth = [];
         foreach ($treeItems as $treeItem) {
-            /** @var $folderObject Folder */
+            /** @var Folder $folderObject */
             $folderObject = $treeItem['row']['folder'];
-            $classAttr = $treeItem['row']['_CSSCLASS'];
+            $classAttr = $treeItem['row']['_CSSCLASS'] ?? '';
             $folderIdentifier = $folderObject->getCombinedIdentifier();
             // this is set if the AJAX request has just opened this folder (via the PM command)
             $isExpandedFolderIdentifier = $expandedFolderHash == GeneralUtility::md5int($folderIdentifier);
@@ -500,27 +495,27 @@ class FolderTreeView extends AbstractTreeView
             $itemHTML = '';
             // If this item is the start of a new level,
             // then a new level <ul> is needed, but not in ajax mode
-            if ($treeItem['isFirst'] && !$doCollapse && !($doExpand && $isExpandedFolderIdentifier)) {
+            if (!empty($treeItem['isFirst']) && !$doCollapse && !($doExpand && $isExpandedFolderIdentifier)) {
                 $itemHTML = '<ul class="list-tree">';
             }
             // Add CSS classes to the list item
-            if ($treeItem['hasSub']) {
+            if (!empty($treeItem['hasSub'])) {
                 $classAttr .= ' list-tree-control-open';
             }
             $itemHTML .= '
                                <li id="' . $idAttr . '" ' . ($classAttr ? ' class="' . trim($classAttr) . '"' : '') . '><span class="list-tree-group">' . $treeItem['HTML'] . $this->wrapTitle($this->getTitleStr($treeItem['row'], $titleLength), $folderObject, $treeItem['bank']) . '</span>';
-            if (!$treeItem['hasSub']) {
+            if (empty($treeItem['hasSub'])) {
                 $itemHTML .= '</li>';
             }
             // We have to remember if this is the last one
             // on level X so the last child on level X+1 closes the <ul>-tag
-            if ($treeItem['isLast'] && !($doExpand && $isExpandedFolderIdentifier)) {
+            if (!empty($treeItem['isLast']) && !($doExpand && $isExpandedFolderIdentifier)) {
                 $closeDepth[$treeItem['invertedDepth']] = 1;
             }
             // If this is the last one and does not have subitems, we need to close
             // the tree as long as the upper levels have last items too
-            if ($treeItem['isLast'] && !$treeItem['hasSub'] && !$doCollapse && !($doExpand && $isExpandedFolderIdentifier)) {
-                for ($i = $treeItem['invertedDepth']; $closeDepth[$i] == 1; $i++) {
+            if (!empty($treeItem['isLast']) && empty($treeItem['hasSub']) && !$doCollapse && !($doExpand && $isExpandedFolderIdentifier)) {
+                for ($i = $treeItem['invertedDepth']; !empty($closeDepth[$i]); $i++) {
                     $closeDepth[$i] = 0;
                     $itemHTML .= '</ul></li>';
                 }
@@ -555,6 +550,24 @@ class FolderTreeView extends AbstractTreeView
     }
 
     /**
+     * Returns table name for click menu
+     *
+     * @param Folder $folderObject
+     * @return string
+     */
+    protected function getTableNameForClickMenu(Folder $folderObject)
+    {
+        if (strpos($folderObject->getRole(), FolderInterface::ROLE_MOUNT) !== false) {
+            $tableName = 'sys_filemounts';
+        } elseif ($folderObject->getIdentifier() === $folderObject->getStorage()->getRootLevelFolder()->getIdentifier()) {
+            $tableName = 'sys_file_storage';
+        } else {
+            $tableName = 'sys_file';
+        }
+        return $tableName;
+    }
+
+    /**
      * Counts the number of directories in a file path.
      *
      * @param Folder $folderObject File path.
@@ -570,16 +583,15 @@ class FolderTreeView extends AbstractTreeView
     /**
      * Get stored tree structure AND updating it if needed according to incoming PM GET var.
      *
-     * @return void
-     * @access private
+     * @internal
      */
     public function initializePositionSaving()
     {
         // Get stored tree structure:
-        $this->stored = unserialize($this->BE_USER->uc['browseTrees'][$this->treeName]);
+        $this->stored = json_decode($this->BE_USER->uc['browseTrees'][$this->treeName], true);
         $this->getShortHashNumberForStorage();
         // PM action:
-        // (If an plus/minus icon has been clicked,
+        // (If a plus/minus icon has been clicked,
         // the PM GET var is sent and we must update the stored positions in the tree):
         // 0: mount key, 1: set/clear boolean, 2: item ID (cannot contain "_"), 3: treeName
         list($storageHashNumber, $doExpand, $numericFolderHash, $treeName) = $this->evaluateExpandCollapseParameter();
@@ -608,9 +620,7 @@ class FolderTreeView extends AbstractTreeView
     protected function getShortHashNumberForStorage(ResourceStorage $storageObject = null, Folder $startingPointFolder = null)
     {
         if (!$this->storageHashNumbers) {
-            $this->storageHashNumbers = array();
-            // Mapping md5-hash to shorter number:
-            $hashMap = array();
+            $this->storageHashNumbers = [];
             foreach ($this->storages as $storageUid => $storage) {
                 $fileMounts = $storage->getFileMounts();
                 if (!empty($fileMounts)) {
@@ -628,19 +638,17 @@ class FolderTreeView extends AbstractTreeView
         if ($storageObject) {
             if ($startingPointFolder) {
                 return $this->storageHashNumbers[$storageObject->getUid() . $startingPointFolder->getCombinedIdentifier()];
-            } else {
-                return $this->storageHashNumbers[$storageObject->getUid()];
             }
-        } else {
-            return null;
+            return $this->storageHashNumbers[$storageObject->getUid()];
         }
+        return null;
     }
 
     /**
      * Gets the values from the Expand/Collapse Parameter (&PM)
      * previously known as "PM" (plus/minus)
      * PM action:
-     * (If an plus/minus icon has been clicked,
+     * (If a plus/minus icon has been clicked,
      * the PM GET var is sent and we must update the stored positions in the tree):
      * 0: mount key, 1: set/clear boolean, 2: item ID (cannot contain "_"), 3: treeName
      *
@@ -657,15 +665,15 @@ class FolderTreeView extends AbstractTreeView
             }
         }
         // Take the first three parameters
-        list($mountKey, $doExpand, $folderIdentifier) = explode('_', $PM, 3);
+        list($mountKey, $doExpand, $folderIdentifier) = array_pad(explode('_', $PM, 3), 3, null);
         // In case the folder identifier contains "_", we just need to get the fourth/last parameter
-        list($folderIdentifier, $treeName) = GeneralUtility::revExplode('_', $folderIdentifier, 2);
-        return array(
+        list($folderIdentifier, $treeName) = array_pad(GeneralUtility::revExplode('_', $folderIdentifier, 2), 2, null);
+        return [
             $mountKey,
             $doExpand,
             $folderIdentifier,
             $treeName
-        );
+        ];
     }
 
     /**
@@ -680,12 +688,12 @@ class FolderTreeView extends AbstractTreeView
      */
     protected function generateExpandCollapseParameter($mountKey = null, $doExpand = false, Folder $folderObject = null, $treeName = null)
     {
-        $parts = array(
-            $mountKey !== null ? $mountKey : $this->bank,
+        $parts = [
+            $mountKey ?? $this->bank,
             $doExpand == 1 ? 1 : 0,
             $folderObject !== null ? GeneralUtility::md5int($folderObject->getCombinedIdentifier()) : '',
-            $treeName !== null ? $treeName : $this->treeName
-        );
+            $treeName ?? $this->treeName
+        ];
         return implode('_', $parts);
     }