View source
<?php
namespace Drupal\views\Plugin\views\argument_validator;
use Drupal\Core\Entity\EntityInterface;
use Drupal\Core\Entity\EntityTypeBundleInfoInterface;
use Drupal\Core\Entity\EntityTypeManagerInterface;
use Drupal\Core\Form\FormStateInterface;
use Drupal\Core\Plugin\Context\EntityContextDefinition;
use Drupal\views\Plugin\views\argument\ArgumentPluginBase;
use Symfony\Component\DependencyInjection\ContainerInterface;
class Entity extends ArgumentValidatorPluginBase {
protected $entityTypeManager;
protected $entityTypeBundleInfo;
protected $multipleCapable = TRUE;
public function __construct(array $configuration, $plugin_id, $plugin_definition, EntityTypeManagerInterface $entity_type_manager, EntityTypeBundleInfoInterface $entity_type_bundle_info) {
parent::__construct($configuration, $plugin_id, $plugin_definition);
$this->entityTypeManager = $entity_type_manager;
$this->entityTypeBundleInfo = $entity_type_bundle_info;
}
public static function create(ContainerInterface $container, array $configuration, $plugin_id, $plugin_definition) {
return new static($configuration, $plugin_id, $plugin_definition, $container
->get('entity_type.manager'), $container
->get('entity_type.bundle.info'));
}
protected function defineOptions() {
$options = parent::defineOptions();
$options['bundles'] = [
'default' => [],
];
$options['access'] = [
'default' => FALSE,
];
$options['operation'] = [
'default' => 'view',
];
$options['multiple'] = [
'default' => FALSE,
];
return $options;
}
public function buildOptionsForm(&$form, FormStateInterface $form_state) {
parent::buildOptionsForm($form, $form_state);
$entity_type_id = $this->definition['entity_type'];
$sanitized_id = ArgumentPluginBase::encodeValidatorId($this->definition['id']);
$entity_type = $this->entityTypeManager
->getDefinition($entity_type_id);
if ($entity_type
->hasKey('bundle')) {
$bundle_options = [];
foreach ($this->entityTypeBundleInfo
->getBundleInfo($entity_type_id) as $bundle_id => $bundle_info) {
$bundle_options[$bundle_id] = $bundle_info['label'];
}
$form['bundles'] = [
'#title' => $entity_type
->getBundleLabel() ?: $this
->t('Bundles'),
'#default_value' => $this->options['bundles'],
'#type' => 'checkboxes',
'#options' => $bundle_options,
'#description' => $this
->t('If none are selected, all are allowed.'),
];
}
$form['access'] = [
'#type' => 'checkbox',
'#title' => $this
->t('Validate user has access to the %name', [
'%name' => $entity_type
->getLabel(),
]),
'#default_value' => $this->options['access'],
];
$form['operation'] = [
'#type' => 'radios',
'#title' => $this
->t('Access operation to check'),
'#options' => [
'view' => $this
->t('View'),
'update' => $this
->t('Edit'),
'delete' => $this
->t('Delete'),
],
'#default_value' => $this->options['operation'],
'#states' => [
'visible' => [
':input[name="options[validate][options][' . $sanitized_id . '][access]"]' => [
'checked' => TRUE,
],
],
],
];
if ($this->multipleCapable) {
$form['multiple'] = [
'#type' => 'radios',
'#title' => $this
->t('Multiple arguments'),
'#options' => [
0 => $this
->t('Single ID', [
'%type' => $entity_type
->getLabel(),
]),
1 => $this
->t('One or more IDs separated by , or +', [
'%type' => $entity_type
->getLabel(),
]),
],
'#default_value' => (string) $this->options['multiple'],
];
}
}
public function submitOptionsForm(&$form, FormStateInterface $form_state, &$options = []) {
if (!empty($options['bundles'])) {
$options['bundles'] = array_filter($options['bundles']);
}
else {
$options['bundles'] = [];
}
}
public function validateArgument($argument) {
$entity_type = $this->definition['entity_type'];
if ($this->multipleCapable && $this->options['multiple']) {
$ids = array_filter(preg_split('/[,+ ]/', $argument));
}
elseif ($argument) {
$ids = [
$argument,
];
}
else {
return FALSE;
}
$entities = $this->entityTypeManager
->getStorage($entity_type)
->loadMultiple($ids);
foreach ($ids as $id) {
if (!isset($entities[$id])) {
return FALSE;
}
if (!$this
->validateEntity($entities[$id])) {
return FALSE;
}
}
return TRUE;
}
protected function validateEntity(EntityInterface $entity) {
if ($this->options['access'] && !$entity
->access($this->options['operation'])) {
return FALSE;
}
$bundles = $this->options['bundles'];
if (!empty($bundles) && empty($bundles[$entity
->bundle()])) {
return FALSE;
}
return TRUE;
}
public function calculateDependencies() {
$dependencies = parent::calculateDependencies();
$entity_type_id = $this->definition['entity_type'];
$bundle_entity_type = $this->entityTypeManager
->getDefinition($entity_type_id)
->getBundleEntityType();
if ($this->entityTypeManager
->hasHandler($bundle_entity_type, 'storage')) {
$bundle_entity_storage = $this->entityTypeManager
->getStorage($bundle_entity_type);
foreach ($bundle_entity_storage
->loadMultiple(array_keys($this->options['bundles'])) as $bundle_entity) {
$dependencies[$bundle_entity
->getConfigDependencyKey()][] = $bundle_entity
->getConfigDependencyName();
}
}
return $dependencies;
}
public function getContextDefinition() {
return EntityContextDefinition::fromEntityTypeId($this->definition['entity_type'])
->setLabel($this->argument
->adminLabel())
->setRequired(FALSE);
}
}