%PDF- %PDF-
Direktori : /home/vacivi36/intranet.vacivitta.com.br/protected/modules/cfiles/controllers/ |
Current File : /home/vacivi36/intranet.vacivitta.com.br/protected/modules/cfiles/controllers/BaseController.php |
<?php /** * @link https://www.humhub.org/ * @copyright Copyright (c) 2015 HumHub GmbH & Co. KG * @license https://www.humhub.com/licences */ namespace humhub\modules\cfiles\controllers; use humhub\modules\content\models\Content; use Yii; use yii\db\Expression; use yii\web\HttpException; use humhub\modules\cfiles\permissions\WriteAccess; use humhub\modules\content\components\ContentContainerController; use humhub\modules\cfiles\models\File; use humhub\modules\cfiles\models\Folder; /** * Description of a Base Controller for the files module. * * @author Sebastian Stumpf */ abstract class BaseController extends ContentContainerController { const ROOT_ID = 0; const All_POSTED_FILES_ID = -1; private $_currentFolder = null; private $_rootFolder = null; private $_allPostedFilesFolder = null; public $hideSidebar = true; public $errorMessages = []; public function beforeAction($action) { if (!parent::beforeAction($action)) { return false; } $newRoot = false; // create default folders if (!$this->getRootFolder()) { $this->_rootFolder = Folder::initRoot($this->contentContainer); $newRoot = true; } else if($this->getRootFolder()->content->isPrivate()) { // Make sure older root folders are public by default. $this->getRootFolder()->content->visibility = Content::VISIBILITY_PUBLIC; $this->getRootFolder()->content->save(); } if ($this->getAllPostedFilesFolder() == null) { $this->_allPostedFilesFolder = Folder::initPostedFilesFolder($this->contentContainer); } else if($this->getAllPostedFilesFolder()->content->isPrivate()) { $this->getAllPostedFilesFolder()->content->visibility = Content::VISIBILITY_PUBLIC; $this->getAllPostedFilesFolder()->content->save(); } // TODO: In a future version, we should handle this within a migration and remove the line // next step is to shift all former root subfiles which have parent_folder_id == 0 (up to module version v.9.7) to the generated root folder // this should not be a problem if the migration was broken, because it only affects entries with parent_folder_id==0 if ($newRoot) { $this->_rootFolder->migrateFromOldStructure(); } return true; } /** * Returns current folder by given fid get parameter. * If no or invalid folderId (fid) is given, null is returned. * * @return Folder */ public function getCurrentFolder() { if ($this->_currentFolder === null) { $folderId = (int) Yii::$app->request->get('fid', self::ROOT_ID); switch ($folderId) { case self::ROOT_ID: return $this->_currentFolder = $this->getRootFolder(); case self::All_POSTED_FILES_ID: return $this->_currentFolder = $this->getAllPostedFilesFolder(); default: $this->_currentFolder = Folder::find()->contentContainer($this->contentContainer) ->readable() ->where(['cfiles_folder.id' => $folderId]) ->one(); if ($this->_currentFolder === null) { throw new HttpException(500, Yii::t('CfilesModule.base', 'Could not find folder with id: %id%', ['%id%' => $folderId])); } } } return $this->_currentFolder; } protected function getRootFolder() { if ($this->_rootFolder === null) { $this->_rootFolder = Folder::getRoot($this->contentContainer); } return $this->_rootFolder; } protected function getAllPostedFilesFolder() { if ($this->_allPostedFilesFolder === null) { $this->_allPostedFilesFolder = Folder::getPostedFilesFolder($this->contentContainer); } return $this->_allPostedFilesFolder; } /** * Returns all parent folders as array * * @return array of parent folders */ protected function generateCrumb() { $crumb = []; $parent = $this->getCurrentFolder(); do { $crumb[] = $parent; $parent = $parent->parentFolder; } while ($parent != null); return array_reverse($crumb); } /** * Generate the maximum depth directory structure originating from a given folder id. * * @param int $parentId * @return array [['folder' => --current folder--, 'subfolders' => [['folder' => --current folder--, 'subfolders' => []], ...], ['folder' => --current folder--, 'subfolders' => [['folder' => --current folder--, 'subfolders' => []], ...], ...] */ protected function getFolderList($parentId = self::ROOT_ID, $orderBy = NULL) { // set default value if (!$orderBy) $orderBy = ['title' => SORT_ASC]; // map 0 to this containers root folder id if ($parentId === self::ROOT_ID) { $parentId = $this->getRootFolder()->id; } $dirstruc = []; $foldersQuery = Folder::find()->contentContainer($this->contentContainer)->readable(); $foldersQuery->andWhere(['cfiles_folder.parent_folder_id' => $parentId]); // do not return any subfolders here that are root or allpostedfiles $foldersQuery->andWhere([ 'or', ['cfiles_folder.type' => null], ['and', ['<>', 'cfiles_folder.type', Folder::TYPE_FOLDER_POSTED], ['<>', 'cfiles_folder.type', Folder::TYPE_FOLDER_ROOT] ] ]); $foldersQuery->orderBy($orderBy); $folders = $foldersQuery->all(); foreach ($folders as $folder) { $dirstruc[] = ['folder' => $folder, 'subfolders' => $this->getFolderlist($folder->id)]; } return $dirstruc; } /** * Load all files and folders of the current folder from the database and get an array of them. * * @param array $filesOrder orderBy array appended to the files query * @param array $foldersOrder orderBy array appended to the folders query * @return array */ protected function getItemsList($filesOrder = NULL, $foldersOrder = NULL) { // set default value if (!$filesOrder) { $filesOrder = ['title' => SORT_ASC]; } if (!$foldersOrder) { $foldersOrder = ['title' => SORT_ASC]; } $filesQuery = File::find()->joinWith('baseFile') ->contentContainer($this->contentContainer) ->readable(); $foldersQuery = Folder::find()->contentContainer($this->contentContainer)->readable(); $specialFoldersQuery = Folder::find()->contentContainer($this->contentContainer)->readable(); $filesQuery->andWhere([ 'cfiles_file.parent_folder_id' => $this->getCurrentFolder()->id ]); // user maintained folders $foldersQuery->andWhere([ 'cfiles_folder.parent_folder_id' => $this->getCurrentFolder()->id ]); // do not return any folders here that are root or allpostedfiles $foldersQuery->andWhere([ 'or', ['cfiles_folder.type' => null], ['and', ['<>', 'cfiles_folder.type', Folder::TYPE_FOLDER_POSTED], ['<>', 'cfiles_folder.type', Folder::TYPE_FOLDER_ROOT] ] ]); // special default folders like the allposted files folder $specialFoldersQuery->andWhere(['cfiles_folder.parent_folder_id' => $this->getCurrentFolder()->id]); $specialFoldersQuery->andWhere(['is not', 'cfiles_folder.type', null]); $filesQuery->orderBy($filesOrder); $foldersQuery->orderBy($foldersOrder); return [ 'specialFolders' => $specialFoldersQuery->all(), 'folders' => $foldersQuery->all(), 'files' => $filesQuery->all() ]; } /** * Checks if user can write * * @return boolean current user can write/upload/delete files */ public function canWrite() { return $this->contentContainer->permissionManager->can(WriteAccess::class); } }