FileSelection.php

Same filename and directory in other branches
  1. 9 core/modules/file/src/Plugin/EntityReferenceSelection/FileSelection.php
  2. 8.9.x core/modules/file/src/Plugin/EntityReferenceSelection/FileSelection.php
  3. 10 core/modules/file/src/Plugin/EntityReferenceSelection/FileSelection.php

Namespace

Drupal\file\Plugin\EntityReferenceSelection

File

core/modules/file/src/Plugin/EntityReferenceSelection/FileSelection.php

View source
<?php

namespace Drupal\file\Plugin\EntityReferenceSelection;

use Drupal\Core\Entity\Attribute\EntityReferenceSelection;
use Drupal\Core\Entity\Plugin\EntityReferenceSelection\DefaultSelection;
use Drupal\Core\StringTranslation\TranslatableMarkup;
use Drupal\file\FileInterface;

/**
 * Provides specific access control for the file entity type.
 */
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', FileInterface::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;
    }

}

Classes

Title Deprecated Summary
FileSelection Provides specific access control for the file entity type.

Buggy or inaccurate documentation? Please file an issue. Need support? Need help programming? Connect with the Drupal community.