View source
<?php
namespace Drupal\blazy\Dejavu;
use Drupal\Component\Utility\Xss;
use Drupal\blazy\Blazy;
trait BlazyStylePluginTrait {
public function getImageRenderable(array &$settings, $row, $index) {
$image = $this
->isImageRenderable($row, $index, $settings['image']);
if (empty($image['raw'])) {
return $image;
}
if ($item = $this
->getImageItem($image)) {
if (empty($settings['image_style'])) {
$image_style = isset($image['rendered']['#image_style']) ? $image['rendered']['#image_style'] : '';
$settings['image_style'] = empty($settings['image_style']) ? $image_style : $settings['image_style'];
}
$theme = isset($image['rendered']['#theme']) ? $image['rendered']['#theme'] : '';
if (in_array($theme, [
'blazy',
'image_formatter',
])) {
$settings['uri'] = Blazy::uri($item);
$settings['cache_tags'] = isset($image['rendered']['#cache']['tags']) ? $image['rendered']['#cache']['tags'] : [];
if ($theme == 'blazy') {
$item_settings = array_filter($image['rendered']['#build']['settings']);
$settings = array_merge($item_settings, array_filter($settings));
}
elseif ($theme == 'image_formatter') {
$settings['content_url'] = isset($image['rendered']['#url']) ? $image['rendered']['#url'] : '';
$settings['ratio'] = empty($settings['_noratio']) ? 'fluid' : '';
if (empty($settings['media_switch']) && !empty($settings['content_url'])) {
$settings['media_switch'] = 'content';
}
}
$build = [
'item' => $item,
'settings' => $settings,
];
$image['rendered'] = $this->blazyManager
->getBlazy($build);
}
}
return $image;
}
public function isImageRenderable($row, $index, $field_image = '') {
if (!empty($field_image) && ($image = $this
->getFieldRenderable($row, $index, $field_image))) {
if ($this
->getImageItem($image)) {
return $image;
}
if (isset($image['rendered'])) {
return $image;
}
}
return [];
}
public function getImageItem($image) {
$item = [];
if (isset($image['raw'])) {
$item = empty($image['rendered']['#item']) ? [] : $image['rendered']['#item'];
if (isset($image['rendered']['#build'])) {
$item = $image['rendered']['#build']['item'];
}
}
if (!is_object($item)) {
return [];
}
return $item;
}
public function getCaption($index, $settings = []) {
$items = [];
$keys = array_keys($this->view->field);
if (!empty($settings['caption'])) {
$excludes = array_diff_assoc(array_combine($keys, $keys), $settings['caption']);
foreach ($excludes as $field) {
$this->view->field[$field]->options['exclude'] = TRUE;
}
$items['data'] = $this->view->rowPlugin
->render($this->view->result[$index]);
}
$items['link'] = empty($settings['link']) ? [] : $this
->getFieldRendered($index, $settings['link']);
$items['title'] = empty($settings['title']) ? [] : $this
->getFieldRendered($index, $settings['title'], TRUE);
$items['overlay'] = empty($settings['overlay']) ? [] : $this
->getFieldRendered($index, $settings['overlay']);
return $items;
}
public function getLayout(array &$settings, $index) {
if (strpos($settings['layout'], 'field_') !== FALSE) {
$settings['layout'] = strip_tags($this
->getField($index, $settings['layout']));
}
}
public function getFieldRendered($index, $field_name = '', $restricted = FALSE) {
if (!empty($field_name) && ($output = $this
->getField($index, $field_name))) {
return is_array($output) ? $output : [
'#markup' => $restricted ? Xss::filterAdmin($output) : $output,
];
}
return [];
}
}