public function ViewfieldFormatterDefault::viewElements in Viewfield 8.3
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 FormatterInterface::viewElements
File
- src/
Plugin/ Field/ FieldFormatter/ ViewfieldFormatterDefault.php, line 112
Class
- ViewfieldFormatterDefault
- Viewfield Default Formatter plugin definition.
Namespace
Drupal\viewfield\Plugin\Field\FieldFormatterCode
public function viewElements(FieldItemListInterface $items, $langcode) {
$entity = $items
->getEntity();
if ($this
->getFieldSetting('force_default')) {
$values = $this->fieldDefinition
->getDefaultValue($entity);
}
else {
$values = [];
foreach ($items as $delta => $item) {
$values[$delta] = $item
->getValue();
}
}
$elements = [];
$cacheability = new CacheableMetadata();
$always_build_output = $this
->getSetting('always_build_output');
$view_title = $this
->getSetting('view_title');
$empty_view_title = $this
->getSetting('empty_view_title');
foreach ($values as $delta => $value) {
if (!empty($value['target_id']) && !empty($value['display_id'])) {
$target_id = $value['target_id'];
$display_id = $value['display_id'];
$items_to_display = $value['items_to_display'];
if (!empty($value['arguments'])) {
$arguments = $this
->processArguments($value['arguments'], $entity);
}
else {
$arguments = [];
}
// @see views_embed_view()
// @see views_get_view_result()
$view = Views::getView($target_id);
if (!$view || !$view
->access($display_id)) {
continue;
}
// Set arguments if they exist
if (!empty($arguments)) {
$view
->setArguments($arguments);
}
$view
->setDisplay($display_id);
// Override items to display if set.
if (!empty($items_to_display)) {
$view
->setItemsPerPage($items_to_display);
}
$view
->preExecute();
$view
->execute();
// Disable pager, if items_to_display was set.
if (!empty($items_to_display)) {
$view->pager = new \Drupal\views\Plugin\views\pager\None([], '', []);
$view->pager
->init($view, $view->display_handler);
$view->pager
->setItemsPerPage($items_to_display);
}
$rendered_view = $view
->buildRenderable($display_id, $arguments);
// Get cache metadata from view and merge.
$view_cacheability = CacheableMetadata::createFromRenderArray($view->element);
$cacheability = $cacheability
->merge($view_cacheability);
if (!empty($view->result) || $always_build_output) {
$elements[$delta] = [
'#theme' => 'viewfield_item',
'#content' => $rendered_view,
'#title' => $view
->getTitle(),
'#label_display' => empty($view->result) ? $empty_view_title : $view_title,
'#delta' => $delta,
'#field_name' => $this->fieldDefinition
->getName(),
'#view_id' => $target_id,
'#display_id' => $display_id,
];
// Add arguments to view cache keys to allow multiple viewfields with
// same view but different arguments per page.
$cache_keys = array_merge($rendered_view['#cache']['keys'], $arguments);
$elements[$delta]['#content']['#cache']['keys'] = $cache_keys;
}
}
}
// Apply merged cache metadata to $elements.
$cacheability
->applyTo($elements);
return $elements;
}