View source
<?php
namespace Drupal\blazy;
use Drupal\Component\Utility\NestedArray;
use Drupal\Component\Utility\Xss;
use Drupal\Core\Entity\EntityInterface;
use Drupal\Core\Render\Element;
use Symfony\Component\DependencyInjection\ContainerInterface;
class BlazyEntity implements BlazyEntityInterface {
protected $oembed;
protected $blazyManager;
public function __construct(BlazyOEmbedInterface $oembed) {
$this->oembed = $oembed;
$this->blazyManager = $oembed
->blazyManager();
}
public static function create(ContainerInterface $container) {
return new static($container
->get('blazy.oembed'));
}
public function oembed() {
return $this->oembed;
}
public function blazyManager() {
return $this->blazyManager;
}
public function build(array &$data, $entity, $fallback = '') {
if (!$entity instanceof EntityInterface) {
return [];
}
$data['settings'] = empty($data['settings']) ? [] : $data['settings'];
$this->blazyManager
->getCommonSettings($data['settings']);
$this->oembed
->getMediaItem($data, $entity);
$settings =& $data['settings'];
if (!empty($settings['resimage']) && $settings['ratio'] == 'fluid') {
$this->blazyManager
->setResponsiveImageDimensions($settings, FALSE);
}
if (in_array($entity
->getEntityTypeId(), [
'file',
'media',
])) {
if (empty($data['item'])) {
$data['content'][] = $this
->getEntityView($entity, $settings, $fallback);
}
$build = $this->blazyManager
->getBlazy($data);
if (empty($settings['_detached'])) {
$load = $this->blazyManager
->attach($settings);
$build['#attached'] = empty($build['#attached']) ? $load : NestedArray::mergeDeep($build['#attached'], $load);
}
}
else {
$build = $this
->getEntityView($entity, $settings, $fallback);
}
$this->blazyManager
->getModuleHandler()
->alter('blazy_build_entity', $build, $entity, $settings);
return $build;
}
public function getEntityView($entity, array $settings = [], $fallback = '') {
if ($entity instanceof EntityInterface) {
$entity_type_id = $entity
->getEntityTypeId();
$view_mode = $settings['view_mode'] = empty($settings['view_mode']) ? 'default' : $settings['view_mode'];
$langcode = $entity
->language()
->getId();
$fallback = $fallback && is_string($fallback) ? [
'#markup' => '<div class="is-fallback">' . $fallback . '</div>',
] : $fallback;
if ($this->blazyManager
->getEntityTypeManager()
->hasHandler($entity_type_id, 'view_builder')) {
$build = $this->blazyManager
->getEntityTypeManager()
->getViewBuilder($entity_type_id)
->view($entity, $view_mode, $langcode);
if ($entity_type_id == 'file') {
try {
$build = $this
->getFileOrMedia($entity, $settings) ?: $build;
} catch (\Exception $ignore) {
}
}
return $build ?: $fallback;
}
else {
$view_hook = $entity_type_id . '_view';
if (is_callable($view_hook)) {
return $view_hook($entity, $view_mode, $langcode);
}
}
}
return $fallback;
}
public function getFileOrMedia($file, array $settings, $use_file = TRUE) {
list($type, ) = explode('/', $file
->getMimeType(), 2);
if ($type == 'video') {
$settings['media_source'] = 'video_file';
$settings['source_field'] = 'field_media_video_file';
}
if (!empty($settings['source_field']) && isset($settings['media_source']) && ($media = $this->blazyManager
->getEntityTypeManager()
->getStorage('media')
->loadByProperties([
$settings['source_field'] => [
'fid' => $file
->id(),
],
]))) {
if ($media = reset($media)) {
return $use_file ? BlazyMedia::build($media, $settings) : $media;
}
}
return [];
}
public function getFieldValue($entity, $field_name, $langcode) {
if ($entity
->hasField($field_name)) {
if ($entity
->hasTranslation($langcode)) {
return $entity
->getTranslation($langcode)
->get($field_name)
->getValue();
}
return $entity
->get($field_name)
->getValue();
}
return NULL;
}
public function getFieldString($entity, $field_name, $langcode, $clean = TRUE) {
if ($entity
->hasField($field_name)) {
$values = $this
->getFieldValue($entity, $field_name, $langcode);
$string = isset($values[0]['uri']) ? $values[0]['uri'] : (isset($values[0]['value']) ? $values[0]['value'] : '');
if ($string && is_string($string)) {
$string = $clean ? strip_tags($string, '<a><strong><em><span><small>') : Xss::filter($string, BlazyDefault::TAGS);
return trim($string);
}
}
return '';
}
public function getFieldRenderable($entity, $field_name, $view_mode, $multiple = TRUE) {
if ($entity
->hasField($field_name) && !empty($entity->{$field_name}
->view($view_mode)[0])) {
$view = $entity
->get($field_name)
->view($view_mode);
$view['#view_mode'] = '_custom';
$weight = isset($view['#weight']) ? $view['#weight'] : 0;
if ($multiple) {
$items = [];
foreach (Element::children($view) as $key) {
$items[$key] = $entity
->get($field_name)
->view($view_mode)[$key];
}
$items['#weight'] = $weight;
return $items;
}
return $view[0];
}
return [];
}
public function getFieldTextOrLink($entity, $field_name, $settings, $multiple = TRUE) {
if ($entity
->hasField($field_name)) {
$langcode = $settings['langcode'];
if ($text = $this
->getFieldValue($entity, $field_name, $langcode)) {
if (!empty($text[0]['value']) && !isset($text[0]['uri'])) {
$text = $this
->getFieldString($entity, $field_name, $langcode, FALSE);
}
elseif (isset($text[0]['uri']) && !empty($text[0]['title'])) {
$text = $this
->getFieldRenderable($entity, $field_name, $settings['view_mode'], $multiple);
}
return is_string($text) ? [
'#markup' => strip_tags($text, '<a><strong><em><span><small>'),
] : $text;
}
}
return [];
}
}