View source
<?php
namespace Drupal\ctools\Plugin\Condition;
use Drupal\Core\Condition\ConditionPluginBase;
use Drupal\Core\Entity\EntityTypeBundleInfoInterface;
use Drupal\Core\Entity\EntityTypeManagerInterface;
use Drupal\Core\Entity\ContentEntityInterface;
use Drupal\Core\Form\FormStateInterface;
use Drupal\Core\Plugin\ContainerFactoryPluginInterface;
use Drupal\ctools\ConstraintConditionInterface;
use Symfony\Component\DependencyInjection\ContainerInterface;
class EntityBundle extends ConditionPluginBase implements ConstraintConditionInterface, ContainerFactoryPluginInterface {
protected $entityTypeBundleInfo;
protected $bundleOf;
public function __construct(EntityTypeManagerInterface $entity_type_manager, EntityTypeBundleInfoInterface $entity_type_bundle_info, array $configuration, $plugin_id, $plugin_definition) {
parent::__construct($configuration, $plugin_id, $plugin_definition);
$this->entityTypeBundleInfo = $entity_type_bundle_info;
$this->bundleOf = $entity_type_manager
->getDefinition($this
->getDerivativeId());
}
public static function create(ContainerInterface $container, array $configuration, $plugin_id, $plugin_definition) {
return new static($container
->get('entity_type.manager'), $container
->get('entity_type.bundle.info'), $configuration, $plugin_id, $plugin_definition);
}
public function buildConfigurationForm(array $form, FormStateInterface $form_state) {
$options = [];
$bundles = $this->entityTypeBundleInfo
->getBundleInfo($this->bundleOf
->id());
foreach ($bundles as $id => $info) {
$options[$id] = $info['label'];
}
$form['bundles'] = [
'#title' => $this->pluginDefinition['label'],
'#type' => 'checkboxes',
'#options' => $options,
'#default_value' => $this->configuration['bundles'],
];
return parent::buildConfigurationForm($form, $form_state);
}
public function submitConfigurationForm(array &$form, FormStateInterface $form_state) {
$this->configuration['bundles'] = array_filter($form_state
->getValue('bundles'));
parent::submitConfigurationForm($form, $form_state);
}
public function evaluate() {
if (empty($this->configuration['bundles']) && !$this
->isNegated()) {
return TRUE;
}
$entity = $this
->getContextValue($this->bundleOf
->id());
if (!$entity instanceof ContentEntityInterface) {
return TRUE;
}
return !empty($this->configuration['bundles'][$entity
->bundle()]);
}
public function summary() {
if (count($this->configuration['bundles']) > 1) {
$bundles = $this->configuration['bundles'];
$last = array_pop($bundles);
$bundles = implode(', ', $bundles);
return $this
->t('@bundle_type is @bundles or @last', [
'@bundle_type' => $this->bundleOf
->getBundleLabel(),
'@bundles' => $bundles,
'@last' => $last,
]);
}
$bundle = reset($this->configuration['bundles']);
return $this
->t('@bundle_type is @bundle', [
'@bundle_type' => $this->bundleOf
->getBundleLabel(),
'@bundle' => $bundle,
]);
}
public function defaultConfiguration() {
return [
'bundles' => [],
] + parent::defaultConfiguration();
}
public function applyConstraints(array $contexts = []) {
$this
->removeConstraints($contexts);
$bundle = array_values($this->configuration['bundles']);
foreach ($this
->getContextMapping() as $definition_id => $context_id) {
$contexts[$context_id]
->getContextDefinition()
->addConstraint('Bundle', [
'value' => $bundle,
]);
}
}
public function removeConstraints(array $contexts = []) {
foreach ($this
->getContextMapping() as $definition_id => $context_id) {
$constraints = $contexts[$context_id]
->getContextDefinition()
->getConstraints();
unset($constraints['Bundle']);
$contexts[$context_id]
->getContextDefinition()
->setConstraints($constraints);
}
}
}