View source
<?php
namespace Drupal\views\Plugin\views\argument_validator;
use Drupal\Core\Entity\EntityInterface;
use Drupal\Core\Entity\EntityManagerInterface;
use Drupal\Core\Form\FormStateInterface;
use Drupal\views\Plugin\views\argument\ArgumentPluginBase;
use Symfony\Component\DependencyInjection\ContainerInterface;
class Entity extends ArgumentValidatorPluginBase {
protected $entityManager;
protected $multipleCapable = TRUE;
public function __construct(array $configuration, $plugin_id, $plugin_definition, EntityManagerInterface $entity_manager) {
parent::__construct($configuration, $plugin_id, $plugin_definition);
$this->entityManager = $entity_manager;
}
public static function create(ContainerInterface $container, array $configuration, $plugin_id, $plugin_definition) {
return new static($configuration, $plugin_id, $plugin_definition, $container
->get('entity.manager'));
}
protected function defineOptions() {
$options = parent::defineOptions();
$options['bundles'] = array(
'default' => array(),
);
$options['access'] = array(
'default' => FALSE,
);
$options['operation'] = array(
'default' => 'view',
);
$options['multiple'] = array(
'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->entityManager
->getDefinition($entity_type_id);
if ($entity_type
->hasKey('bundle')) {
$bundle_options = array();
foreach ($this->entityManager
->getBundleInfo($entity_type_id) as $bundle_id => $bundle_info) {
$bundle_options[$bundle_id] = $bundle_info['label'];
}
$form['bundles'] = array(
'#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'] = array(
'#type' => 'checkbox',
'#title' => $this
->t('Validate user has access to the %name', array(
'%name' => $entity_type
->getLabel(),
)),
'#default_value' => $this->options['access'],
);
$form['operation'] = array(
'#type' => 'radios',
'#title' => $this
->t('Access operation to check'),
'#options' => array(
'view' => $this
->t('View'),
'update' => $this
->t('Edit'),
'delete' => $this
->t('Delete'),
),
'#default_value' => $this->options['operation'],
'#states' => array(
'visible' => array(
':input[name="options[validate][options][' . $sanitized_id . '][access]"]' => array(
'checked' => TRUE,
),
),
),
);
if ($this->multipleCapable) {
$form['multiple'] = array(
'#type' => 'radios',
'#title' => $this
->t('Multiple arguments'),
'#options' => array(
0 => $this
->t('Single ID', array(
'%type' => $entity_type
->getLabel(),
)),
1 => $this
->t('One or more IDs separated by , or +', array(
'%type' => $entity_type
->getLabel(),
)),
),
'#default_value' => (string) $this->options['multiple'],
);
}
}
public function submitOptionsForm(&$form, FormStateInterface $form_state, &$options = array()) {
$options['bundles'] = array_filter($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 = array(
$argument,
);
}
else {
return FALSE;
}
$entities = $this->entityManager
->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 (count($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->entityManager
->getDefinition($entity_type_id)
->getBundleEntityType();
if ($this->entityManager
->hasHandler($bundle_entity_type, 'storage')) {
$bundle_entity_storage = $this->entityManager
->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;
}
}