public function OrbitMediaFormatter::viewElements in ZURB Orbit 8
Builds a renderable array for a field value.
Parameters
\Drupal\Core\Field\FieldItemListInterface $items: The field values to be rendered.
string $langcode: The language that should be used to render the field.
Return value
array A renderable array for $items, as an array of child elements keyed by consecutive numeric indexes starting from 0.
Overrides OrbitFormatter::viewElements
File
- src/
Plugin/ Field/ FieldFormatter/ OrbitMediaFormatter.php, line 104
Class
- OrbitMediaFormatter
- Plugin implementation of the 'Orbit' formatter.
Namespace
Drupal\field_orbit\Plugin\Field\FieldFormatterCode
public function viewElements(FieldItemListInterface $items, $langcode) {
$elements = [];
$images = [];
$media_items = $this
->getEntitiesToView($items, $langcode);
// Early opt-out if the field is empty.
if (empty($media_items)) {
return $elements;
}
// Initialize the list definition type to mock image field values.
$list_definition = ListDataDefinition::create('field_item:image');
/** @var \Drupal\Core\Field\FieldItemListInterface $items_list */
$items_list = $this->typedDataManager
->create($list_definition);
foreach ($media_items as $key => $item) {
// Currently only image media bundles are supported.
if ($item
->get('field_media_image')
->isEmpty()) {
continue;
}
$image_item = $item
->get('field_media_image')
->first();
// Add the file entity to the items list.
$items_list
->appendItem($image_item
->getValue());
// Store other values used by the template.
$files[$key] = $image_item->entity;
$images[$key] = [
'#theme' => 'image_formatter',
'#item' => $image_item,
'#item_attributes' => [],
'#image_style' => $this
->getSetting('image_style'),
'#url' => Url::fromUri(file_create_url($image_item->entity
->get('uri')->value)),
];
}
static $orbit_count;
$orbit_count = is_int($orbit_count) ? $orbit_count + 1 : 1;
$entity = [];
$item_settings = [];
$links = [
'image_link' => 'path',
'caption_link' => 'caption_path',
];
// Loop through required links (because image and
// caption can have different links).
foreach ($items_list as $delta => $item) {
// Set Image caption.
if ($this
->getSetting('caption') != '') {
$caption_settings = $this
->getSetting('caption');
if ($caption_settings == 'title') {
$item_settings[$delta]['caption'] = $item
->getValue()['title'];
}
elseif ($caption_settings == 'alt') {
$item_settings[$delta]['caption'] = $item
->getValue()['alt'];
}
$item
->set('caption', $item_settings[$delta]['caption']);
}
// Set Image and Caption Link.
foreach ($links as $setting => $path) {
if ($this
->getSetting($setting) != '') {
switch ($this
->getSetting($setting)) {
case 'content':
$entity = $items[$delta]
->getEntity();
if (!$entity
->isNew()) {
$uri = $entity
->urlInfo();
$uri = !empty($uri) ? $uri : '';
$item
->set($path, $uri);
$images[$delta]['#url'] = $uri;
}
break;
case 'file':
foreach ($files as $file_delta => $file) {
$image_uri = $file
->getFileUri();
$uri = Url::fromUri(file_create_url($image_uri));
$uri = !empty($uri) ? $uri : '';
$items_list[$file_delta]
->set($path, $uri);
}
break;
}
}
}
}
$defaults = $this
->defaultSettings();
if (count($items_list)) {
// Only include non-default values to minimize html output.
$options = [];
foreach ($defaults as $key => $setting) {
// Don't pass these to orbit.
if ($key == 'caption_link' || $key == 'caption' || $key == 'image_style') {
continue;
}
if ($this
->getSetting($key) != $setting) {
$options[$key] = $this
->getSetting($key);
}
}
$elements[] = [
'#theme' => 'field_orbit',
'#items' => $items_list,
'#options' => $options,
'#entity' => $entity,
'#image' => $images,
'#orbit_id' => $orbit_count,
];
}
return $elements;
}