Ejemplo n.º 1
0
 /**
  * Create the panel of buttons for submitting the form or otherwise perform operations.
  *
  * @return array All available buttons as an assoc. array
  */
 protected function registerButtons()
 {
     /** @var ButtonBar $buttonBar */
     $buttonBar = $this->view->getModuleTemplate()->getDocHeaderComponent()->getButtonBar();
     /** @var IconFactory $iconFactory */
     $iconFactory = $this->view->getModuleTemplate()->getIconFactory();
     /** @var $resourceFactory ResourceFactory */
     $resourceFactory = GeneralUtility::makeInstance(ResourceFactory::class);
     $lang = $this->getLanguageService();
     // Refresh page
     $refreshLink = GeneralUtility::linkThisScript(['target' => rawurlencode($this->folderObject->getCombinedIdentifier()), 'imagemode' => $this->filelist->thumbs]);
     $refreshButton = $buttonBar->makeLinkButton()->setHref($refreshLink)->setTitle($lang->sL('LLL:EXT:lang/Resources/Private/Language/locallang_core.xlf:labels.reload'))->setIcon($iconFactory->getIcon('actions-refresh', Icon::SIZE_SMALL));
     $buttonBar->addButton($refreshButton, ButtonBar::BUTTON_POSITION_RIGHT);
     // Level up
     try {
         $currentStorage = $this->folderObject->getStorage();
         $parentFolder = $this->folderObject->getParentFolder();
         if ($parentFolder->getIdentifier() !== $this->folderObject->getIdentifier() && $currentStorage->isWithinFileMountBoundaries($parentFolder)) {
             $levelUpClick = 'top.document.getElementsByName("navigation")[0].contentWindow.Tree.highlightActiveItem("file","folder' . GeneralUtility::md5int($parentFolder->getCombinedIdentifier()) . '_"+top.fsMod.currentBank)';
             $levelUpButton = $buttonBar->makeLinkButton()->setHref(BackendUtility::getModuleUrl('file_FilelistList', ['id' => $parentFolder->getCombinedIdentifier()]))->setOnClick($levelUpClick)->setTitle($lang->sL('LLL:EXT:lang/Resources/Private/Language/locallang_core.xlf:labels.upOneLevel'))->setIcon($iconFactory->getIcon('actions-view-go-up', Icon::SIZE_SMALL));
             $buttonBar->addButton($levelUpButton, ButtonBar::BUTTON_POSITION_LEFT, 1);
         }
     } catch (\Exception $e) {
     }
     // Shortcut
     if ($this->getBackendUser()->mayMakeShortcut()) {
         $shortCutButton = $buttonBar->makeShortcutButton()->setModuleName('file_FilelistList');
         $buttonBar->addButton($shortCutButton, ButtonBar::BUTTON_POSITION_RIGHT);
     }
     // Upload button (only if upload to this directory is allowed)
     if ($this->folderObject && $this->folderObject->getStorage()->checkUserActionPermission('add', 'File') && $this->folderObject->checkActionPermission('write')) {
         $uploadButton = $buttonBar->makeLinkButton()->setHref(BackendUtility::getModuleUrl('file_upload', ['target' => $this->folderObject->getCombinedIdentifier(), 'returnUrl' => $this->filelist->listURL()]))->setClasses('t3js-drag-uploader-trigger')->setTitle($lang->sL('LLL:EXT:lang/Resources/Private/Language/locallang_core.xlf:cm.upload'))->setIcon($iconFactory->getIcon('actions-edit-upload', Icon::SIZE_SMALL));
         $buttonBar->addButton($uploadButton, ButtonBar::BUTTON_POSITION_LEFT, 1);
     }
     // New folder button
     if ($this->folderObject && $this->folderObject->checkActionPermission('write') && ($this->folderObject->getStorage()->checkUserActionPermission('add', 'File') || $this->folderObject->checkActionPermission('add'))) {
         $newButton = $buttonBar->makeLinkButton()->setHref(BackendUtility::getModuleUrl('file_newfolder', ['target' => $this->folderObject->getCombinedIdentifier(), 'returnUrl' => $this->filelist->listURL()]))->setTitle($lang->sL('LLL:EXT:lang/Resources/Private/Language/locallang_core.xlf:cm.new'))->setIcon($iconFactory->getIcon('actions-document-new', Icon::SIZE_SMALL));
         $buttonBar->addButton($newButton, ButtonBar::BUTTON_POSITION_LEFT, 1);
     }
     // Add paste button if clipboard is initialized
     if ($this->filelist->clipObj instanceof Clipboard && $this->folderObject->checkActionPermission('write')) {
         $elFromTable = $this->filelist->clipObj->elFromTable('_FILE');
         if (!empty($elFromTable)) {
             $addPasteButton = true;
             $elToConfirm = [];
             foreach ($elFromTable as $key => $element) {
                 $clipBoardElement = $resourceFactory->retrieveFileOrFolderObject($element);
                 if ($clipBoardElement instanceof Folder && $clipBoardElement->getStorage()->isWithinFolder($clipBoardElement, $this->folderObject)) {
                     $addPasteButton = false;
                 }
                 $elToConfirm[$key] = $clipBoardElement->getName();
             }
             if ($addPasteButton) {
                 $confirmText = $this->filelist->clipObj->confirmMsgText('_FILE', $this->folderObject->getReadablePath(), 'into', $elToConfirm);
                 $pasteButton = $buttonBar->makeLinkButton()->setHref($this->filelist->clipObj->pasteUrl('_FILE', $this->folderObject->getCombinedIdentifier()))->setClasses('t3js-modal-trigger')->setDataAttributes(['severity' => 'warning', 'content' => $confirmText, 'title' => $lang->getLL('clip_paste')])->setTitle($lang->getLL('clip_paste'))->setIcon($iconFactory->getIcon('actions-document-paste-into', Icon::SIZE_SMALL));
                 $buttonBar->addButton($pasteButton, ButtonBar::BUTTON_POSITION_LEFT, 2);
             }
         }
     }
 }
Ejemplo n.º 2
0
 /**
  * If there is a parent folder and user has access to it, return an icon
  * which is linked to the filelist of the parent folder.
  *
  * @param Folder $currentFolder
  * @return string
  */
 protected function getLinkToParentFolder(Folder $currentFolder)
 {
     $levelUp = '';
     try {
         $currentStorage = $currentFolder->getStorage();
         $parentFolder = $currentFolder->getParentFolder();
         if ($parentFolder->getIdentifier() !== $currentFolder->getIdentifier() && $currentStorage->isWithinFileMountBoundaries($parentFolder)) {
             $levelUp = $this->linkWrapDir(IconUtility::getSpriteIcon('actions-view-go-up', array('title' => $this->getLanguageService()->sL('LLL:EXT:lang/locallang_core.php:labels.upOneLevel', TRUE))), $parentFolder);
         }
     } catch (\Exception $e) {
     }
     return $levelUp;
 }
Ejemplo n.º 3
0
 /**
  * Moves a folder. If you want to move a folder from this storage to another
  * one, call this method on the target storage, otherwise you will get an exception.
  *
  * @param Folder $folderToMove The folder to move.
  * @param Folder $targetParentFolder The target parent folder
  * @param string $newFolderName
  * @param string $conflictMode a value of the DuplicationBehavior enumeration
  *
  * @throws \Exception|\TYPO3\CMS\Core\Exception
  * @throws \InvalidArgumentException
  * @throws InvalidTargetFolderException
  * @return Folder
  */
 public function moveFolder(Folder $folderToMove, Folder $targetParentFolder, $newFolderName = null, $conflictMode = DuplicationBehavior::RENAME)
 {
     // @todo add tests
     $originalFolder = $folderToMove->getParentFolder();
     $this->assureFolderMovePermissions($folderToMove, $targetParentFolder);
     $sourceStorage = $folderToMove->getStorage();
     $returnObject = null;
     $sanitizedNewFolderName = $this->driver->sanitizeFileName($newFolderName ?: $folderToMove->getName());
     // @todo check if folder already exists in $targetParentFolder, handle this conflict then
     $this->emitPreFolderMoveSignal($folderToMove, $targetParentFolder, $sanitizedNewFolderName);
     // Get all file objects now so we are able to update them after moving the folder
     $fileObjects = $this->getAllFileObjectsInFolder($folderToMove);
     if ($sourceStorage === $this) {
         if ($this->isWithinFolder($folderToMove, $targetParentFolder)) {
             throw new InvalidTargetFolderException(sprintf('Cannot move folder "%s" into target folder "%s", because the target folder is already within the folder to be moved!', $folderToMove->getName(), $targetParentFolder->getName()), 1422723050);
         }
         $fileMappings = $this->driver->moveFolderWithinStorage($folderToMove->getIdentifier(), $targetParentFolder->getIdentifier(), $sanitizedNewFolderName);
     } else {
         $fileMappings = $this->moveFolderBetweenStorages($folderToMove, $targetParentFolder, $sanitizedNewFolderName);
     }
     // Update the identifier and storage of all file objects
     foreach ($fileObjects as $oldIdentifier => $fileObject) {
         $newIdentifier = $fileMappings[$oldIdentifier];
         $fileObject->updateProperties(array('storage' => $this->getUid(), 'identifier' => $newIdentifier));
         $this->getIndexer()->updateIndexEntry($fileObject);
     }
     $returnObject = $this->getFolder($fileMappings[$folderToMove->getIdentifier()]);
     $this->emitPostFolderMoveSignal($folderToMove, $targetParentFolder, $returnObject->getName(), $originalFolder);
     return $returnObject;
 }
Ejemplo n.º 4
0
 /**
  * If there is a parent folder and user has access to it, return an icon
  * which is linked to the filelist of the parent folder.
  *
  * @param Folder $currentFolder
  * @return string
  */
 protected function getLinkToParentFolder(Folder $currentFolder)
 {
     $levelUp = '';
     try {
         $currentStorage = $currentFolder->getStorage();
         $parentFolder = $currentFolder->getParentFolder();
         if ($parentFolder->getIdentifier() !== $currentFolder->getIdentifier() && $currentStorage->isWithinFileMountBoundaries($parentFolder)) {
             $levelUp = $this->linkWrapDir('<span title="' . $this->getLanguageService()->sL('LLL:EXT:lang/locallang_core.php:labels.upOneLevel', true) . '">' . $this->iconFactory->getIcon('actions-view-go-up', Icon::SIZE_SMALL)->render() . '</span>', $parentFolder);
         }
     } catch (\Exception $e) {
     }
     return $levelUp;
 }
Ejemplo n.º 5
0
 /**
  * Moves a folder. If you want to move a folder from this storage to another
  * one, call this method on the target storage, otherwise you will get an exception.
  *
  * @param Folder $folderToMove The folder to move.
  * @param Folder $targetParentFolder The target parent folder
  * @param string $newFolderName
  * @param string $conflictMode  How to handle conflicts; one of "overrideExistingFile", "renameNewFolder", "cancel
  *
  * @throws \Exception|\TYPO3\CMS\Core\Exception
  * @throws \InvalidArgumentException
  * @return Folder
  */
 public function moveFolder(Folder $folderToMove, Folder $targetParentFolder, $newFolderName = NULL, $conflictMode = 'renameNewFolder')
 {
     // TODO add tests
     $originalFolder = $folderToMove->getParentFolder();
     $this->assureFolderMovePermissions($folderToMove, $targetParentFolder);
     $sourceStorage = $folderToMove->getStorage();
     $returnObject = NULL;
     $sanitizedNewFolderName = $this->driver->sanitizeFileName($newFolderName ?: $folderToMove->getName());
     // TODO check if folder already exists in $targetParentFolder, handle this conflict then
     $this->emitPreFolderMoveSignal($folderToMove, $targetParentFolder, $sanitizedNewFolderName);
     // Get all file objects now so we are able to update them after moving the folder
     $fileObjects = $this->getAllFileObjectsInFolder($folderToMove);
     if ($sourceStorage === $this) {
         $fileMappings = $this->driver->moveFolderWithinStorage($folderToMove->getIdentifier(), $targetParentFolder->getIdentifier(), $sanitizedNewFolderName);
     } else {
         $fileMappings = $this->moveFolderBetweenStorages($folderToMove, $targetParentFolder, $sanitizedNewFolderName);
     }
     // Update the identifier and storage of all file objects
     foreach ($fileObjects as $oldIdentifier => $fileObject) {
         $newIdentifier = $fileMappings[$oldIdentifier];
         $fileObject->updateProperties(array('storage' => $this->getUid(), 'identifier' => $newIdentifier));
         $this->getIndexer()->updateIndexEntry($fileObject);
     }
     $returnObject = $this->getFolder($fileMappings[$folderToMove->getIdentifier()]);
     $this->emitPostFolderMoveSignal($folderToMove, $targetParentFolder, $returnObject->getName(), $originalFolder);
     return $returnObject;
 }
 /**
  * Update folder permissions records when a folder is renamed
  *
  * @param Folder $folder
  * @param string $newName
  */
 public function postFolderRename(Folder $folder, $newName)
 {
     $newFolder = $folder->getParentFolder()->getSubfolder($newName);
     $oldStorageUid = $folder->getStorage()->getUid();
     $newStorageUid = $newFolder->getStorage()->getUid();
     $this->utilityService->updateFolderRecord($oldStorageUid, $folder->getHashedIdentifier(), $folder->getIdentifier(), array('storage' => $newStorageUid, 'folder_hash' => $newFolder->getHashedIdentifier(), 'folder' => $newFolder->getIdentifier()));
     if (!empty($this->folderMapping[$folder->getCombinedIdentifier()])) {
         $newMapping = $this->getSubFolderIdentifiers($newFolder);
         foreach ($this->folderMapping[$folder->getCombinedIdentifier()] as $key => $folderInfo) {
             $this->utilityService->updateFolderRecord($oldStorageUid, $folderInfo[0], $folderInfo[1], array('storage' => $newStorageUid, 'folder_hash' => $newMapping[$key][0], 'folder' => $newMapping[$key][1]));
         }
     }
 }
Ejemplo n.º 7
0
 /**
  * Flush cache of pages containing gallery plugins with matching folders
  *
  * This is done two levels deep to take care of folders created inside a
  * category.
  *
  * @param Folder $folder The folder
  *
  * @return void
  */
 protected function flushCacheForAffectedPages(Folder $folder)
 {
     $evaluate = $folder->getStorage()->getEvaluatePermissions();
     $folder->getStorage()->setEvaluatePermissions(false);
     $this->flushCacheForPages($this->getAffectedPageIds($folder->getParentFolder()->getParentFolder()));
     $folder->getStorage()->setEvaluatePermissions($evaluate);
 }