You are here

public function ConfigDefaultImageFormatterTrait::viewElements in Config default image 8.2

File

src/Plugin/Field/FieldFormatter/ConfigDefaultImageFormatterTrait.php, line 123

Class

ConfigDefaultImageFormatterTrait
ConfigDefaultImageFormatterTrait trait.

Namespace

Drupal\config_default_image\Plugin\Field\FieldFormatter

Code

public function viewElements(FieldItemListInterface $items, $langcode) {
  $elements = parent::viewElements($items, $langcode);
  if (empty($elements)) {
    $default_image = $this
      ->getSetting('default_image');
    $image_path = $default_image['path'];
    if (!empty($image_path)) {
      if ($default_image['use_image_style']) {

        // $image_path must be ready for
        // Drupal\image\Entity\ImageStyle::buildUri().
        // This needs a valid scheme.
        // As long as https://www.drupal.org/project/drupal/issues/1308152 is
        // not fixed, files stored outside from public, private and temporary
        // directories have no scheme.
        // So that if our path has no scheme, we copy the file to the public
        // files directory and add it as scheme.
        if (!StreamWrapperManager::getScheme($image_path)) {
          $image_path = ltrim($image_path, '/');
          $destination = 'public://config_default_image/' . $image_path;
          $directory = $this->fileSystem
            ->dirname($destination);
          $this->fileSystem
            ->prepareDirectory($directory, FileSystemInterface::CREATE_DIRECTORY);
          if (!file_exists($destination)) {
            $image_path = $this->fileSystem
              ->copy($image_path, $destination);
          }
          else {
            $image_path = $destination;
          }
        }
      }
      else {
        $this
          ->setSetting('image_style', FALSE);
      }
      $file = File::create([
        'uid' => 0,
        'filename' => $this->fileSystem
          ->basename($image_path),
        'uri' => $image_path,
        'status' => 1,
      ]);

      /* @see \Drupal\image\Plugin\Field\FieldFormatter\ImageFormatterBase::getEntitiesToView() */

      // Clone the FieldItemList into a runtime-only object for the formatter,
      // so that the fallback image can be rendered without affecting the
      // field values in the entity being rendered.
      $items = clone $items;
      $items
        ->setValue([
        'target_id' => $file
          ->id(),
        'alt' => $default_image['alt'],
        'title' => $default_image['title'],
        'width' => $default_image['width'],
        'height' => $default_image['height'],
        'entity' => $file,
        '_loaded' => TRUE,
        '_is_default' => TRUE,
      ]);
      $file->_referringItem = $items[0];

      // For maximum compatibility with other modules such as SVG Image, we
      // call the parent image formatter with our items instead of
      // reimplementing the viewElements() code.
      $elements = parent::viewElements($items, $langcode);
    }
  }
  return $elements;
}