class ModerationStateFilter in Drupal 10
Same name and namespace in other branches
- 8 core/modules/content_moderation/src/Plugin/views/filter/ModerationStateFilter.php \Drupal\content_moderation\Plugin\views\filter\ModerationStateFilter
- 9 core/modules/content_moderation/src/Plugin/views/filter/ModerationStateFilter.php \Drupal\content_moderation\Plugin\views\filter\ModerationStateFilter
Provides a filter for the moderation state of an entity.
Plugin annotation
@ViewsFilter("moderation_state_filter");
Hierarchy
- class \Drupal\views\Plugin\views\filter\FilterPluginBase extends \Drupal\views\Plugin\views\HandlerBase implements CacheableDependencyInterface
- class \Drupal\views\Plugin\views\filter\InOperator
- class \Drupal\content_moderation\Plugin\views\filter\ModerationStateFilter implements DependentWithRemovalPluginInterface uses ModerationStateJoinViewsHandlerTrait
- class \Drupal\views\Plugin\views\filter\InOperator
Expanded class hierarchy of ModerationStateFilter
Related topics
File
- core/
modules/ content_moderation/ src/ Plugin/ views/ filter/ ModerationStateFilter.php, line 22
Namespace
Drupal\content_moderation\Plugin\views\filterView source
class ModerationStateFilter extends InOperator implements DependentWithRemovalPluginInterface {
use ModerationStateJoinViewsHandlerTrait;
/**
* {@inheritdoc}
*/
protected $valueFormType = 'select';
/**
* The entity type manager.
*
* @var \Drupal\Core\Entity\EntityTypeManagerInterface
*/
protected $entityTypeManager;
/**
* The bundle information service.
*
* @var \Drupal\Core\Entity\EntityTypeBundleInfoInterface
*/
protected $bundleInfo;
/**
* The storage handler of the workflow entity type.
*
* @var \Drupal\Core\Entity\EntityStorageInterface
*/
protected $workflowStorage;
/**
* Creates an instance of ModerationStateFilter.
*/
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;
}
/**
* {@inheritdoc}
*/
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'));
}
/**
* {@inheritdoc}
*/
public function getCacheTags() {
return Cache::mergeTags(parent::getCacheTags(), $this->entityTypeManager
->getDefinition('workflow')
->getListCacheTags());
}
/**
* {@inheritdoc}
*/
public function getCacheContexts() {
return Cache::mergeContexts(parent::getCacheContexts(), $this->entityTypeManager
->getDefinition('workflow')
->getListCacheContexts());
}
/**
* {@inheritdoc}
*/
public function getValueOptions() {
if (isset($this->valueOptions)) {
return $this->valueOptions;
}
$this->valueOptions = [];
// Find all workflows which are moderating entity types of the same type the
// view is displaying.
foreach ($this->workflowStorage
->loadByProperties([
'type' => 'content_moderation',
]) as $workflow) {
/** @var \Drupal\content_moderation\Plugin\WorkflowType\ContentModerationInterface $workflow_type */
$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;
}
/**
* {@inheritdoc}
*/
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')) {
// Get a list of bundles that are being moderated by the workflows
// configured in this filter.
$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 we have a list of moderated bundles, restrict the query to show only
// entities in those bundles.
if ($moderated_bundles) {
$entity_base_table_alias = $this->relationship ?: $this->table;
// The bundle field of an entity type is not revisionable so we need to
// join the base 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 = "<>";
}
// The values are strings composed from the workflow ID and the state ID, so
// we need to create a complex WHERE condition.
$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) {
// The query must match the bundle AND the workflow/state conditions.
$bundle_condition
->condition($field);
$this->query
->addWhere($this->options['group'], $bundle_condition);
}
else {
$this->query
->addWhere($this->options['group'], $field);
}
}
/**
* {@inheritdoc}
*/
public function calculateDependencies() {
$dependencies = parent::calculateDependencies();
if ($workflow_ids = $this
->getWorkflowIds()) {
/** @var \Drupal\workflows\WorkflowInterface $workflow */
foreach ($this->workflowStorage
->loadMultiple($workflow_ids) as $workflow) {
$dependencies[$workflow
->getConfigDependencyKey()][] = $workflow
->getConfigDependencyName();
}
}
return $dependencies;
}
/**
* {@inheritdoc}
*/
public function onDependencyRemoval(array $dependencies) {
// See if this handler is responsible for any of the dependencies being
// removed. If this is the case, indicate that this handler needs to be
// removed from the View.
$remove = FALSE;
// Get all the current dependencies for this handler.
$current_dependencies = $this
->calculateDependencies();
foreach ($current_dependencies as $group => $dependency_list) {
// Check if any of the handler dependencies match the dependencies being
// removed.
foreach ($dependency_list as $config_key) {
if (isset($dependencies[$group]) && array_key_exists($config_key, $dependencies[$group])) {
// This handlers dependency matches a dependency being removed,
// indicate that this handler needs to be removed.
$remove = TRUE;
break 2;
}
}
}
return $remove;
}
/**
* Gets the list of Workflow IDs configured for this filter.
*
* @return array
* And array of workflow IDs.
*/
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);
}
}
Members
Name | Modifiers | Type | Description | Overrides |
---|---|---|---|---|
FilterPluginBase:: |
protected | property | Disable the possibility to force a single value. | 4 |
FilterPluginBase:: |
public | property | Disable the possibility to allow an exposed input to be optional. | |
FilterPluginBase:: |
public | property | Contains the information of the selected item in a grouped filter. | |
FilterPluginBase:: |
public | property | Disable the possibility to use operators. | 1 |
FilterPluginBase:: |
public | property | Contains the operator which is used on the query. | |
FilterPluginBase:: |
public | property | Contains the actual value of the field,either configured in the views ui or entered in the exposed filters. | |
FilterPluginBase:: |
public | function | Add a new group to the exposed filter groups. | |
FilterPluginBase:: |
protected static | function | Filter by no empty values, though allow the use of (string) "0". | |
FilterPluginBase:: |
protected | function | Build the form to let users create the group of exposed filters. | |
FilterPluginBase:: |
public | function | Render our chunk of the exposed filter form when selecting. | |
FilterPluginBase:: |
public | function | Displays the Build Group form. | |
FilterPluginBase:: |
protected | function | Provide default options for exposed filters. | |
FilterPluginBase:: |
protected | function | Save new group items, re-enumerates and remove groups marked to delete. | |
FilterPluginBase:: |
protected | function | Validate the build group options form. | |
FilterPluginBase:: |
public | function | Provide the basic form which calls through to subforms. | 2 |
FilterPluginBase:: |
protected | function | Builds wrapper for value and operator forms. | |
FilterPluginBase:: |
protected | function | Determine if a filter can be converted into a group. | |
FilterPluginBase:: |
public | function | Determine if a filter can be exposed. | 5 |
FilterPluginBase:: |
public | function | Can this filter be used in OR groups? | 1 |
FilterPluginBase:: |
public | function | Transform the input from a grouped filter into a standard filter. | |
FilterPluginBase:: |
public | function | Tell the renderer about our exposed form. This only needs to be overridden for particularly complex forms. And maybe not even then. | |
FilterPluginBase:: |
protected | function | Make some translations to a form item to make it more suitable to exposing. | |
FilterPluginBase:: |
public | function |
The maximum age for which this object may be cached. Overrides CacheableDependencyInterface:: |
|
FilterPluginBase:: |
public | function | Build a form containing a group of operator | values to apply as a single filter. | |
FilterPluginBase:: |
public | function | Returns the options available for a grouped filter that users checkboxes as widget, and therefore has to be applied several times, one per item selected. | |
FilterPluginBase:: |
protected | function | Determines if the given grouped filter entry has a valid value. | 1 |
FilterPluginBase:: |
public | function | Returns TRUE if the exposed filter works like a grouped filter. | |
FilterPluginBase:: |
public | function | Returns TRUE if users can select multiple groups items of a grouped exposed filter. | |
FilterPluginBase:: |
protected | function | Options form subform for setting the operator. | 5 |
FilterPluginBase:: |
public | function | Perform any necessary changes to the form values prior to storage. | |
FilterPluginBase:: |
protected | function | Validate the operator form. | |
FilterPluginBase:: |
protected | function | Sanitizes the HTML select element's options. | |
FilterPluginBase:: |
protected | function | Shortcut to display the build_group/hide button. | |
FilterPluginBase:: |
public | function | Shortcut to display the exposed options form. | |
FilterPluginBase:: |
public | function | Shortcut to display the expose/hide button. | |
FilterPluginBase:: |
public | function | Shortcut to display the operator form. | |
FilterPluginBase:: |
protected | function | Shortcut to display the value form. | |
FilterPluginBase:: |
public | function | ||
FilterPluginBase:: |
public | function | If set to remember exposed input in the session, store it there. | |
FilterPluginBase:: |
public | function | Simple submit handler. | |
FilterPluginBase:: |
public static | function | ||
FilterPluginBase:: |
public | function | Validate the options form. | |
FilterPluginBase:: |
protected | function | Validates a filter identifier. | |
FilterPluginBase:: |
public | function | Simple validate handler. | 1 |
FilterPluginBase:: |
protected | function | Validate the options form. | 2 |
InOperator:: |
protected | property | Stores all operations which are available on the form. | |
InOperator:: |
protected | property | The filter title. | |
InOperator:: |
public | function |
Determines if the input from a filter should change the generated query. Overrides FilterPluginBase:: |
2 |
InOperator:: |
public | function |
Display the filter on the administrative summary. Overrides FilterPluginBase:: |
2 |
InOperator:: |
public | function |
Options form subform for exposed filter options. Overrides FilterPluginBase:: |
1 |
InOperator:: |
public | function |
Provide default options for exposed filters. Overrides FilterPluginBase:: |
|
InOperator:: |
protected | function |
Overrides FilterPluginBase:: |
1 |
InOperator:: |
public | function |
Overrides \Drupal\views\Plugin\views\HandlerBase::init(). Overrides FilterPluginBase:: |
1 |
InOperator:: |
protected | function | ||
InOperator:: |
public | function |
Build strings from the operators() for 'select' options. Overrides FilterPluginBase:: |
1 |
InOperator:: |
public | function | This kind of construct makes it relatively easy for a child class to add or remove functionality by overriding this function and adding/removing items from this array. | 1 |
InOperator:: |
protected | function | ||
InOperator:: |
public | function |
Add this filter to the query. Overrides FilterPluginBase:: |
5 |
InOperator:: |
public | function | When using exposed filters, we may be required to reduce the set. | |
InOperator:: |
public | function |
Overrides FilterPluginBase:: |
|
InOperator:: |
protected | function |
Options form subform for setting options. Overrides FilterPluginBase:: |
2 |
InOperator:: |
protected | function |
Perform any necessary changes to the form values prior to storage. Overrides FilterPluginBase:: |
2 |
ModerationStateFilter:: |
protected | property | The bundle information service. | |
ModerationStateFilter:: |
protected | property | The entity type manager. | |
ModerationStateFilter:: |
protected | property |
Overrides InOperator:: |
|
ModerationStateFilter:: |
protected | property | The storage handler of the workflow entity type. | |
ModerationStateFilter:: |
public | function | ||
ModerationStateFilter:: |
public static | function | ||
ModerationStateFilter:: |
public | function |
The cache contexts associated with this object. Overrides FilterPluginBase:: |
|
ModerationStateFilter:: |
public | function |
The cache tags associated with this object. Overrides FilterPluginBase:: |
|
ModerationStateFilter:: |
public | function |
Child classes should be used to override this function and set the
'value options', unless 'options callback' is defined as a valid function
or static public method to generate these values. Overrides InOperator:: |
|
ModerationStateFilter:: |
protected | function | Gets the list of Workflow IDs configured for this filter. | |
ModerationStateFilter:: |
public | function |
Allows a plugin to define whether it should be removed. Overrides DependentWithRemovalPluginInterface:: |
|
ModerationStateFilter:: |
protected | function |
Overrides InOperator:: |
|
ModerationStateFilter:: |
public | function | Creates an instance of ModerationStateFilter. | |
ModerationStateJoinViewsHandlerTrait:: |
public | function |