Browse Source

IsIslandora views filter and context condition use Islandora Utils.

pull/881/head
Rosie Le Faive 3 years ago
parent
commit
69b5688ed2
  1. 12
      islandora.views.inc
  2. 13
      src/Plugin/Condition/NodeIsIslandoraObject.php
  3. 121
      src/Plugin/views/filter/NodeIsIslandora.php

12
islandora.views.inc

@ -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',
],
];
}

13
src/Plugin/Condition/NodeIsIslandoraObject.php

@ -5,13 +5,14 @@ namespace Drupal\islandora\Plugin\Condition;
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"))
* }
@ -19,6 +20,7 @@ use Symfony\Component\DependencyInjection\ContainerInterface;
*/
class NodeIsIslandoraObject extends ConditionPluginBase implements ContainerFactoryPluginInterface {
/**
* {@inheritdoc}
*/
@ -38,8 +40,9 @@ class NodeIsIslandoraObject extends ConditionPluginBase implements ContainerFact
if (!$node) {
return FALSE;
}
// Islandora objects have these two fields.
if ($node->hasField('field_model') && $node->hasField('field_member_of')) {
// Islandora objects are determined by Islandora Utils.
$utils = \Drupal::service('islandora.utils');
if ($utils->isIslandoraType('node',$node->bundle())) {
return TRUE;
}
}
@ -49,10 +52,10 @@ class NodeIsIslandoraObject extends ConditionPluginBase implements ContainerFact
*/
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.');
}
}

121
src/Plugin/views/filter/NodeIsIslandora.php

@ -0,0 +1,121 @@
<?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;
/**
* 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;
/**
* 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.
*/
public function __construct(array $configuration, $plugin_id, $plugin_definition, ViewsHandlerManager $join_handler) {
parent::__construct($configuration, $plugin_id, $plugin_definition);
$this->joinHandler = $join_handler;
}
/**
* {@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')
);
}
/**
* {@inheritdoc}
*/
protected function defineOptions() {
return [
'negated' => ['default' => FALSE],
];
}
/**
* {@inheritdoc}
*/
public function buildOptionsForm(&$form, FormStateInterface $form_state) {
$types = [];
$utils = \Drupal::service('islandora.utils');
foreach (\Drupal::service('entity_type.bundle.info')->getBundleInfo('node') as $bundle_id => $bundle) {
if ($utils->isIslandoraType('node', $bundle_id)) {
$types[] = $bundle['label'] . ' (' . $bundle_id . ')' ;
}
}
$form['info'] = [
'#type' => 'item',
'#title' => 'Information',
'#description' => t("Configured Islandora bundles: ") . implode(', ', $types),
];
$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 = [];
$utils = \Drupal::service('islandora.utils');
foreach (array_keys(\Drupal::service('entity_type.bundle.info')->getBundleInfo('node')) as $bundle_id) {
if ($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);
}
}
Loading…
Cancel
Save