public function up() { $spaces = Space::find()->all(); $users = User::find()->all(); $containers = array_merge($users == null ? [] : $users, $spaces == null ? [] : $spaces); foreach ($containers as $container) { $created_by = $container instanceof User ? $container->id : $container instanceof Space ? $container->created_by : 1; $created_by = $created_by == null ? 1 : $created_by; if ($container->isModuleEnabled('cfiles')) { $this->insert('cfiles_folder', ['title' => Module::ROOT_TITLE, 'description' => Module::ROOT_DESCRIPTION, 'parent_folder_id' => 0, 'has_wall_entry' => false, 'type' => Folder::TYPE_FOLDER_ROOT]); $root_id = Yii::$app->db->getLastInsertID(); $this->insert('content', ['guid' => \humhub\libs\UUID::v4(), 'object_model' => Folder::className(), 'object_id' => $root_id, 'visibility' => 0, 'sticked' => 0, 'archived' => 0, 'created_at' => new \yii\db\Expression('NOW()'), 'created_by' => $created_by, 'updated_at' => new \yii\db\Expression('NOW()'), 'updated_by' => $created_by, 'contentcontainer_id' => $container->contentcontainer_id]); $this->insert('cfiles_folder', ['title' => Module::ALL_POSTED_FILES_TITLE, 'description' => Module::ALL_POSTED_FILES_DESCRIPTION, 'parent_folder_id' => $root_id, 'has_wall_entry' => false, 'type' => Folder::TYPE_FOLDER_POSTED]); $allpostedfiles_id = Yii::$app->db->getLastInsertID(); $this->insert('content', ['guid' => \humhub\libs\UUID::v4(), 'object_model' => Folder::className(), 'object_id' => $allpostedfiles_id, 'visibility' => 0, 'sticked' => 0, 'archived' => 0, 'created_at' => new \yii\db\Expression('NOW()'), 'created_by' => $created_by, 'updated_at' => new \yii\db\Expression('NOW()'), 'updated_by' => $created_by, 'contentcontainer_id' => $container->contentcontainer_id]); $posted_content_id = Yii::$app->db->getLastInsertID(); $filesQuery = File::find()->joinWith('baseFile')->contentContainer($container); $foldersQuery = Folder::find()->contentContainer($container); $filesQuery->andWhere(['cfiles_file.parent_folder_id' => 0]); // user maintained folders $foldersQuery->andWhere(['cfiles_folder.parent_folder_id' => 0]); // do not return any folders here that are root or allpostedfiles $foldersQuery->andWhere(['cfiles_folder.type' => null]); $rootsubfiles = $filesQuery->all(); $rootsubfolders = $foldersQuery->all(); foreach ($rootsubfiles as $file) { $this->update('cfiles_file', ['cfiles_file.parent_folder_id' => $root_id], ['id' => $file->id]); } foreach ($rootsubfolders as $folder) { $this->update('cfiles_folder', ['parent_folder_id' => $root_id], ['id' => $folder->id]); } } } }
public function disableContentContainer(ContentContainerActiveRecord $container) { foreach (Folder::find()->contentContainer($container)->all() as $folder) { $folder->delete(); } foreach (File::find()->contentContainer($container)->all() as $file) { $file->delete(); } }
public function disable() { foreach (Folder::find()->all() as $key => $folder) { $folder->delete(); } foreach (File::find()->all() as $key => $file) { $file->delete(); } }
/** * Action to edit a given folder. * * @return string */ public function actionFolder() { if (!$this->canWrite()) { throw new HttpException(401, Yii::t('CfilesModule.base', 'Insufficient rights to execute this action.')); } $itemId = Yii::$app->request->get('id'); $fromWall = Yii::$app->request->get('fromWall'); $folder = $this->module->getItemById($itemId); $cancel = Yii::$app->request->get('cancel'); if ($cancel) { return $this->renderAjaxContent($folder->getWallOut()); } // the new / edited folders title $title = trim(Yii::$app->request->post('Folder')['title']); Yii::$app->request->post('Folder')['title'] = $title; // if not a folder has to be created if (empty($folder) || !$folder instanceof Folder) { $titleChanged = true; // create a new folder $folder = new Folder(); $folder->content->container = $this->contentContainer; $folder->parent_folder_id = $this->getCurrentFolder()->id; } else { $titleChanged = $title !== $folder->title; } // check if a folder with the given parent id and title exists $query = Folder::find()->contentContainer($this->contentContainer)->readable()->where(['cfiles_folder.title' => $title, 'cfiles_folder.parent_folder_id' => $folder->parent_folder_id]); $similarFolder = $query->one(); // if a similar folder exists and a new folder should be created, add an error to the model. if (!empty($similarFolder) && $titleChanged) { $folder->title = $title; $folder->addError('title', \Yii::t('CfilesModule.base', 'A folder with this name already exists.')); } elseif ($folder->load(Yii::$app->request->post()) && $folder->validate() && $folder->save()) { // if there is no folder with the same name, try to save the current folder if ($fromWall) { return $this->renderAjaxContent($folder->getWallOut(['justEdited' => true])); } else { return $this->htmlRedirect($this->contentContainer->createUrl('/cfiles/browse/index', ['fid' => $folder->id])); } } // if it could not be saved successfully, or the formular was empty, render the edit folder modal return $this->renderAjax($fromWall ? 'wall_edit_folder' : 'modal_edit_folder', ['folder' => $folder, 'contentContainer' => $this->contentContainer, 'currentFolderId' => $this->getCurrentFolder()->id, 'fromWall' => $fromWall]); }
/** * Generate the cfolder and cfile structure in the database of a given folder and all its subfolders recursively. * * @param Response $response * the response errors will be parsed to. * @param int $parentFolderId * the folders parent folder id. * @param string $folderPath * the path of the folder. */ protected function generateModelsFromFilesystem(&$response, $parentFolderId, $folderPath) { // remove unwanted parent folder references from the scanned files $files = array_diff(scandir($folderPath), array('..', '.')); $response['debug_files'] = $files; $response['debug_pfid'] = $parentFolderId; $response['debug_fpath'] = $folderPath; foreach ($files as $file) { $filePath = $folderPath . DIRECTORY_SEPARATOR . $file; if (is_dir($filePath)) { // create a new folder $folder = new Folder(); $folder->content->container = $this->contentContainer; $folder->parent_folder_id = $parentFolderId; $folder->title = $file; // check if a folder with the given parent id and title exists $query = Folder::find()->contentContainer($this->contentContainer)->readable()->where(['cfiles_folder.title' => $file, 'cfiles_folder.parent_folder_id' => $parentFolderId]); $similarFolder = $query->one(); // if a similar folder exists, add an error to the model. Must be done here, cause we need access to the content container if (!empty($similarFolder)) { $response['infomessages'][] = Yii::t('CfilesModule.base', 'The folder %filename% already exists. Contents have been overwritten.', ['%filename%' => $file]); $folder = $similarFolder; } elseif (!$folder->save()) { // if there is no folder with the same name, try to save the current folder $response['errormessages'][] = Yii::t('CfilesModule.base', ' The folder %filename% could not be saved.', ['%filename%' => $file]); } $this->files[] = ['fileList' => $this->renderFileList()]; $this->generateModelsFromFilesystem($response, $folder->id, $filePath); } else { $this->generateModelFromFile($response, $parentFolderId, $folderPath, $file); } } }
protected function getFolderList($parentId = self::ROOT_ID) { $dirstruc = []; $folders = Folder::find()->contentContainer($this->contentContainer)->readable()->where(['cfiles_folder.parent_folder_id' => $parentId])->all(); foreach ($folders as $folder) { $dirstruc[] = ['folder' => $folder, 'subfolders' => $this->getFolderlist($folder->id)]; } return $dirstruc; }
public static function getIdFromPath($path, $contentContainer, $separator = '/') { $titles = array_reverse(explode($separator, $path)); if (sizeof($titles) <= 0) { return null; } $folders = Folder::find()->contentContainer($contentContainer)->readable()->where(['title' => $titles[0]])->all(); if (sizeof($folders) <= 0) { return null; } unset($titles[0]); foreach ($titles as $index => $title) { if (sizeof($folders) <= 0) { return null; } } $query = $this->hasOne(\humhub\modules\content\models\Content::className(), ['object_id' => 'id']); $query->andWhere(['file.object_model' => self::className()]); }
/** * 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 Ambigous <multitype:, multitype:\yii\db\ActiveRecord > */ 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()]; }