From 62211ff90980f02706ca5131a411149d595c4fed Mon Sep 17 00:00:00 2001 From: Seth Shaw Date: Wed, 8 Jun 2022 16:43:39 -0700 Subject: [PATCH] add NodeHasMediaUse views filter --- islandora.views.inc | 12 +++ src/Plugin/views/filter/NodeHasMediaUse.php | 88 +++++++++++++++++++++ 2 files changed, 100 insertions(+) create mode 100644 src/Plugin/views/filter/NodeHasMediaUse.php diff --git a/islandora.views.inc b/islandora.views.inc index cd826d08..de176f15 100644 --- a/islandora.views.inc +++ b/islandora.views.inc @@ -22,4 +22,16 @@ function islandora_views_data_alter(&$data) { $data['node__' . $field][$field]['field']['id'] = 'integer_weight_selector'; } } + + // Add Has Media filter. + $data['node_field_data']['islandora_has_media'] = [ + 'title' => t('Node has Media Use'), + 'group' => t('Content'), + 'filter' => [ + 'title' => t('Node has media use filter'), + 'help' => t('Provides a custom filter for nodes that do or do not have media with a given use.'), + 'field' => 'nid', + 'id' => 'islandora_node_has_media_use', + ], + ]; } diff --git a/src/Plugin/views/filter/NodeHasMediaUse.php b/src/Plugin/views/filter/NodeHasMediaUse.php new file mode 100644 index 00000000..e83c6306 --- /dev/null +++ b/src/Plugin/views/filter/NodeHasMediaUse.php @@ -0,0 +1,88 @@ + NULL]; + $options['negated'] = ['default' => FALSE]; + + return $options; + } + + /** + * {@inheritdoc} + */ + public function validateOptionsForm(&$form, FormStateInterface $form_state) { + parent::validateOptionsForm($form, $form_state); + + $uri = $form_state->getValues()['options']['use_uri']; + $term = \Drupal::service('islandora.utils')->getTermForUri($uri); + if (empty($term)) { + $form_state->setError($form['use_uri'], $this->t('Could not find term with URI: "%uri"', ['%uri' => $uri])); + } + } + + /** + * {@inheritdoc} + */ + protected function valueForm(&$form, FormStateInterface $form_state) { + $form['use_uri'] = [ + '#type' => 'textfield', + '#title' => "Media Use URI", + '#default_value' => $this->options['use_uri'], + '#required' => TRUE, + ]; + $form['negated'] = [ + '#type' => 'checkbox', + '#title' => 'Negated', + '#description' => $this->t("Return nodes that don't have this use URI"), + '#default_value' => $this->options['negated'], + ]; + } + + /** + * {@inheritdoc} + */ + public function adminSummary() { + $operator = ($this->options['negated']) ? "does not have" : "has"; + return "Node {$operator} media with use: '{$this->options['use_uri']}'"; + } + + /** + * {@inheritdoc} + */ + public function query() { + $condition = ($this->options['negated']) ? 'NOT IN' : 'IN'; + $utils = \Drupal::service('islandora.utils'); + $term = $utils->getTermForUri($this->options['use_uri']); + if (empty($term)) { + \Drupal::logger('islandora')->warning('Node Has Media Filter could not find term with URI: "%uri"', ['%uri' => $this->options['use_uri']]); + return; + } + $sub_query = \Drupal::database()->select('media', 'm'); + $sub_query->join('media__field_media_use', 'use', 'm.mid = use.entity_id'); + $sub_query->join('media__field_media_of', 'of', 'm.mid = of.entity_id'); + $sub_query->fields('of', ['field_media_of_target_id']) + ->condition('use.field_media_use_target_id', $term->id()); + $this->query->addWhere(0, 'nid', $sub_query, $condition); + + } + +}