function TaxonomyIndexTid::valueForm

Same name and namespace in other branches
  1. 9 core/modules/taxonomy/src/Plugin/views/filter/TaxonomyIndexTid.php \Drupal\taxonomy\Plugin\views\filter\TaxonomyIndexTid::valueForm()
  2. 8.9.x core/modules/taxonomy/src/Plugin/views/filter/TaxonomyIndexTid.php \Drupal\taxonomy\Plugin\views\filter\TaxonomyIndexTid::valueForm()
  3. 10 core/modules/taxonomy/src/Plugin/views/filter/TaxonomyIndexTid.php \Drupal\taxonomy\Plugin\views\filter\TaxonomyIndexTid::valueForm()

Overrides ManyToOne::valueForm

File

core/modules/taxonomy/src/Plugin/views/filter/TaxonomyIndexTid.php, line 169

Class

TaxonomyIndexTid
Filter by term id.

Namespace

Drupal\taxonomy\Plugin\views\filter

Code

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. 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) {
                    if (!$term->isPublished() && !$this->currentUser
                        ->hasPermission('administer taxonomy')) {
                        continue;
                    }
                    $choice = new \stdClass();
                    $choice->option = [
                        $term->id() => str_repeat('-', $term->depth) . \Drupal::service('entity.repository')->getTranslationFromContext($term)
                            ->label(),
                    ];
                    $options[] = $choice;
                }
            }
        }
        else {
            $options = [];
            $query = \Drupal::entityQuery('taxonomy_term')->accessCheck(TRUE)
                ->sort('weight')
                ->sort('name')
                ->addTag('taxonomy_term_access');
            if (!$this->currentUser
                ->hasPermission('administer taxonomy')) {
                $query->condition('status', 1);
            }
            if ($this->options['limit']) {
                $query->condition('vid', $vocabulary->id());
            }
            $terms = Term::loadMultiple($query->execute());
            foreach ($terms as $term) {
                $options[$term->id()] = \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);
                }
                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".');
    }
}

Buggy or inaccurate documentation? Please file an issue. Need support? Need help programming? Connect with the Drupal community.