/**
  * 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;
 }