From 7bca3d56751a86a0320a0b018498355a558d16f9 Mon Sep 17 00:00:00 2001 From: Rosie Le Faive Date: Wed, 3 Aug 2022 12:23:57 -0300 Subject: [PATCH] IsIslandora views filter and context condition use Islandora Utils. (#881) * IsIslandora views filter and context condition use Islandora Utils. --- islandora.views.inc | 12 ++ .../Condition/NodeIsIslandoraObject.php | 38 ++++- src/Plugin/views/filter/NodeIsIslandora.php | 144 ++++++++++++++++++ 3 files changed, 188 insertions(+), 6 deletions(-) create mode 100644 src/Plugin/views/filter/NodeIsIslandora.php diff --git a/islandora.views.inc b/islandora.views.inc index 574fa415..97dbf08c 100644 --- a/islandora.views.inc +++ b/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', + ], + ]; } diff --git a/src/Plugin/Condition/NodeIsIslandoraObject.php b/src/Plugin/Condition/NodeIsIslandoraObject.php index 6448cfdc..06ff6259 100644 --- a/src/Plugin/Condition/NodeIsIslandoraObject.php +++ b/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,30 @@ use Symfony\Component\DependencyInjection\ContainerInterface; */ 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} */ @@ -26,7 +51,8 @@ class NodeIsIslandoraObject extends ConditionPluginBase implements ContainerFact return new static( $configuration, $plugin_id, - $plugin_definition + $plugin_definition, + $container->get('islandora.utils') ); } @@ -38,8 +64,8 @@ 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')) { + // Determine if node is Islandora. + if ($this->utils->isIslandoraType('node', $node->bundle())) { return TRUE; } } @@ -49,10 +75,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.'); } } diff --git a/src/Plugin/views/filter/NodeIsIslandora.php b/src/Plugin/views/filter/NodeIsIslandora.php new file mode 100644 index 00000000..2065c46b --- /dev/null +++ b/src/Plugin/views/filter/NodeIsIslandora.php @@ -0,0 +1,144 @@ +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 don't 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); + } + +}