|
@@ -0,0 +1,110 @@
|
|
|
+<?php
|
|
|
+
|
|
|
+namespace Drupal\vue_link_formatter\Plugin\Field\FieldFormatter;
|
|
|
+
|
|
|
+use Drupal\Core\Entity\EntityStorageInterface;
|
|
|
+use Drupal\Core\Field\FieldItemListInterface;
|
|
|
+use Drupal\Core\Field\FieldDefinitionInterface;
|
|
|
+use Drupal\Core\Link;
|
|
|
+use Drupal\Core\Plugin\ContainerFactoryPluginInterface;
|
|
|
+use Drupal\Core\Session\AccountInterface;
|
|
|
+use Drupal\Core\Url;
|
|
|
+use Drupal\image\Entity\ImageStyle;
|
|
|
+use Symfony\Component\DependencyInjection\ContainerInterface;
|
|
|
+use Drupal\Core\Form\FormStateInterface;
|
|
|
+use Drupal\Core\Cache\Cache;
|
|
|
+use Drupal\image\Plugin\Field\FieldFormatter\ImageFormatter;
|
|
|
+
|
|
|
+/**
|
|
|
+ * Plugin implementation of the 'image' formatter with vuejs attributes.
|
|
|
+ *
|
|
|
+ * @FieldFormatter(
|
|
|
+ * id = "vueimage",
|
|
|
+ * label = @Translation("Vue Image"),
|
|
|
+ * field_types = {
|
|
|
+ * "image"
|
|
|
+ * },
|
|
|
+ * quickedit = {
|
|
|
+ * "editor" = "image"
|
|
|
+ * }
|
|
|
+ * )
|
|
|
+ */
|
|
|
+class VueImageFormatter extends ImageFormatter {
|
|
|
+
|
|
|
+ /**
|
|
|
+ * {@inheritdoc}
|
|
|
+ */
|
|
|
+ public function viewElements(FieldItemListInterface $items, $langcode) {
|
|
|
+ $elements = [];
|
|
|
+ $files = $this->getEntitiesToView($items, $langcode);
|
|
|
+
|
|
|
+ // Early opt-out if the field is empty.
|
|
|
+ if (empty($files)) {
|
|
|
+ return $elements;
|
|
|
+ }
|
|
|
+
|
|
|
+ $url = NULL;
|
|
|
+ $image_link_setting = $this->getSetting('image_link');
|
|
|
+ // Check if the formatter involves a link.
|
|
|
+ if ($image_link_setting == 'content') {
|
|
|
+ $entity = $items->getEntity();
|
|
|
+ if (!$entity->isNew()) {
|
|
|
+ $url = $entity->toUrl();
|
|
|
+ $url->setOption('attributes', array(
|
|
|
+ '@click.prevent' => 'onClickLink',
|
|
|
+ 'data-id' => $entity->id(),
|
|
|
+ 'data-entity-type' => $entity->getEntityTypeId(),
|
|
|
+ 'data-bundle' => $entity->bundle(),
|
|
|
+ ));
|
|
|
+ }
|
|
|
+ }
|
|
|
+ elseif ($image_link_setting == 'file') {
|
|
|
+ $link_file = TRUE;
|
|
|
+ }
|
|
|
+
|
|
|
+ $image_style_setting = $this->getSetting('image_style');
|
|
|
+
|
|
|
+ // Collect cache tags to be added for each item in the field.
|
|
|
+ $base_cache_tags = [];
|
|
|
+ if (!empty($image_style_setting)) {
|
|
|
+ $image_style = $this->imageStyleStorage->load($image_style_setting);
|
|
|
+ $base_cache_tags = $image_style->getCacheTags();
|
|
|
+ }
|
|
|
+
|
|
|
+ foreach ($files as $delta => $file) {
|
|
|
+ $cache_contexts = [];
|
|
|
+ if (isset($link_file)) {
|
|
|
+ $image_uri = $file->getFileUri();
|
|
|
+ // @todo Wrap in file_url_transform_relative(). This is currently
|
|
|
+ // impossible. As a work-around, we currently add the 'url.site' cache
|
|
|
+ // context to ensure different file URLs are generated for different
|
|
|
+ // sites in a multisite setup, including HTTP and HTTPS versions of the
|
|
|
+ // same site. Fix in https://www.drupal.org/node/2646744.
|
|
|
+ $url = Url::fromUri(file_create_url($image_uri));
|
|
|
+ $cache_contexts[] = 'url.site';
|
|
|
+ }
|
|
|
+ $cache_tags = Cache::mergeTags($base_cache_tags, $file->getCacheTags());
|
|
|
+
|
|
|
+ // Extract field item attributes for the theme function, and unset them
|
|
|
+ // from the $item so that the field template does not re-render them.
|
|
|
+ $item = $file->_referringItem;
|
|
|
+ $item_attributes = $item->_attributes;
|
|
|
+ unset($item->_attributes);
|
|
|
+
|
|
|
+ $elements[$delta] = [
|
|
|
+ '#theme' => 'image_formatter',
|
|
|
+ '#item' => $item,
|
|
|
+ '#item_attributes' => $item_attributes,
|
|
|
+ '#image_style' => $image_style_setting,
|
|
|
+ '#url' => $url,
|
|
|
+ '#cache' => [
|
|
|
+ 'tags' => $cache_tags,
|
|
|
+ 'contexts' => $cache_contexts,
|
|
|
+ ],
|
|
|
+ ];
|
|
|
+ }
|
|
|
+
|
|
|
+ return $elements;
|
|
|
+ }
|
|
|
+
|
|
|
+}
|