Version 1
[yaffs-website] / web / core / modules / file / src / Plugin / EntityReferenceSelection / FileSelection.php
diff --git a/web/core/modules/file/src/Plugin/EntityReferenceSelection/FileSelection.php b/web/core/modules/file/src/Plugin/EntityReferenceSelection/FileSelection.php
new file mode 100644 (file)
index 0000000..18abe83
--- /dev/null
@@ -0,0 +1,62 @@
+<?php
+
+namespace Drupal\file\Plugin\EntityReferenceSelection;
+
+use Drupal\Core\Entity\Plugin\EntityReferenceSelection\DefaultSelection;
+
+/**
+ * Provides specific access control for the file entity type.
+ *
+ * @EntityReferenceSelection(
+ *   id = "default:file",
+ *   label = @Translation("File selection"),
+ *   entity_types = {"file"},
+ *   group = "default",
+ *   weight = 1
+ * )
+ */
+class FileSelection extends DefaultSelection {
+
+  /**
+   * {@inheritdoc}
+   */
+  protected function buildEntityQuery($match = NULL, $match_operator = 'CONTAINS') {
+    $query = parent::buildEntityQuery($match, $match_operator);
+    // Allow referencing :
+    // - files with status "permanent"
+    // - or files uploaded by the current user (since newly uploaded files only
+    //   become "permanent" after the containing entity gets validated and
+    //   saved.)
+    $query->condition($query->orConditionGroup()
+      ->condition('status', FILE_STATUS_PERMANENT)
+      ->condition('uid', $this->currentUser->id()));
+    return $query;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function createNewEntity($entity_type_id, $bundle, $label, $uid) {
+    $file = parent::createNewEntity($entity_type_id, $bundle, $label, $uid);
+
+    // In order to create a referenceable file, it needs to have a "permanent"
+    // status.
+    /** @var \Drupal\file\FileInterface $file */
+    $file->setPermanent();
+
+    return $file;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function validateReferenceableNewEntities(array $entities) {
+    $entities = parent::validateReferenceableNewEntities($entities);
+    $entities = array_filter($entities, function ($file) {
+      /** @var \Drupal\file\FileInterface $file */
+      return $file->isPermanent() || $file->getOwnerId() === $this->currentUser->id();
+    });
+    return $entities;
+  }
+
+}