Browse Source

add NodeHasMediaUse views filter

pull/880/head
Seth Shaw 2 years ago
parent
commit
62211ff909
  1. 12
      islandora.views.inc
  2. 88
      src/Plugin/views/filter/NodeHasMediaUse.php

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

88
src/Plugin/views/filter/NodeHasMediaUse.php

@ -0,0 +1,88 @@
<?php
namespace Drupal\islandora\Plugin\views\filter;
use Drupal\Core\Form\FormStateInterface;
use Drupal\views\Plugin\views\filter\FilterPluginBase;
/**
* Views Filter on Having Media of a Type.
*
* @ingroup views_field_handlers
*
* @ViewsFilter("islandora_node_has_media_use")
*/
class NodeHasMediaUse extends FilterPluginBase {
/**
* {@inheritdoc}
*/
protected function defineOptions() {
$options = parent::defineOptions();
$options['use_uri'] = ['default' => 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 <em>don't</em> 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);
}
}
Loading…
Cancel
Save