class File in Feeds 8.3
Same name in this branch
- 8.3 src/Utility/File.php \Drupal\feeds\Utility\File
- 8.3 src/Feeds/Target/File.php \Drupal\feeds\Feeds\Target\File
Defines a file field mapper.
Plugin annotation
@FeedsTarget(
  id = "file",
  field_types = {"file"}
)
Hierarchy
- class \Drupal\Component\Plugin\PluginBase implements DerivativeInspectionInterface, PluginInspectionInterface- class \Drupal\Core\Plugin\PluginBase uses DependencySerializationTrait, MessengerTrait, StringTranslationTrait- class \Drupal\feeds\Plugin\Type\PluginBase implements FeedsPluginInterface uses DependencyTrait- class \Drupal\feeds\Plugin\Type\ConfigurablePluginBase implements PluginFormInterface- class \Drupal\feeds\Plugin\Type\Target\TargetBase implements TargetInterface- class \Drupal\feeds\Plugin\Type\Target\FieldTargetBase implements ConfigurableTargetInterface, TranslatableTargetInterface- class \Drupal\feeds\Feeds\Target\EntityReference implements ContainerFactoryPluginInterface, ConfigurableTargetInterface- class \Drupal\feeds\Feeds\Target\File
 
 
- class \Drupal\feeds\Feeds\Target\EntityReference implements ContainerFactoryPluginInterface, ConfigurableTargetInterface
 
- class \Drupal\feeds\Plugin\Type\Target\FieldTargetBase implements ConfigurableTargetInterface, TranslatableTargetInterface
 
- class \Drupal\feeds\Plugin\Type\Target\TargetBase implements TargetInterface
 
- class \Drupal\feeds\Plugin\Type\ConfigurablePluginBase implements PluginFormInterface
 
- class \Drupal\feeds\Plugin\Type\PluginBase implements FeedsPluginInterface uses DependencyTrait
 
- class \Drupal\Core\Plugin\PluginBase uses DependencySerializationTrait, MessengerTrait, StringTranslationTrait
Expanded class hierarchy of File
2 files declare their use of File
- FileTest.php in tests/src/ Unit/ Feeds/ Target/ FileTest.php 
- FileTest.php in tests/src/ Kernel/ Feeds/ Target/ FileTest.php 
1 string reference to 'File'
- UploadFetcherFeedForm::buildConfigurationForm in src/Feeds/ Fetcher/ Form/ UploadFetcherFeedForm.php 
- Form constructor.
File
- src/Feeds/ Target/ File.php, line 27 
Namespace
Drupal\feeds\Feeds\TargetView source
class File extends EntityReference {
  /**
   * The http client.
   *
   * @var \GuzzleHttp\ClientInterface
   */
  protected $client;
  /**
   * The list of allowed file extensions.
   *
   * @var string[]
   */
  protected $fileExtensions;
  /**
   * Token service.
   *
   * @var \Drupal\Core\Utility\Token
   */
  protected $token;
  /**
   * The file and stream wrapper helper.
   *
   * @var \Drupal\Core\File\FileSystemInterface
   */
  protected $fileSystem;
  /**
   * Constructs a File object.
   *
   * @param array $configuration
   *   The plugin configuration.
   * @param string $plugin_id
   *   The plugin id.
   * @param array $plugin_definition
   *   The plugin definition.
   * @param \Drupal\Core\Entity\EntityTypeManagerInterface $entity_type_manager
   *   The entity type manager.
   * @param \GuzzleHttp\ClientInterface $client
   *   The http client.
   * @param \Drupal\Core\Utility\Token $token
   *   The token service.
   * @param \Drupal\Core\Entity\EntityFieldManagerInterface $entity_field_manager
   *   The entity field manager.
   * @param \Drupal\feeds\EntityFinderInterface $entity_finder
   *   The Feeds entity finder service.
   * @param \Drupal\Core\File\FileSystemInterface $file_system
   *   The file and stream wrapper helper.
   */
  public function __construct(array $configuration, $plugin_id, array $plugin_definition, EntityTypeManagerInterface $entity_type_manager, ClientInterface $client, Token $token, EntityFieldManagerInterface $entity_field_manager, EntityFinderInterface $entity_finder, FileSystemInterface $file_system) {
    $this->client = $client;
    $this->token = $token;
    parent::__construct($configuration, $plugin_id, $plugin_definition, $entity_type_manager, $entity_field_manager, $entity_finder);
    $this->fileExtensions = array_filter(explode(' ', $this->settings['file_extensions']));
    $this->fileSystem = $file_system;
  }
  /**
   * {@inheritdoc}
   */
  public static function create(ContainerInterface $container, array $configuration, $plugin_id, $plugin_definition) {
    return new static($configuration, $plugin_id, $plugin_definition, $container
      ->get('entity_type.manager'), $container
      ->get('http_client'), $container
      ->get('token'), $container
      ->get('entity_field.manager'), $container
      ->get('feeds.entity_finder'), $container
      ->get('file_system'));
  }
  /**
   * {@inheritdoc}
   */
  protected static function prepareTarget(FieldDefinitionInterface $field_definition) {
    return FieldTargetDefinition::createFromFieldDefinition($field_definition)
      ->addProperty('target_id')
      ->addProperty('description');
  }
  /**
   * {@inheritdoc}
   */
  protected function prepareValue($delta, array &$values) {
    foreach ($values as $column => $value) {
      switch ($column) {
        case 'description':
          $values[$column] = (string) $value;
          break;
        case 'target_id':
          $values[$column] = $this
            ->getFile($value);
          break;
      }
    }
    $values['display'] = (int) $this->settings['display_default'];
  }
  /**
   * {@inheritdoc}
   *
   * Filesize and MIME-type aren't sensible fields to match on so these are
   * filtered out.
   */
  protected function filterFieldTypes(FieldStorageDefinitionInterface $field) {
    $ignore_fields = [
      'filesize',
      'filemime',
    ];
    return in_array($field
      ->getName(), $ignore_fields) ? FALSE : parent::filterFieldTypes($field);
  }
  /**
   * {@inheritdoc}
   */
  protected function getEntityType() {
    return 'file';
  }
  /**
   * {@inheritdoc}
   *
   * The file entity doesn't support any bundles. Providing an empty array here
   * will prevent the bundle check from being added in the find entity query.
   */
  protected function getBundles() {
    return [];
  }
  /**
   * Returns a file id given a url.
   *
   * @param string $value
   *   A URL file object.
   *
   * @return int
   *   The file id.
   *
   * @throws \Drupal\feeds\Exception\EmptyFeedException
   *   In case an empty file url is given.
   */
  protected function getFile($value) {
    if (empty($value)) {
      // No file.
      throw new EmptyFeedException('The given file url is empty.');
    }
    // Perform a lookup agains the value using the configured reference method.
    if (FALSE !== ($fid = $this
      ->findEntity($this->configuration['reference_by'], $value))) {
      return $fid;
    }
    // Compose file path.
    $filepath = $this
      ->getDestinationDirectory() . '/' . $this
      ->getFileName($value);
    switch ($this->configuration['existing']) {
      case FileSystemInterface::EXISTS_ERROR:
        if (file_exists($filepath) && ($fid = $this
          ->findEntity('uri', $filepath))) {
          return $fid;
        }
        if ($file = file_save_data($this
          ->getContent($value), $filepath, FileSystemInterface::EXISTS_REPLACE)) {
          return $file
            ->id();
        }
        break;
      default:
        if ($file = file_save_data($this
          ->getContent($value), $filepath, $this->configuration['existing'])) {
          return $file
            ->id();
        }
    }
    // Something bad happened while trying to save the file to the database. We
    // need to throw an exception so that we don't save an incomplete field
    // value.
    throw new TargetValidationException($this
      ->t('There was an error saving the file: %file', [
      '%file' => $filepath,
    ]));
  }
  /**
   * Prepares destination directory and returns its path.
   *
   * @return string
   *   The directory to save the file to.
   */
  protected function getDestinationDirectory() {
    $destination = $this->token
      ->replace($this->settings['uri_scheme'] . '://' . trim($this->settings['file_directory'], '/'));
    $this->fileSystem
      ->prepareDirectory($destination, FileSystemInterface::MODIFY_PERMISSIONS | FileSystemInterface::CREATE_DIRECTORY);
    return $destination;
  }
  /**
   * Extracts the file name from the given url and checks for valid extension.
   *
   * @param string $url
   *   The URL to get the file name for.
   *
   * @return string
   *   The file name.
   *
   * @throws \Drupal\feeds\Exception\TargetValidationException
   *   In case the file extension is not valid.
   */
  protected function getFileName($url) {
    $filename = trim(\Drupal::service('file_system')
      ->basename($url), " \t\n\r\0\v.");
    // Remove query string from file name, if it has one.
    list($filename) = explode('?', $filename);
    $extension = substr($filename, strrpos($filename, '.') + 1);
    if (!preg_grep('/' . $extension . '/i', $this->fileExtensions)) {
      throw new TargetValidationException($this
        ->t('The file, %url, failed to save because the extension, %ext, is invalid.', [
        '%url' => $url,
        '%ext' => $extension,
      ]));
    }
    return $filename;
  }
  /**
   * Attempts to download the file at the given url.
   *
   * @param string $url
   *   The URL to download a file from.
   *
   * @return string
   *   The file contents.
   *
   * @throws \Drupal\feeds\Exception\TargetValidationException
   *   In case the file could not be downloaded.
   */
  protected function getContent($url) {
    $response = $this->client
      ->request('GET', $url);
    if ($response
      ->getStatusCode() >= 400) {
      $args = [
        '%url' => $url,
        '@code' => $response
          ->getStatusCode(),
      ];
      throw new TargetValidationException($this
        ->t('Download of %url failed with code @code.', $args));
    }
    return (string) $response
      ->getBody();
  }
  /**
   * {@inheritdoc}
   */
  public function defaultConfiguration() {
    return [
      'existing' => FileSystemInterface::EXISTS_ERROR,
    ] + parent::defaultConfiguration();
  }
  /**
   * {@inheritdoc}
   *
   * @todo Inject $user.
   */
  public function buildConfigurationForm(array $form, FormStateInterface $form_state) {
    $form = parent::buildConfigurationForm($form, $form_state);
    $options = [
      FileSystemInterface::EXISTS_REPLACE => $this
        ->t('Replace'),
      FileSystemInterface::EXISTS_RENAME => $this
        ->t('Rename'),
      FileSystemInterface::EXISTS_ERROR => $this
        ->t('Ignore'),
    ];
    $form['existing'] = [
      '#type' => 'select',
      '#title' => $this
        ->t('Handle existing files'),
      '#options' => $options,
      '#default_value' => $this->configuration['existing'],
    ];
    return $form;
  }
  /**
   * {@inheritdoc}
   */
  public function getSummary() {
    $summary = parent::getSummary();
    switch ($this->configuration['existing']) {
      case FileSystemInterface::EXISTS_REPLACE:
        $message = 'Replace';
        break;
      case FileSystemInterface::EXISTS_RENAME:
        $message = 'Rename';
        break;
      case FileSystemInterface::EXISTS_ERROR:
        $message = 'Ignore';
        break;
    }
    $summary[] = $this
      ->t('Existing files: %existing', [
      '%existing' => $message,
    ]);
    return $summary;
  }
  /**
   * {@inheritdoc}
   */
  protected function createEntity($value) {
    if (!strlen(trim($value))) {
      return FALSE;
    }
    $bundles = $this
      ->getBundles();
    $entity = $this->entityTypeManager
      ->getStorage($this
      ->getEntityType())
      ->create([
      $this
        ->getLabelKey() => $value,
      $this
        ->getBundleKey() => reset($bundles),
      'uri' => $value,
    ]);
    $entity
      ->save();
    return $entity
      ->id();
  }
}Members
| Name   | Modifiers | Type | Description | Overrides | 
|---|---|---|---|---|
| ConfigurablePluginBase:: | public | function | Form validation handler. Overrides PluginFormInterface:: | |
| DependencySerializationTrait:: | protected | property | An array of entity type IDs keyed by the property name of their storages. | |
| DependencySerializationTrait:: | protected | property | An array of service IDs keyed by property name used for serialization. | |
| DependencySerializationTrait:: | public | function | 1 | |
| DependencySerializationTrait:: | public | function | 2 | |
| DependencyTrait:: | protected | property | The object's dependencies. | |
| DependencyTrait:: | protected | function | Adds multiple dependencies. | |
| DependencyTrait:: | protected | function | Adds a dependency. | |
| EntityReference:: | protected | property | The entity field manager. | |
| EntityReference:: | protected | property | The Feeds entity finder service. | |
| EntityReference:: | protected | property | The entity type manager. | |
| EntityReference:: | protected | function | Tries to lookup an existing entity. | |
| EntityReference:: | protected | function | Searches for an entity by entity key. | |
| EntityReference:: | protected | function | Returns the entity type's bundle key. | |
| EntityReference:: | public | function | Returns options for feeds_item configuration. | |
| EntityReference:: | protected | function | Returns the entity type's label key. | |
| EntityReference:: | protected | function | Returns the entity type's langcode key, if it has one. | |
| EntityReference:: | protected | function | Returns a list of fields that may be used to reference by. | |
| EntityReference:: | public | function | Sets the values on an object. Overrides FieldTargetBase:: | |
| FieldTargetBase:: | protected | property | The field settings. | |
| FieldTargetBase:: | protected | property | The language manager. | |
| FieldTargetBase:: | protected | function | Adds a message. | |
| FieldTargetBase:: | public | function | Calculates dependencies for the configured plugin. Overrides PluginBase:: | |
| FieldTargetBase:: | public | function | Get entity, or entity translation to set the map. | |
| FieldTargetBase:: | public | function | Gets the configured language. Overrides TranslatableTargetInterface:: | |
| FieldTargetBase:: | protected | function | Gets the language manager. | |
| FieldTargetBase:: | protected | function | Returns the messenger to use. | |
| FieldTargetBase:: | protected | function | Constructs a base query which is used to find an existing entity. | |
| FieldTargetBase:: | public | function | Looks for an existing entity and returns an entity ID if found. | |
| FieldTargetBase:: | public | function | Returns if the value for the target is empty. Overrides TargetInterface:: | |
| FieldTargetBase:: | public | function | Returns if the target is mutable. Overrides TargetInterface:: | 1 | 
| FieldTargetBase:: | protected | function | Checks if the targeted field is translatable. | |
| FieldTargetBase:: | public | function | Checks if the target is translatable. Overrides TranslatableTargetInterface:: | |
| FieldTargetBase:: | public | function | Checks if the language selected on the target exists. Overrides TranslatableTargetInterface:: | |
| FieldTargetBase:: | public | function | Allows a plugin to define whether it should be removed. Overrides TargetBase:: | |
| FieldTargetBase:: | protected | function | Prepares the the values that will be mapped to an entity. | |
| FieldTargetBase:: | public | function | Sets the language manager. | |
| FieldTargetBase:: | public static | function | Returns the targets defined by this plugin. Overrides TargetInterface:: | 1 | 
| File:: | protected | property | The http client. | |
| File:: | protected | property | The list of allowed file extensions. | |
| File:: | protected | property | The file and stream wrapper helper. | |
| File:: | protected | property | Token service. | |
| File:: | public | function | @todo Inject $user. Overrides EntityReference:: | |
| File:: | public static | function | Creates an instance of the plugin. Overrides EntityReference:: | |
| File:: | protected | function | Creates a new entity with the given label and saves it. Overrides EntityReference:: | |
| File:: | public | function | Gets default configuration for this plugin. Overrides EntityReference:: | |
| File:: | protected | function | Filesize and MIME-type aren't sensible fields to match on so these are
filtered out. Overrides EntityReference:: | |
| File:: | protected | function | The file entity doesn't support any bundles. Providing an empty array here
will prevent the bundle check from being added in the find entity query. Overrides EntityReference:: | |
| File:: | protected | function | Attempts to download the file at the given url. | |
| File:: | protected | function | Prepares destination directory and returns its path. | |
| File:: | protected | function | Returns the entity type to reference. Overrides EntityReference:: | |
| File:: | protected | function | Returns a file id given a url. | |
| File:: | protected | function | Extracts the file name from the given url and checks for valid extension. | |
| File:: | public | function | Returns the summary for a target. Overrides EntityReference:: | |
| File:: | protected static | function | Prepares a target definition. Overrides EntityReference:: | 1 | 
| File:: | protected | function | Prepares a single value. Overrides EntityReference:: | 1 | 
| File:: | public | function | Constructs a File object. Overrides EntityReference:: | |
| MessengerTrait:: | protected | property | The messenger. | 29 | 
| MessengerTrait:: | public | function | Gets the messenger. | 29 | 
| MessengerTrait:: | public | function | Sets the messenger. | |
| PluginBase:: | protected | property | Configuration information passed into the plugin. | 1 | 
| PluginBase:: | protected | property | The importer this plugin is working for. | |
| PluginBase:: | protected | property | The link generator. | |
| PluginBase:: | protected | property | The plugin implementation definition. | 1 | 
| PluginBase:: | protected | property | The plugin_id. | |
| PluginBase:: | protected | property | The url generator. | |
| PluginBase:: | private | function | Returns the service container. | |
| PluginBase:: | public | function | Returns default feed configuration. Overrides FeedsPluginInterface:: | 3 | 
| PluginBase:: | constant | A string which is used to separate base plugin IDs from the derivative ID. | ||
| PluginBase:: | public | function | Gets the base_plugin_id of the plugin instance. Overrides DerivativeInspectionInterface:: | |
| PluginBase:: | public | function | Gets this plugin's configuration. Overrides ConfigurableInterface:: | |
| PluginBase:: | public | function | Gets the derivative_id of the plugin instance. Overrides DerivativeInspectionInterface:: | |
| PluginBase:: | public | function | Gets the definition of the plugin implementation. Overrides PluginInspectionInterface:: | 3 | 
| PluginBase:: | public | function | Gets the plugin_id of the plugin instance. Overrides PluginInspectionInterface:: | |
| PluginBase:: | public | function | Determines if the plugin is configurable. | |
| PluginBase:: | protected | function | Renders a link to a route given a route name and its parameters. | |
| PluginBase:: | protected | function | Returns the link generator service. | |
| PluginBase:: | public | function | A feed is being deleted. | 3 | 
| PluginBase:: | public | function | A feed is being saved. | |
| PluginBase:: | public | function | The feed type is being deleted. | 1 | 
| PluginBase:: | public | function | The feed type is being saved. | 1 | 
| PluginBase:: | public | function | Returns the type of plugin. Overrides FeedsPluginInterface:: | |
| PluginBase:: | public | function | Sets the configuration for this plugin instance. Overrides ConfigurableInterface:: | 1 | 
| PluginBase:: | protected | function | Generates a URL or path for a specific route based on the given parameters. | |
| PluginBase:: | protected | function | Returns the URL generator service. | |
| StringTranslationTrait:: | protected | property | The string translation service. | 1 | 
| StringTranslationTrait:: | protected | function | Formats a string containing a count of items. | |
| StringTranslationTrait:: | protected | function | Returns the number of plurals supported by a given language. | |
| StringTranslationTrait:: | protected | function | Gets the string translation service. | |
| StringTranslationTrait:: | public | function | Sets the string translation service to use. | 2 | 
| StringTranslationTrait:: | protected | function | Translates a string to the current language or to a given language. | |
| TargetBase:: | protected | property | The target definition. | |
| TargetBase:: | public | function | Returns the target's definition. Overrides TargetInterface:: | |
| TargetBase:: | public | function | Form submission handler. Overrides ConfigurablePluginBase:: | 
