Skip to content

Commit

Permalink
IsIslandora views filter and context condition use Islandora Utils. (#…
Browse files Browse the repository at this point in the history
…881)

* IsIslandora views filter and context condition use Islandora Utils.
  • Loading branch information
rosiel authored Aug 3, 2022
1 parent 3c194cc commit 7bca3d5
Show file tree
Hide file tree
Showing 3 changed files with 188 additions and 6 deletions.
12 changes: 12 additions & 0 deletions islandora.views.inc
Original file line number Diff line number Diff line change
Expand Up @@ -37,4 +37,16 @@ function islandora_views_data_alter(&$data) {
'id' => 'islandora_node_has_media_use',
],
];

// Add Is Islandora filter.
$data['node_field_data']['islandora_node_is_islandora'] = [
'title' => t('Node is Islandora'),
'group' => t('Content'),
'filter' => [
'title' => t('Node is Islandora'),
'help' => t('Node has a content type that possesses the mandatory Islandora fields.'),
'field' => 'nid',
'id' => 'islandora_node_is_islandora',
],
];
}
38 changes: 32 additions & 6 deletions src/Plugin/Condition/NodeIsIslandoraObject.php
Original file line number Diff line number Diff line change
Expand Up @@ -5,28 +5,54 @@
use Drupal\Core\Condition\ConditionPluginBase;
use Drupal\Core\Plugin\ContainerFactoryPluginInterface;
use Symfony\Component\DependencyInjection\ContainerInterface;
use Drupal\Islandora\IslandoraUtils;

/**
* Checks whether node has fields that qualify it as an "Islandora" node.
*
* @Condition(
* id = "node_is_islandora_object",
* label = @Translation("Node is an Islandora object"),
* label = @Translation("Node is an Islandora node"),
* context_definitions = {
* "node" = @ContextDefinition("entity:node", required = TRUE , label = @Translation("node"))
* }
* )
*/
class NodeIsIslandoraObject extends ConditionPluginBase implements ContainerFactoryPluginInterface {

/**
* Islandora Utils.
*
* @var \Drupal\islandora\IslandoraUtils
*/
protected $utils;

/**
* Constructs a Node is Islandora Condition plugin.
*
* @param array $configuration
* A configuration array containing information about the plugin instance.
* @param string $plugin_id
* The plugin_id for the plugin instance.
* @param mixed $plugin_definition
* The plugin implementation definition.
* @param \Drupal\islandora\IslandoraUtils $islandora_utils
* Islandora utilities.
*/
public function __construct(array $configuration, $plugin_id, $plugin_definition, IslandoraUtils $islandora_utils) {
parent::__construct($configuration, $plugin_id, $plugin_definition);
$this->utils = $islandora_utils;
}

/**
* {@inheritdoc}
*/
public static function create(ContainerInterface $container, array $configuration, $plugin_id, $plugin_definition) {
return new static(
$configuration,
$plugin_id,
$plugin_definition
$plugin_definition,
$container->get('islandora.utils')
);
}

Expand All @@ -38,8 +64,8 @@ public function evaluate() {
if (!$node) {
return FALSE;
}
// Islandora objects have these two fields.
if ($node->hasField('field_model') && $node->hasField('field_member_of')) {
// Determine if node is Islandora.
if ($this->utils->isIslandoraType('node', $node->bundle())) {
return TRUE;
}
}
Expand All @@ -49,10 +75,10 @@ public function evaluate() {
*/
public function summary() {
if (!empty($this->configuration['negate'])) {
return $this->t('The node is not an Islandora object.');
return $this->t('The node is not an Islandora node.');
}
else {
return $this->t('The node is an Islandora object.');
return $this->t('The node is an Islandora node.');
}
}

Expand Down
144 changes: 144 additions & 0 deletions src/Plugin/views/filter/NodeIsIslandora.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,144 @@
<?php

namespace Drupal\islandora\Plugin\views\filter;

use Drupal\Core\Form\FormStateInterface;
use Drupal\views\Plugin\views\filter\FilterPluginBase;
use Drupal\views\Plugin\ViewsHandlerManager;
use Drupal\Core\Plugin\ContainerFactoryPluginInterface;
use Symfony\Component\DependencyInjection\ContainerInterface;
use Drupal\islandora\IslandoraUtils;
use Drupal\Core\Entity\EntityTypeBundleInfoInterface;

/**
* Views Filter to show only Islandora nodes.
*
* @ingroup views_filter_handlers
*
* @ViewsFilter("islandora_node_is_islandora")
*/
class NodeIsIslandora extends FilterPluginBase implements ContainerFactoryPluginInterface {

/**
* Views Handler Plugin Manager.
*
* @var \Drupal\views\Plugin\ViewsHandlerManager
*/
protected $joinHandler;

/**
* Islandora Utils.
*
* @var \Drupal\islandora\IslandoraUtils
*/
protected $utils;

/**
* The entity type bundle info service.
*
* @var \Drupal\Core\Entity\EntityTypeBundleInfoInterface
*/
protected $entityTypeBundleInfo;

/**
* Constructs a Node is Islandora views filter plugin.
*
* @param array $configuration
* A configuration array containing information about the plugin instance.
* @param string $plugin_id
* The plugin_id for the plugin instance.
* @param mixed $plugin_definition
* The plugin implementation definition.
* @param \Drupal\views\Plugin\ViewsHandlerManager $join_handler
* Views Handler Plugin Manager.
* @param \Drupal\islandora\IslandoraUtils $islandora_utils
* Islandora utilities.
* @param \Drupal\Core\Entity\EntityTypeBundleInfoInterface $entity_type_bundle_info
* The entity type bundle service.
*/
public function __construct(array $configuration, $plugin_id, $plugin_definition, ViewsHandlerManager $join_handler, IslandoraUtils $islandora_utils, EntityTypeBundleInfoInterface $entity_type_bundle_info) {
parent::__construct($configuration, $plugin_id, $plugin_definition);
$this->joinHandler = $join_handler;
$this->utils = $islandora_utils;
$this->entityTypeBundleInfo = $entity_type_bundle_info;
}

/**
* {@inheritdoc}
*/
public static function create(ContainerInterface $container, array $configuration, $plugin_id, $plugin_definition) {
return new static(
$configuration, $plugin_id, $plugin_definition,
$container->get('plugin.manager.views.join'),
$container->get('islandora.utils'),
$container->get('entity_type.bundle.info')
);
}

/**
* {@inheritdoc}
*/
protected function defineOptions() {
return [
'negated' => ['default' => FALSE],
];
}

/**
* {@inheritdoc}
*/
public function buildOptionsForm(&$form, FormStateInterface $form_state) {
$types = [];
foreach ($this->entityTypeBundleInfo->getBundleInfo('node') as $bundle_id => $bundle) {
if ($this->utils->isIslandoraType('node', $bundle_id)) {
$types[] = "{$bundle['label']} ($bundle_id)";
}
}
$types_list = implode(', ', $types);
$form['info'] = [
'#type' => 'item',
'#title' => 'Information',
'#description' => t("Configured Islandora bundles: @types", ['@types' => $types_list]),
];
$form['negated'] = [
'#type' => 'checkbox',
'#title' => 'Negated',
'#description' => $this->t("Return nodes that <em>don't</em> have islandora fields"),
'#default_value' => $this->options['negated'],
];
}

/**
* {@inheritdoc}
*/
public function adminSummary() {
$operator = ($this->options['negated']) ? "is not" : "is";
return "Node {$operator} an islandora node";
}

/**
* {@inheritdoc}
*/
public function query() {
$types = [];
foreach (array_keys($this->entityTypeBundleInfo->getBundleInfo('node')) as $bundle_id) {
if ($this->utils->isIslandoraType('node', $bundle_id)) {
$types[] = $bundle_id;
}
}
$condition = ($this->options['negated']) ? 'NOT IN' : 'IN';
$query_base_table = $this->relationship ?: $this->view->storage->get('base_table');

$definition = [
'table' => 'node',
'type' => 'LEFT',
'field' => 'nid',
'left_table' => $query_base_table,
'left_field' => 'nid',
];
$join = $this->joinHandler->createInstance('standard', $definition);
$node_table_alias = $this->query->addTable('node', $this->relationship, $join);
$this->query->addWhere($this->options['group'], "$node_table_alias.type", $types, $condition);
}

}

0 comments on commit 7bca3d5

Please sign in to comment.