Newer
Older
Angie Byron
committed
<?php
/**
* @file
* Contains \Drupal\views\Plugin\views\area\Entity.
*/
namespace Drupal\views\Plugin\views\area;
Alex Pott
committed
use Drupal\Core\Entity\EntityManagerInterface;
Dries Buytaert
committed
use Drupal\Core\Form\FormStateInterface;
Angie Byron
committed
use Drupal\views\Plugin\views\display\DisplayPluginBase;
use Drupal\views\ViewExecutable;
Alex Pott
committed
use Symfony\Component\DependencyInjection\ContainerInterface;
Angie Byron
committed
/**
* Provides an area handler which renders an entity in a certain view mode.
*
* @ingroup views_area_handlers
*
* @ViewsArea("entity")
Angie Byron
committed
*/
class Entity extends TokenizeAreaPluginBase {
Angie Byron
committed
/**
* Stores the entity type of the result entities.
*
* @var string
*/
protected $entityType;
Alex Pott
committed
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
/**
* The entity manager.
*
* @var \Drupal\Core\Entity\EntityManagerInterface
*/
protected $entityManager;
/**
* Constructs a new Entity instance.
*
* @param array $configuration
* A configuration array containing information about the plugin instance.
* @param string $plugin_id
* The plugin_id for the plugin instance.
* @param mixed $plugin_definition
* The plugin implementation definition.
* @param \Drupal\Core\Entity\EntityManagerInterface $entity_manager
* The entity manager.
*/
public function __construct(array $configuration, $plugin_id, $plugin_definition, EntityManagerInterface $entity_manager) {
parent::__construct($configuration, $plugin_id, $plugin_definition);
$this->entityManager = $entity_manager;
}
/**
* {@inheritdoc}
*/
public static function create(ContainerInterface $container, array $configuration, $plugin_id, $plugin_definition) {
return new static(
$configuration,
$plugin_id,
$plugin_definition,
$container->get('entity.manager')
);
}
Angie Byron
committed
/**
* Overrides \Drupal\views\Plugin\views\area\AreaPluginBase::init().
*/
public function init(ViewExecutable $view, DisplayPluginBase $display, array &$options = NULL) {
parent::init($view, $display, $options);
$this->entityType = $this->definition['entity_type'];
}
/**
* {@inheritdoc}
Angie Byron
committed
*/
protected function defineOptions() {
$options = parent::defineOptions();
// Per default we enable tokenize, as this is the most common use case for
// this handler.
$options['tokenize']['default'] = TRUE;
Alex Pott
committed
// Contains the config target identifier for the entity.
$options['target'] = ['default' => ''];
$options['view_mode'] = ['default' => 'default'];
$options['bypass_access'] = ['default' => FALSE];
Angie Byron
committed
return $options;
}
/**
* {@inheritdoc}
Angie Byron
committed
*/
Dries Buytaert
committed
public function buildOptionsForm(&$form, FormStateInterface $form_state) {
Angie Byron
committed
parent::buildOptionsForm($form, $form_state);
$form['view_mode'] = array(
'#type' => 'select',
Alex Pott
committed
'#options' => $this->entityManager->getViewModeOptions($this->entityType),
'#title' => $this->t('View mode'),
Angie Byron
committed
'#default_value' => $this->options['view_mode'],
);
Alex Pott
committed
$label = $this->entityManager->getDefinition($this->entityType)->getLabel();
$target = $this->options['target'];
// If the target does not contain tokens, try to load the entity and
// display the entity ID to the admin form user.
// @todo Use a method to check for tokens in
// https://www.drupal.org/node/2396607.
if (strpos($this->options['target'], '{{') === FALSE) {
Alex Pott
committed
// @todo If the entity does not exist, this will will show the config
// target identifier. Decide if this is the correct behavior in
// https://www.drupal.org/node/2415391.
if ($target_entity = $this->entityManager->loadEntityByConfigTarget($this->entityType, $this->options['target'])) {
$target = $target_entity->id();
}
}
$form['target'] = [
'#title' => $this->t('@entity_type_label ID', ['@entity_type_label' => $label]),
Angie Byron
committed
'#type' => 'textfield',
Alex Pott
committed
'#default_value' => $target,
];
$form['bypass_access'] = array(
'#type' => 'checkbox',
'#title' => $this->t('Bypass access checks'),
'#description' => $this->t('If enabled, access permissions for rendering the entity are not checked.'),
'#default_value' => !empty($this->options['bypass_access']),
);
Angie Byron
committed
}
Alex Pott
committed
/**
* {@inheritdoc}
*/
public function submitOptionsForm(&$form, FormStateInterface $form_state) {
parent::submitOptionsForm($form, $form_state);
// Load the referenced entity and store its config target identifier if
// the target does not contains tokens.
// @todo Use a method to check for tokens in
// https://www.drupal.org/node/2396607.
$options = $form_state->getValue('options');
if (strpos($options['target'], '{{') === FALSE) {
Alex Pott
committed
if ($entity = $this->entityManager->getStorage($this->entityType)->load($options['target'])) {
$options['target'] = $entity->getConfigTarget();
}
$form_state->setValue('options', $options);
}
}
Angie Byron
committed
/**
* {@inheritdoc}
Angie Byron
committed
*/
Alex Pott
committed
public function render($empty = FALSE) {
Angie Byron
committed
if (!$empty || !empty($this->options['empty'])) {
Alex Pott
committed
// @todo Use a method to check for tokens in
// https://www.drupal.org/node/2396607.
if (strpos($this->options['target'], '{{') !== FALSE) {
// We cast as we need the integer/string value provided by the
// ::tokenizeValue() call.
$target_id = (string) $this->tokenizeValue($this->options['target']);
Alex Pott
committed
if ($entity = $this->entityManager->getStorage($this->entityType)->load($target_id)) {
$target_entity = $entity;
}
}
else {
if ($entity = $this->entityManager->loadEntityByConfigTarget($this->entityType, $this->options['target'])) {
$target_entity = $entity;
}
}
if (isset($target_entity) && (!empty($this->options['bypass_access']) || $target_entity->access('view'))) {
$view_builder = $this->entityManager->getViewBuilder($this->entityType);
return $view_builder->view($target_entity, $this->options['view_mode']);
Angie Byron
committed
}
}
Alex Pott
committed
return [];
Angie Byron
committed
}
Alex Pott
committed
/**
* {@inheritdoc}
*/
public function calculateDependencies() {
$dependencies = parent::calculateDependencies();
// Ensure that we don't add dependencies for placeholders.
// @todo Use a method to check for tokens in
// https://www.drupal.org/node/2396607.
if (strpos($this->options['target'], '{{') === FALSE) {
Alex Pott
committed
if ($entity = $this->entityManager->loadEntityByConfigTarget($this->entityType, $this->options['target'])) {
$dependencies[$this->entityManager->getDefinition($this->entityType)->getConfigDependencyKey()][] = $entity->getConfigDependencyName();
}
}
return $dependencies;
}