Version 1
[yaffs-website] / web / modules / contrib / blazy / src / Dejavu / BlazyEntityTrait.php
diff --git a/web/modules/contrib/blazy/src/Dejavu/BlazyEntityTrait.php b/web/modules/contrib/blazy/src/Dejavu/BlazyEntityTrait.php
new file mode 100644 (file)
index 0000000..5698128
--- /dev/null
@@ -0,0 +1,127 @@
+<?php
+
+namespace Drupal\blazy\Dejavu;
+
+use Drupal\Core\Entity\EntityInterface;
+
+/**
+ * A Trait common for supported entities.
+ *
+ * This file can be imported along with Drupal\blazy\Dejavu\BlazyVideoTrait
+ * to optionally support File/Media Entity where available.
+ */
+trait BlazyEntityTrait {
+
+  /**
+   * Returns the string value of the fields: link, or text.
+   */
+  public function getFieldString($entity, $field_name = '', $langcode = NULL) {
+    $value = '';
+    if (empty($field_name)) {
+      return $value;
+    }
+
+    if ($entity->hasTranslation($langcode)) {
+      // If the entity has translation, fetch the translated value.
+      $values = $entity->getTranslation($langcode)->get($field_name)->getValue();
+    }
+    else {
+      // Entity doesn't have translation, fetch original value.
+      $values = $entity->get($field_name)->getValue();
+    }
+
+    $value = isset($values[0]['uri']) ? $values[0]['uri'] : (isset($values[0]['value']) ? $values[0]['value'] : '');
+    $value = strip_tags($value);
+
+    return trim($value);
+  }
+
+  /**
+   * Returns the formatted renderable array of the field.
+   */
+  public function getFieldRenderable($entity, $field_name = '', $view_mode = 'full') {
+    $view = [];
+    $has_field = !empty($field_name) && isset($entity->{$field_name});
+    if ($has_field && !empty($entity->{$field_name}->view($view_mode)[0])) {
+      $view = $entity->get($field_name)->view($view_mode);
+
+      // Prevents quickedit to operate here as otherwise JS error.
+      // @see 2314185, 2284917, 2160321.
+      // @see quickedit_preprocess_field().
+      // @todo: Remove when it respects plugin annotation.
+      $view['#view_mode'] = '_custom';
+    }
+    return $view;
+  }
+
+  /**
+   * Build image/video preview either using theme_blazy(), or view builder.
+   *
+   * This is alternative to Drupal\blazy\BlazyFormatterManager used outside
+   * field formatters, such as Views field, or Entity Browser displays, etc.
+   *
+   * @param array $data
+   *   An array of data containing settings, and image item.
+   * @param object $entity
+   *   The media entity, else file entity to be associated to media if any.
+   * @param string $fallback
+   *   The fallback string to display such as file name or entity label.
+   *
+   * @return array
+   *   The renderable array of theme_blazy(), or view builder, else empty.
+   */
+  public function buildPreview(array $data, $entity, $fallback = '') {
+    $build = [];
+
+    if (!$entity instanceof EntityInterface) {
+      return [];
+    }
+
+    // Supports VEM/ME if Drupal\blazy\Dejavu\BlazyVideoTrait is imported.
+    if (method_exists($this, 'getMediaItem')) {
+      $this->getMediaItem($data, $entity);
+    }
+
+    $settings = &$data['settings'];
+    if (!empty($data['item'])) {
+      if (!empty($settings['media_switch'])) {
+        $is_lightbox = $this->blazyManager()->getLightboxes() && in_array($settings['media_switch'], $this->blazyManager()->getLightboxes());
+        $settings['lightbox'] = $is_lightbox ? $settings['media_switch'] : FALSE;
+      }
+      if (empty($settings['uri'])) {
+        $settings['uri'] = ($file = $data['item']->entity) && empty($data['item']->uri) ? $file->getFileUri() : $data['item']->uri;
+      }
+
+      // Provide simple Blazy, if required.
+      if (empty($settings['_basic'])) {
+        $build = $this->blazyManager()->getImage($data);
+      }
+      else {
+        $build = [
+          '#theme'    => 'blazy',
+          '#item'     => $data['item'],
+          '#settings' => $settings,
+        ];
+      }
+
+      // Provides a shortcut to get URI.
+      $build['#uri'] = empty($settings['uri']) ? '' : $settings['uri'];
+
+      // Allows top level elements to load Blazy once rather than per field.
+      // This is still here for non-supported Views style plugins, etc.
+      if (empty($settings['_detached'])) {
+        $load = $this->blazyManager()->attach($settings);
+
+        // Enforces loading elements hidden by EB "Show selected" button.
+        $load['drupalSettings']['blazy']['loadInvisible'] = TRUE;
+        $build['#attached'] = $load;
+      }
+    }
+    else {
+      $build = $this->blazyManager()->getEntityView($entity, $settings, $fallback);
+    }
+
+    return $build;
+  }
+
+}