/** * Generate a file url * * @param string $fileName * @param array $options * string path * array filters * @return string */ public function __invoke($fileName, array $options) { $currentPath = $options['path'] . '/' . $fileName; // generate a directory navigation link if (is_dir(FileManagerBaseModel::getUserBaseFilesDir() . '/' . $options['path'] . '/' . $fileName)) { // get the directory url $directoryUrl = $this->getView()->url('application/page', ['controller' => $this->getView()->applicationRoute()->getParam('controller'), 'action' => $this->getView()->applicationRoute()->getParam('action')], ['force_canonical' => true, 'query' => ['path' => $currentPath] + $options['filters']]); return $this->getView()->partial('file-manager/patrial/directory-url', ['name' => $fileName, 'url' => $directoryUrl]); } // generate a file link return $this->getView()->partial('file-manager/patrial/file-url', ['file_extension' => FileSystemUtility::getFileExtension($fileName), 'name' => $fileName, 'url' => $this->view->serverUrl() . $this->view->basePath() . '/' . FileManagerBaseModel::getUserBaseFilesUrl() . '/' . $currentPath]); }
/** * Validate existing file * * @param $value * @param array $context * @return boolean */ public function validateExistingFile($value, array $context = []) { $newFilePath = $this->fullUserPath . $value . '.' . FileSystemUtility::getFileExtension($this->fileName); $oldFilePath = $this->fullFilePath . $this->fileName; if ($newFilePath != $oldFilePath) { if (file_exists($newFilePath)) { return is_dir($newFilePath); } } return true; }
/** * Get files * * @param string $directory * @param integer $page * @param integer $perPage * @param string $orderBy * @param string $orderType * @param array $filters * string file_type (image , file, media) * string name * string type (directory, file) * @return array */ public function getFiles($directory, $page = 1, $perPage = 0, $orderBy = null, $orderType = null, array $filters = []) { $orderFields = ['name', 'size', 'type', 'date']; $orderType = !$orderType || $orderType == 'desc' ? SORT_DESC : SORT_ASC; $orderBy = $orderBy && in_array($orderBy, $orderFields) ? $orderBy : 'name'; // get all directories and files $directoryIterator = new DirectoryIterator($directory); $files = new CallbackFilterIterator($directoryIterator, function ($current, $key, $iterator) use($filters) { if ($current->isDot() || $current->isLink()) { return false; } // filter by files type - image, media, etc if (!empty($filters['file_type']) && !$current->isDir()) { switch ($filters['file_type']) { // show only images case 'image': if (!in_array(FileSystemUtility::getFileExtension($current->getFileName()), explode(',', strtolower(SettingService::getSetting('file_manager_image_extensions'))))) { return false; } break; case 'media': if (!in_array(FileSystemUtility::getFileExtension($current->getFileName()), explode(',', strtolower(SettingService::getSetting('file_manager_media_extensions'))))) { return false; } break; default: } } // filter by type if (!empty($filters['type'])) { switch ($filters['type']) { case 'directory': if ($current->isFile()) { return false; } break; case 'file': if ($current->isDir()) { return false; } break; default: } } // filter by name return empty($filters['name']) || null != stristr($current->getFileName(), $filters['name']); }); $processedFiles = []; $orderValues = []; foreach ($files as $data) { $fileInfo = ['name' => $data->getFileName(), 'type' => $data->isDir(), 'date' => $data->getMTime(), 'size' => !$data->isDir() ? $data->getSize() : 0]; $processedFiles[] = $fileInfo; $orderValues[] = $fileInfo[$orderBy]; } array_multisort($orderValues, $orderType, $processedFiles); $paginator = new Paginator(new ArrayAdapterPaginator($processedFiles)); $paginator->setCurrentPageNumber($page); $paginator->setItemCountPerPage(PaginationUtility::processPerPage($perPage)); $paginator->setPageRange(SettingService::getSetting('application_page_range')); return $paginator; }