5 * Contains \Drupal\filefield_sources\ImceScanner.
8 namespace Drupal\filefield_sources;
13 * Imce scanner service.
22 private $context = NULL;
25 * Sets scanner context.
27 public function setContext($context) {
28 $this->context = $context;
32 * Scan and return files, subdirectories.
34 public function customScanFull($dirname, $options) {
35 // Get a list of files in the database for this directory.
36 $scheme = $this->context['scheme'];
37 $sql_uri_name = $dirname == '.' ? $scheme . '://' : $dirname . '/';
39 $result = db_select('file_managed', 'f')
40 ->fields('f', array('uri'))
41 ->condition('f.uri', $sql_uri_name . '%', 'LIKE')
42 ->condition('f.uri', $sql_uri_name . '_%/%', 'NOT LIKE')
46 foreach ($result as $row) {
47 $db_files[basename($row->uri)] = 1;
50 // Get the default IMCE directory scan, then filter down to database files.
51 $content = Imce::scanDir($dirname, $options);
52 foreach ($content['files'] as $filename => $file) {
53 if (!isset($db_files[$filename])) {
54 unset($content['files'][$filename]);
62 * Scan directory and return file list.
64 * This only work on Restricted Mode.
66 public function customScanRestricted($dirname, $options) {
67 $content = array('files' => array(), 'subfolders' => array());
68 $field_uri = $this->context['uri'];
69 $is_root = $this->context['is_root'];
71 if ($dirname !== $field_uri) {
75 $entity_type = $this->context['entity_type'];
76 $field_name = $this->context['field_name'];
77 $field_storage = entity_load('field_storage_config', $entity_type . '.' . $field_name);
78 $entity_manager = \Drupal::entityManager();
79 if ($entity_manager->hasDefinition($entity_type)) {
80 $storage = $entity_manager->getStorage($entity_type);
81 $table_mapping = $storage->getTableMapping();
82 $field_table = $table_mapping->getDedicatedDataTableName($field_storage);
83 $field_column_name = $table_mapping->getFieldColumnName($field_storage, 'target_id');
85 $sql_uri = $field_uri . ($is_root ? '' : '/');
86 $query = db_select($field_table, 'cf');
87 $query->innerJoin('file_managed', 'f', 'f.fid = cf.' . $field_column_name);
88 $result = $query->fields('f')
89 ->condition('f.status', 1)
90 ->condition('f.uri', $sql_uri . '%', 'LIKE')
91 ->condition('f.uri', $sql_uri . '%/%', 'NOT LIKE')
93 foreach ($result as $file) {
95 $name = basename($file->uri);
96 $content['files'][$name] = $file->uri;