Further modules included.
[yaffs-website] / web / modules / contrib / filefield_sources / src / ImceScanner.php
diff --git a/web/modules/contrib/filefield_sources/src/ImceScanner.php b/web/modules/contrib/filefield_sources/src/ImceScanner.php
new file mode 100644 (file)
index 0000000..1993c0e
--- /dev/null
@@ -0,0 +1,102 @@
+<?php
+
+/**
+ * @file
+ * Contains \Drupal\filefield_sources\ImceScanner.
+ */
+
+namespace Drupal\filefield_sources;
+
+use Drupal\imce\Imce;
+
+/**
+ * Imce scanner service.
+ */
+class ImceScanner {
+
+  /**
+   * Scanner context.
+   *
+   * @var mixed
+   */
+  private $context = NULL;
+
+  /**
+   * Sets scanner context.
+   */
+  public function setContext($context) {
+    $this->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;
+  }
+}