1993c0e7735bc3fe03cbae97678f46fd652bd2a4
[yaffs-website] / web / modules / contrib / filefield_sources / src / ImceScanner.php
1 <?php
2
3 /**
4  * @file
5  * Contains \Drupal\filefield_sources\ImceScanner.
6  */
7
8 namespace Drupal\filefield_sources;
9
10 use Drupal\imce\Imce;
11
12 /**
13  * Imce scanner service.
14  */
15 class ImceScanner {
16
17   /**
18    * Scanner context.
19    *
20    * @var mixed
21    */
22   private $context = NULL;
23
24   /**
25    * Sets scanner context.
26    */
27   public function setContext($context) {
28     $this->context = $context;
29   }
30
31   /**
32    * Scan and return files, subdirectories.
33    */
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 . '/';
38
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')
43       ->execute();
44
45     $db_files = array();
46     foreach ($result as $row) {
47       $db_files[basename($row->uri)] = 1;
48     }
49
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]);
55       }
56     }
57
58     return $content;
59   }
60
61   /**
62    * Scan directory and return file list.
63    *
64    * This only work on Restricted Mode.
65    */
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'];
70
71     if ($dirname !== $field_uri) {
72       return $content;
73     }
74
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');
84
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')
92         ->execute();
93       foreach ($result as $file) {
94         // Get real name.
95         $name = basename($file->uri);
96         $content['files'][$name] = $file->uri;
97       }
98     }
99
100     return $content;
101   }
102 }