Rosie Le Faive
2 years ago
committed by
GitHub
3 changed files with 188 additions and 6 deletions
@ -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); |
||||
} |
||||
|
||||
} |
Loading…
Reference in new issue