You are here

class PhysicalFile in Entity Share 8.3

Handle physical file import.

Plugin annotation


@ImportProcessor(
  id = "physical_file",
  label = @Translation("Physical file"),
  description = @Translation("When importing a File entity, also import the physical file."),
  stages = {
    "process_entity" = 0,
  },
  locked = false,
)

Hierarchy

Expanded class hierarchy of PhysicalFile

File

modules/entity_share_client/src/Plugin/EntityShareClient/Processor/PhysicalFile.php, line 30

Namespace

Drupal\entity_share_client\Plugin\EntityShareClient\Processor
View source
class PhysicalFile extends ImportProcessorPluginBase implements PluginFormInterface {

  /**
   * The stream wrapper manager.
   *
   * @var \Drupal\Core\StreamWrapper\StreamWrapperManagerInterface
   */
  protected $streamWrapperManager;

  /**
   * Logger.
   *
   * @var \Psr\Log\LoggerInterface
   */
  protected $logger;

  /**
   * The remote manager.
   *
   * @var \Drupal\entity_share_client\Service\RemoteManagerInterface
   */
  protected $remoteManager;

  /**
   * The file system.
   *
   * @var \Drupal\Core\File\FileSystemInterface
   */
  protected $fileSystem;

  /**
   * {@inheritdoc}
   */
  public static function create(ContainerInterface $container, array $configuration, $plugin_id, $plugin_definition) {
    $instance = parent::create($container, $configuration, $plugin_id, $plugin_definition);
    $instance->streamWrapperManager = $container
      ->get('stream_wrapper_manager');
    $instance->logger = $container
      ->get('logger.channel.entity_share_client');
    $instance->remoteManager = $container
      ->get('entity_share_client.remote_manager');
    $instance->fileSystem = $container
      ->get('file_system');
    return $instance;
  }

  /**
   * {@inheritdoc}
   */
  public function defaultConfiguration() {
    return [
      'rename' => FALSE,
    ] + parent::defaultConfiguration();
  }

  /**
   * {@inheritdoc}
   */
  public function buildConfigurationForm(array $form, FormStateInterface $form_state) {
    $form['rename'] = [
      '#type' => 'checkbox',
      '#title' => $this
        ->t('Rename imported files with the same name, instead of overwriting'),
      '#description' => $this
        ->t('If a file with the same name exists, the imported file will be saved as filename_0 or filename_1... etc. <strong>Warning! This can make a lot of duplicated files on your websites!</strong>'),
      '#default_value' => $this->configuration['rename'],
    ];
    return $form;
  }

  /**
   * {@inheritdoc}
   *
   * @SuppressWarnings(PHPMD.ErrorControlOperator)
   */
  public function processEntity(RuntimeImportContext $runtime_import_context, ContentEntityInterface $processed_entity, array $entity_json_data) {
    if ($processed_entity instanceof FileInterface) {
      $field_mappings = $runtime_import_context
        ->getFieldMappings();
      $entity_type_id = $processed_entity
        ->getEntityTypeId();
      $entity_bundle = $processed_entity
        ->bundle();
      $uri_public_name = FALSE;
      if (isset($field_mappings[$entity_type_id][$entity_bundle]['uri'])) {
        $uri_public_name = $field_mappings[$entity_type_id][$entity_bundle]['uri'];
      }
      if (!$uri_public_name || !isset($entity_json_data['attributes'][$uri_public_name])) {
        $this->logger
          ->error('Impossible to get the URI of the file in JSON:API data. Please check that the server website is correctly exposing it.');
        $this
          ->messenger()
          ->addError($this
          ->t('Impossible to get the URI of the file in JSON:API data. Please check that the server website is correctly exposing it.'));
        return;
      }
      $remote_file_uri = $entity_json_data['attributes'][$uri_public_name]['value'];
      $remote_file_url = $entity_json_data['attributes'][$uri_public_name]['url'];
      $stream_wrapper = $this->streamWrapperManager
        ->getViaUri($remote_file_uri);
      $directory_uri = $stream_wrapper
        ->dirname($remote_file_uri);
      $log_variables = [
        '%url' => $remote_file_url,
        '%directory' => $directory_uri,
        '%id' => $processed_entity
          ->id(),
        '%uri' => $remote_file_uri,
      ];
      $file_overwrite_mode = $this->configuration['rename'] ? FileSystemInterface::EXISTS_RENAME : FileSystemInterface::EXISTS_REPLACE;
      $file_destination = $this->fileSystem
        ->getDestinationFilename($processed_entity
        ->getFileUri(), $file_overwrite_mode);
      $processed_entity
        ->setFileUri($file_destination);
      $processed_entity
        ->setFilename($this->fileSystem
        ->basename($file_destination));

      // Create the destination folder.
      if ($this->fileSystem
        ->prepareDirectory($directory_uri, FileSystemInterface::CREATE_DIRECTORY)) {
        try {
          $response = $this->remoteManager
            ->request($runtime_import_context
            ->getRemote(), 'GET', $remote_file_url);
          $file_content = (string) $response
            ->getBody();
          $result = @file_put_contents($file_destination, $file_content);
          if (!$result) {
            throw new \Exception('Error writing file to ' . $file_destination);
          }
        } catch (ClientException $e) {
          $this->logger
            ->warning('Error importing file id %id. Missing file: %url', $log_variables);
          $this
            ->messenger()
            ->addWarning($this
            ->t('Error importing file id %id. Missing file: %url', $log_variables));
        } catch (\Throwable $e) {
          $log_variables['@msg'] = $e
            ->getMessage();
          $this->logger
            ->error('Caught exception trying to import the file %url to %uri. Error message was @msg', $log_variables);
          $this
            ->messenger()
            ->addError($this
            ->t('Caught exception trying to import the file %url to %uri', $log_variables));
        }
      }
      else {
        $this->logger
          ->error('Impossible to write in the directory %directory', $log_variables);
        $this
          ->messenger()
          ->addError($this
          ->t('Impossible to write in the directory %directory', $log_variables));
      }
    }
  }

}

Members

Namesort descending Modifiers Type Description Overrides
DependencySerializationTrait::$_entityStorages protected property An array of entity type IDs keyed by the property name of their storages.
DependencySerializationTrait::$_serviceIds protected property An array of service IDs keyed by property name used for serialization.
DependencySerializationTrait::__sleep public function 1
DependencySerializationTrait::__wakeup public function 2
ImportProcessorInterface::STAGE_IS_ENTITY_IMPORTABLE constant Processing stage: is entity importable.
ImportProcessorInterface::STAGE_POST_ENTITY_SAVE constant Processing stage: post entity save.
ImportProcessorInterface::STAGE_PREPARE_ENTITY_DATA constant Processing stage: prepare entity data.
ImportProcessorInterface::STAGE_PREPARE_IMPORTABLE_ENTITY_DATA constant Processing stage: prepare importable entity data.
ImportProcessorInterface::STAGE_PROCESS_ENTITY constant Processing stage: process entity.
ImportProcessorPluginBase::getConfiguration public function Gets this plugin's configuration. Overrides ConfigurableInterface::getConfiguration
ImportProcessorPluginBase::getDescription public function Returns the plugin's description. Overrides ImportProcessorInterface::getDescription
ImportProcessorPluginBase::getWeight public function Returns the weight for a specific processing stage. Overrides ImportProcessorInterface::getWeight
ImportProcessorPluginBase::isEntityImportable public function Method called on STAGE_IS_ENTITY_IMPORTABLE. Overrides ImportProcessorInterface::isEntityImportable 2
ImportProcessorPluginBase::isLocked public function Determines whether this processor should always be enabled. Overrides ImportProcessorInterface::isLocked
ImportProcessorPluginBase::label public function Returns the label for use on the administration pages. Overrides ImportProcessorInterface::label
ImportProcessorPluginBase::postEntitySave public function Method called on STAGE_POST_ENTITY_SAVE. Overrides ImportProcessorInterface::postEntitySave 1
ImportProcessorPluginBase::prepareEntityData public function Method called on STAGE_PREPARE_ENTITY_DATA. Overrides ImportProcessorInterface::prepareEntityData
ImportProcessorPluginBase::prepareImportableEntityData public function Method called on STAGE_PREPARE_IMPORTABLE_ENTITY_DATA. Overrides ImportProcessorInterface::prepareImportableEntityData 4
ImportProcessorPluginBase::setConfiguration public function Sets the configuration for this plugin instance. Overrides ConfigurableInterface::setConfiguration
ImportProcessorPluginBase::setWeight public function Sets the weight for a specific processing stage. Overrides ImportProcessorInterface::setWeight
ImportProcessorPluginBase::submitConfigurationForm public function Form submission handler.
ImportProcessorPluginBase::supportsStage public function Checks whether this processor implements a particular stage. Overrides ImportProcessorInterface::supportsStage
ImportProcessorPluginBase::validateConfigurationForm public function Form validation handler.
MessengerTrait::$messenger protected property The messenger. 29
MessengerTrait::messenger public function Gets the messenger. 29
MessengerTrait::setMessenger public function Sets the messenger.
PhysicalFile::$fileSystem protected property The file system.
PhysicalFile::$logger protected property Logger.
PhysicalFile::$remoteManager protected property The remote manager.
PhysicalFile::$streamWrapperManager protected property The stream wrapper manager.
PhysicalFile::buildConfigurationForm public function Form constructor. Overrides PluginFormInterface::buildConfigurationForm
PhysicalFile::create public static function Creates an instance of the plugin. Overrides ImportProcessorPluginBase::create
PhysicalFile::defaultConfiguration public function Gets default configuration for this plugin. Overrides ImportProcessorPluginBase::defaultConfiguration
PhysicalFile::processEntity public function Plugin annotation @SuppressWarnings(PHPMD . ErrorControlOperator); Overrides ImportProcessorPluginBase::processEntity
PluginBase::$configuration protected property Configuration information passed into the plugin. 1
PluginBase::$pluginDefinition protected property The plugin implementation definition. 1
PluginBase::$pluginId protected property The plugin_id.
PluginBase::DERIVATIVE_SEPARATOR constant A string which is used to separate base plugin IDs from the derivative ID.
PluginBase::getBaseId public function Gets the base_plugin_id of the plugin instance. Overrides DerivativeInspectionInterface::getBaseId
PluginBase::getDerivativeId public function Gets the derivative_id of the plugin instance. Overrides DerivativeInspectionInterface::getDerivativeId
PluginBase::getPluginDefinition public function Gets the definition of the plugin implementation. Overrides PluginInspectionInterface::getPluginDefinition 3
PluginBase::getPluginId public function Gets the plugin_id of the plugin instance. Overrides PluginInspectionInterface::getPluginId
PluginBase::isConfigurable public function Determines if the plugin is configurable.
PluginBase::__construct public function Constructs a \Drupal\Component\Plugin\PluginBase object. 92
StringTranslationTrait::$stringTranslation protected property The string translation service. 1
StringTranslationTrait::formatPlural protected function Formats a string containing a count of items.
StringTranslationTrait::getNumberOfPlurals protected function Returns the number of plurals supported by a given language.
StringTranslationTrait::getStringTranslation protected function Gets the string translation service.
StringTranslationTrait::setStringTranslation public function Sets the string translation service to use. 2
StringTranslationTrait::t protected function Translates a string to the current language or to a given language.