X-Git-Url: http://www.aleph1.co.uk/gitweb/?p=yaffs-website;a=blobdiff_plain;f=web%2Fmodules%2Fcontrib%2Ffilefield_sources%2Fsrc%2FImceScanner.php;fp=web%2Fmodules%2Fcontrib%2Ffilefield_sources%2Fsrc%2FImceScanner.php;h=1993c0e7735bc3fe03cbae97678f46fd652bd2a4;hp=0000000000000000000000000000000000000000;hb=8acec36f19c470dfcda1ae2336826a782f41874c;hpb=e0411c4e83ba0d079034db83c3f7f55be24a0e35 diff --git a/web/modules/contrib/filefield_sources/src/ImceScanner.php b/web/modules/contrib/filefield_sources/src/ImceScanner.php new file mode 100644 index 000000000..1993c0e77 --- /dev/null +++ b/web/modules/contrib/filefield_sources/src/ImceScanner.php @@ -0,0 +1,102 @@ +context = $context; + } + + /** + * Scan and return files, subdirectories. + */ + public function customScanFull($dirname, $options) { + // Get a list of files in the database for this directory. + $scheme = $this->context['scheme']; + $sql_uri_name = $dirname == '.' ? $scheme . '://' : $dirname . '/'; + + $result = db_select('file_managed', 'f') + ->fields('f', array('uri')) + ->condition('f.uri', $sql_uri_name . '%', 'LIKE') + ->condition('f.uri', $sql_uri_name . '_%/%', 'NOT LIKE') + ->execute(); + + $db_files = array(); + foreach ($result as $row) { + $db_files[basename($row->uri)] = 1; + } + + // Get the default IMCE directory scan, then filter down to database files. + $content = Imce::scanDir($dirname, $options); + foreach ($content['files'] as $filename => $file) { + if (!isset($db_files[$filename])) { + unset($content['files'][$filename]); + } + } + + return $content; + } + + /** + * Scan directory and return file list. + * + * This only work on Restricted Mode. + */ + public function customScanRestricted($dirname, $options) { + $content = array('files' => array(), 'subfolders' => array()); + $field_uri = $this->context['uri']; + $is_root = $this->context['is_root']; + + if ($dirname !== $field_uri) { + return $content; + } + + $entity_type = $this->context['entity_type']; + $field_name = $this->context['field_name']; + $field_storage = entity_load('field_storage_config', $entity_type . '.' . $field_name); + $entity_manager = \Drupal::entityManager(); + if ($entity_manager->hasDefinition($entity_type)) { + $storage = $entity_manager->getStorage($entity_type); + $table_mapping = $storage->getTableMapping(); + $field_table = $table_mapping->getDedicatedDataTableName($field_storage); + $field_column_name = $table_mapping->getFieldColumnName($field_storage, 'target_id'); + + $sql_uri = $field_uri . ($is_root ? '' : '/'); + $query = db_select($field_table, 'cf'); + $query->innerJoin('file_managed', 'f', 'f.fid = cf.' . $field_column_name); + $result = $query->fields('f') + ->condition('f.status', 1) + ->condition('f.uri', $sql_uri . '%', 'LIKE') + ->condition('f.uri', $sql_uri . '%/%', 'NOT LIKE') + ->execute(); + foreach ($result as $file) { + // Get real name. + $name = basename($file->uri); + $content['files'][$name] = $file->uri; + } + } + + return $content; + } +}