View source
<?php
namespace Drupal\blazy;
use Drupal\Component\Utility\NestedArray;
use Drupal\media\Entity\Media;
use Drupal\image\Plugin\Field\FieldType\ImageItem;
class BlazyMedia implements BlazyMediaInterface {
public static function build($media, array $settings = []) {
if (!empty($settings['input_url'])) {
try {
\Drupal::httpClient()
->get($settings['input_url'], [
'timeout' => 3,
]);
} catch (\Exception $e) {
return FALSE;
}
}
$settings['type'] = 'rich';
$options = $settings['media_source'] == 'video_file' ? [
'type' => 'file_video',
] : $settings['view_mode'];
$build = $media
->get($settings['source_field'])
->view($options);
$build['#settings'] = $settings;
return isset($build[0]) ? self::wrap($build) : $build;
}
public static function wrap(array $field = []) {
$item = $field[0];
$settings = $field['#settings'];
$iframe = isset($item['#tag']) && $item['#tag'] == 'iframe';
$attributes = [];
if (isset($item['#attributes'])) {
$attributes =& $item['#attributes'];
}
foreach ([
'width',
'height',
] as $key) {
if (!empty($settings[$key])) {
$attributes[$key] = $settings[$key];
}
}
if ($iframe && !empty($attributes['src'])) {
$settings['embed_url'] = $attributes['src'];
$attributes = NestedArray::mergeDeep($attributes, Blazy::iframeAttributes($settings));
}
elseif (isset($item['#files'], $item['#files'][0]['file'])) {
self::videoItem($item, $settings);
}
foreach ([
'attached',
'cache',
'third_party_settings',
] as $key) {
if (!empty($field["#{$key}"])) {
$item["#{$key}"] = isset($item["#{$key}"]) ? NestedArray::mergeDeep($field["#{$key}"], $item["#{$key}"]) : $field["#{$key}"];
}
}
$item['#settings'] = new BlazySettings(array_filter($settings));
return $item;
}
public static function mediaItem(array &$data, $media) {
$item = NULL;
$settings =& $data['settings'];
$settings['bundle'] = $media
->bundle();
$settings['source_field'] = $media
->getSource()
->getConfiguration()['source_field'];
$settings['media_url'] = $media
->toUrl()
->toString();
$settings['media_id'] = $media
->id();
$settings['media_source'] = $media
->getSource()
->getPluginId();
$settings['view_mode'] = empty($settings['view_mode']) ? 'default' : $settings['view_mode'];
if (!empty($settings['image'])) {
$item = $media
->hasField($settings['image']) ? $media
->get($settings['image'])
->first() : NULL;
$settings['_hires'] = !empty($item);
}
if (!$item && $media
->hasField('thumbnail')) {
$item = $media
->get($settings['media_source'] == 'image' ? $settings['source_field'] : 'thumbnail')
->first();
}
if ($item) {
$settings['file_tags'] = [
'file:' . $item->target_id,
];
$settings['uri'] = Blazy::uri($item);
$data['item'] = $item;
}
}
public static function videoItem(array &$item, array $settings) {
foreach ($item['#files'] as &$file) {
$file['blazy'] = new BlazySettings($settings);
}
$item['#attributes']
->setAttribute('data-b-lazy', TRUE);
if (!empty($settings['is_preview'])) {
$item['#attributes']
->setAttribute('data-b-preview', TRUE);
}
}
public static function fakeImageItem(array &$data, $entity, $image) {
list($type, ) = explode('/', $entity
->getMimeType(), 2);
if ($type == 'image' && $image
->isValid()) {
$settings = [
'uri' => $entity
->getFileUri(),
'target_id' => $entity
->id(),
'width' => $image
->getWidth(),
'height' => $image
->getHeight(),
'alt' => $entity
->getFilename(),
'title' => $entity
->getFilename(),
'type' => 'image',
];
$item = Blazy::image($settings);
$item->entity = $entity;
$data['item'] = $item;
$data['settings'] = empty($data['settings']) ? $settings : array_merge($data['settings'], $settings);
unset($item);
}
}
public static function imageItem(array &$data, $entity) {
$settings =& $data['settings'];
$stage = $settings['image'];
if (isset($entity->{$stage}) && ($file = $entity
->get($stage))) {
$value = $file
->getValue();
if (isset($value[0]) && !empty($value[0]['target_id'])) {
if (method_exists($file, 'referencedEntities') && isset($file
->referencedEntities()[0])) {
$reference = $file
->referencedEntities()[0];
$image = $file
->first();
if ($reference instanceof Media) {
self::mediaItem($data, $reference);
}
elseif ($image instanceof ImageItem) {
$data['item'] = $image;
$settings['file_tags'] = $file
->referencedEntities()[0]
->getCacheTags();
$settings['uri'] = Blazy::uri($data['item']);
}
}
}
}
}
}