Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

IsIslandora views filter and context condition use Islandora Utils. #881

Merged
merged 6 commits into from
Aug 3, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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);
}

}