View source
<?php
namespace Drupal\content_moderation\Plugin\views\filter;
use Drupal\content_moderation\Plugin\views\ModerationStateJoinViewsHandlerTrait;
use Drupal\Core\Cache\Cache;
use Drupal\Core\Entity\EntityStorageInterface;
use Drupal\Core\Entity\EntityTypeBundleInfoInterface;
use Drupal\Core\Entity\EntityTypeManagerInterface;
use Drupal\views\Plugin\DependentWithRemovalPluginInterface;
use Drupal\views\Plugin\views\filter\InOperator;
use Drupal\views\Views;
use Symfony\Component\DependencyInjection\ContainerInterface;
class ModerationStateFilter extends InOperator implements DependentWithRemovalPluginInterface {
use ModerationStateJoinViewsHandlerTrait;
protected $valueFormType = 'select';
protected $entityTypeManager;
protected $bundleInfo;
protected $workflowStorage;
public function __construct(array $configuration, $plugin_id, $plugin_definition, EntityTypeManagerInterface $entity_type_manager, EntityTypeBundleInfoInterface $bundle_info, EntityStorageInterface $workflow_storage) {
parent::__construct($configuration, $plugin_id, $plugin_definition);
$this->entityTypeManager = $entity_type_manager;
$this->bundleInfo = $bundle_info;
$this->workflowStorage = $workflow_storage;
}
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'), $container
->get('entity_type.manager')
->getStorage('workflow'));
}
public function getCacheTags() {
return Cache::mergeTags(parent::getCacheTags(), $this->entityTypeManager
->getDefinition('workflow')
->getListCacheTags());
}
public function getCacheContexts() {
return Cache::mergeContexts(parent::getCacheContexts(), $this->entityTypeManager
->getDefinition('workflow')
->getListCacheContexts());
}
public function getValueOptions() {
if (isset($this->valueOptions)) {
return $this->valueOptions;
}
$this->valueOptions = [];
foreach ($this->workflowStorage
->loadByProperties([
'type' => 'content_moderation',
]) as $workflow) {
$workflow_type = $workflow
->getTypePlugin();
if (in_array($this
->getEntityType(), $workflow_type
->getEntityTypes(), TRUE)) {
foreach ($workflow_type
->getStates() as $state_id => $state) {
$this->valueOptions[$workflow
->label()][implode('-', [
$workflow
->id(),
$state_id,
])] = $state
->label();
}
}
}
return $this->valueOptions;
}
protected function opSimple() {
if (empty($this->value)) {
return;
}
$this
->ensureMyTable();
$entity_type = $this->entityTypeManager
->getDefinition($this
->getEntityType());
$bundle_condition = NULL;
if ($entity_type
->hasKey('bundle')) {
$workflow_ids = $this
->getWorkflowIds();
$moderated_bundles = [];
foreach ($this->bundleInfo
->getBundleInfo($this
->getEntityType()) as $bundle_id => $bundle) {
if (isset($bundle['workflow']) && in_array($bundle['workflow'], $workflow_ids, TRUE)) {
$moderated_bundles[] = $bundle_id;
}
}
if ($moderated_bundles) {
$entity_base_table_alias = $this->relationship ?: $this->table;
$entity_base_table = $entity_type
->getBaseTable();
$entity_revision_base_table = $entity_type
->isTranslatable() ? $entity_type
->getRevisionDataTable() : $entity_type
->getRevisionTable();
if ($this->table === $entity_revision_base_table) {
$configuration = [
'table' => $entity_base_table,
'field' => $entity_type
->getKey('id'),
'left_table' => $entity_revision_base_table,
'left_field' => $entity_type
->getKey('id'),
'type' => 'INNER',
];
$join = Views::pluginManager('join')
->createInstance('standard', $configuration);
$entity_base_table_alias = $this->query
->addRelationship($entity_base_table, $join, $entity_revision_base_table);
}
$bundle_condition = $this->view->query
->getConnection()
->condition('AND');
$bundle_condition
->condition("{$entity_base_table_alias}.{$entity_type->getKey('bundle')}", $moderated_bundles, 'IN');
}
else {
$this->query
->addWhereExpression($this->options['group'], '1 = 0');
return;
}
}
if ($this->operator === 'in') {
$operator = "=";
}
else {
$operator = "<>";
}
$field = $this->view->query
->getConnection()
->condition('OR');
foreach ((array) $this->value as $value) {
[
$workflow_id,
$state_id,
] = explode('-', $value, 2);
$and = $this->view->query
->getConnection()
->condition('AND');
$and
->condition("{$this->tableAlias}.workflow", $workflow_id, '=')
->condition("{$this->tableAlias}.{$this->realField}", $state_id, $operator);
$field
->condition($and);
}
if ($bundle_condition) {
$bundle_condition
->condition($field);
$this->query
->addWhere($this->options['group'], $bundle_condition);
}
else {
$this->query
->addWhere($this->options['group'], $field);
}
}
public function calculateDependencies() {
$dependencies = parent::calculateDependencies();
if ($workflow_ids = $this
->getWorkflowIds()) {
foreach ($this->workflowStorage
->loadMultiple($workflow_ids) as $workflow) {
$dependencies[$workflow
->getConfigDependencyKey()][] = $workflow
->getConfigDependencyName();
}
}
return $dependencies;
}
public function onDependencyRemoval(array $dependencies) {
$remove = FALSE;
$current_dependencies = $this
->calculateDependencies();
foreach ($current_dependencies as $group => $dependency_list) {
foreach ($dependency_list as $config_key) {
if (isset($dependencies[$group]) && array_key_exists($config_key, $dependencies[$group])) {
$remove = TRUE;
break 2;
}
}
}
return $remove;
}
protected function getWorkflowIds() {
$workflow_ids = [];
foreach ((array) $this->value as $value) {
[
$workflow_id,
] = explode('-', $value, 2);
$workflow_ids[] = $workflow_id;
}
return array_unique($workflow_ids);
}
}