X-Git-Url: http://www.aleph1.co.uk/gitweb/?a=blobdiff_plain;f=web%2Fcore%2Fmodules%2Ftaxonomy%2Fsrc%2FPlugin%2Fviews%2Ffield%2FTaxonomyIndexTid.php;fp=web%2Fcore%2Fmodules%2Ftaxonomy%2Fsrc%2FPlugin%2Fviews%2Ffield%2FTaxonomyIndexTid.php;h=e0b9a322125ddd02a48a1cafe16cc57cc7a1dc45;hb=a2bd1bf0c2c1f1a17d188f4dc0726a45494cefae;hp=0000000000000000000000000000000000000000;hpb=57c063afa3f66b07c4bbddc2d6129a96d90f0aad;p=yaffs-website diff --git a/web/core/modules/taxonomy/src/Plugin/views/field/TaxonomyIndexTid.php b/web/core/modules/taxonomy/src/Plugin/views/field/TaxonomyIndexTid.php new file mode 100644 index 000000000..e0b9a3221 --- /dev/null +++ b/web/core/modules/taxonomy/src/Plugin/views/field/TaxonomyIndexTid.php @@ -0,0 +1,177 @@ +vocabularyStorage = $vocabulary_storage; + } + + /** + * {@inheritdoc} + */ + public static function create(ContainerInterface $container, array $configuration, $plugin_id, $plugin_definition) { + return new static( + $configuration, + $plugin_id, + $plugin_definition, + $container->get('entity.manager')->getStorage('taxonomy_vocabulary') + ); + } + + /** + * {@inheritdoc} + */ + public function init(ViewExecutable $view, DisplayPluginBase $display, array &$options = NULL) { + parent::init($view, $display, $options); + + // @todo: Wouldn't it be possible to use $this->base_table and no if here? + if ($view->storage->get('base_table') == 'node_field_revision') { + $this->additional_fields['nid'] = ['table' => 'node_field_revision', 'field' => 'nid']; + } + else { + $this->additional_fields['nid'] = ['table' => 'node_field_data', 'field' => 'nid']; + } + } + + protected function defineOptions() { + $options = parent::defineOptions(); + + $options['link_to_taxonomy'] = ['default' => TRUE]; + $options['limit'] = ['default' => FALSE]; + $options['vids'] = ['default' => []]; + + return $options; + } + + /** + * Provide "link to term" option. + */ + public function buildOptionsForm(&$form, FormStateInterface $form_state) { + $form['link_to_taxonomy'] = [ + '#title' => $this->t('Link this field to its term page'), + '#type' => 'checkbox', + '#default_value' => !empty($this->options['link_to_taxonomy']), + ]; + + $form['limit'] = [ + '#type' => 'checkbox', + '#title' => $this->t('Limit terms by vocabulary'), + '#default_value' => $this->options['limit'], + ]; + + $options = []; + $vocabularies = $this->vocabularyStorage->loadMultiple(); + foreach ($vocabularies as $voc) { + $options[$voc->id()] = $voc->label(); + } + + $form['vids'] = [ + '#type' => 'checkboxes', + '#title' => $this->t('Vocabularies'), + '#options' => $options, + '#default_value' => $this->options['vids'], + '#states' => [ + 'visible' => [ + ':input[name="options[limit]"]' => ['checked' => TRUE], + ], + ], + + ]; + + parent::buildOptionsForm($form, $form_state); + } + + /** + * Add this term to the query + */ + public function query() { + $this->addAdditionalFields(); + } + + public function preRender(&$values) { + $vocabularies = $this->vocabularyStorage->loadMultiple(); + $this->field_alias = $this->aliases['nid']; + $nids = []; + foreach ($values as $result) { + if (!empty($result->{$this->aliases['nid']})) { + $nids[] = $result->{$this->aliases['nid']}; + } + } + + if ($nids) { + $vocabs = array_filter($this->options['vids']); + if (empty($this->options['limit'])) { + $vocabs = []; + } + $result = \Drupal::entityManager()->getStorage('taxonomy_term')->getNodeTerms($nids, $vocabs); + + foreach ($result as $node_nid => $data) { + foreach ($data as $tid => $term) { + $this->items[$node_nid][$tid]['name'] = \Drupal::entityManager()->getTranslationFromContext($term)->label(); + $this->items[$node_nid][$tid]['tid'] = $tid; + $this->items[$node_nid][$tid]['vocabulary_vid'] = $term->getVocabularyId(); + $this->items[$node_nid][$tid]['vocabulary'] = $vocabularies[$term->getVocabularyId()]->label(); + + if (!empty($this->options['link_to_taxonomy'])) { + $this->items[$node_nid][$tid]['make_link'] = TRUE; + $this->items[$node_nid][$tid]['path'] = 'taxonomy/term/' . $tid; + } + } + } + } + } + + public function render_item($count, $item) { + return $item['name']; + } + + protected function documentSelfTokens(&$tokens) { + $tokens['{{ ' . $this->options['id'] . '__tid' . ' }}'] = $this->t('The taxonomy term ID for the term.'); + $tokens['{{ ' . $this->options['id'] . '__name' . ' }}'] = $this->t('The taxonomy term name for the term.'); + $tokens['{{ ' . $this->options['id'] . '__vocabulary_vid' . ' }}'] = $this->t('The machine name for the vocabulary the term belongs to.'); + $tokens['{{ ' . $this->options['id'] . '__vocabulary' . ' }}'] = $this->t('The name for the vocabulary the term belongs to.'); + } + + protected function addSelfTokens(&$tokens, $item) { + foreach (['tid', 'name', 'vocabulary_vid', 'vocabulary'] as $token) { + $tokens['{{ ' . $this->options['id'] . '__' . $token . ' }}'] = isset($item[$token]) ? $item[$token] : ''; + } + } + +}