entity_reference_uuid-8.x-1.x-dev/src/Plugin/views/filter/TaxonomyIndexUuid.php
src/Plugin/views/filter/TaxonomyIndexUuid.php
<?php namespace Drupal\entity_reference_uuid\Plugin\views\filter; use Drupal\Core\Entity\Element\EntityAutocomplete; use Drupal\Core\Form\FormStateInterface; use Drupal\taxonomy\Entity\Term; use Drupal\taxonomy\Plugin\views\filter\TaxonomyIndexTid; /** * Filter by term uuid. * * @ingroup views_filter_handlers * * @ViewsFilter("entity_reference_uuid_taxonomy_index_uuid") */ class TaxonomyIndexUuid extends TaxonomyIndexTid { /** * {@inheritdoc} */ protected function valueForm(&$form, FormStateInterface $form_state) { $vocabulary = $this->vocabularyStorage->load($this->options['vid']); if (empty($vocabulary) && $this->options['limit']) { $form['markup'] = [ '#markup' => '<div class="js-form-item form-item">' . $this->t('An invalid vocabulary is selected. Please change it in the options.') . '</div>', ]; return; } if ($this->options['type'] == 'textfield') { $terms = $this->value ? Term::loadMultiple(($this->value)) : []; $form['value'] = [ '#title' => $this->options['limit'] ? $this->t('Select terms from vocabulary @voc', ['@voc' => $vocabulary->label()]) : $this->t('Select terms'), '#type' => 'textfield', '#default_value' => EntityAutocomplete::getEntityLabels($terms), ]; if ($this->options['limit']) { $form['value']['#type'] = 'entity_autocomplete'; $form['value']['#target_type'] = 'taxonomy_term'; $form['value']['#selection_settings']['target_bundles'] = [$vocabulary->id()]; $form['value']['#tags'] = TRUE; $form['value']['#process_default_value'] = FALSE; } } else { if (!empty($this->options['hierarchy']) && $this->options['limit']) { $tree = $this->termStorage->loadTree($vocabulary->id(), 0, NULL, TRUE); $options = []; if ($tree) { foreach ($tree as $term) { $choice = new \stdClass(); $prefix = str_repeat('-', $term->depth); $label = \Drupal::service('entity.repository') ->getTranslationFromContext($term)->label(); $choice->option = [$term->uuid() => "$prefix$label"]; $options[] = $choice; } } } else { $options = []; $query = \Drupal::entityQuery('taxonomy_term') ->accessCheck(TRUE) // @todo Sorting on vocabulary properties - // https://www.drupal.org/node/1821274. ->sort('weight') ->sort('name') ->addTag('taxonomy_term_access'); if ($this->options['limit']) { $query->condition('vid', $vocabulary->id()); } $terms = Term::loadMultiple($query->execute()); foreach ($terms as $term) { $options[$term->uuid()] = \Drupal::service('entity.repository')->getTranslationFromContext($term)->label(); } } $default_value = (array) $this->value; if ($exposed = $form_state->get('exposed')) { $identifier = $this->options['expose']['identifier']; if (!empty($this->options['expose']['reduce'])) { $options = $this->reduceValueOptions($options); if (!empty($this->options['expose']['multiple']) && empty($this->options['expose']['required'])) { $default_value = []; } } if (empty($this->options['expose']['multiple'])) { if (empty($this->options['expose']['required']) && (empty($default_value) || !empty($this->options['expose']['reduce']))) { $default_value = 'All'; } elseif (empty($default_value)) { $keys = array_keys($options); $default_value = array_shift($keys); } // Due to #1464174 there is a chance that array('') was saved in the // admin ui. Let's choose a safe default value. elseif ($default_value == ['']) { $default_value = 'All'; } else { $copy = $default_value; $default_value = array_shift($copy); } } } $form['value'] = [ '#type' => 'select', '#title' => $this->options['limit'] ? $this->t('Select terms from vocabulary @voc', ['@voc' => $vocabulary->label()]) : $this->t('Select terms'), '#multiple' => TRUE, '#options' => $options, '#size' => min(9, count($options)), '#default_value' => $default_value, ]; $user_input = $form_state->getUserInput(); if ($exposed && isset($identifier) && !isset($user_input[$identifier])) { $user_input[$identifier] = $default_value; $form_state->setUserInput($user_input); } } if (!$form_state->get('exposed')) { // Retain the helper option. $this->helper->buildOptionsForm($form, $form_state); // Show help text if not exposed to end users. $form['value']['#description'] = $this->t('Leave blank for all. Otherwise, the first selected term will be the default instead of "Any".'); } } }