Code Coverage |
||||||||||
Classes and Traits |
Functions and Methods |
Lines |
||||||||
| Total | |
0.00% |
0 / 1 |
|
0.00% |
0 / 8 |
CRAP | |
0.00% |
0 / 77 |
| NodeTermData | |
0.00% |
0 / 1 |
|
0.00% |
0 / 8 |
306 | |
0.00% |
0 / 77 |
| __construct | |
0.00% |
0 / 1 |
2 | |
0.00% |
0 / 3 |
|||
| create | |
0.00% |
0 / 1 |
2 | |
0.00% |
0 / 7 |
|||
| init | |
0.00% |
0 / 1 |
20 | |
0.00% |
0 / 10 |
|||
| defineOptions | |
0.00% |
0 / 1 |
2 | |
0.00% |
0 / 4 |
|||
| buildOptionsForm | |
0.00% |
0 / 1 |
6 | |
0.00% |
0 / 14 |
|||
| submitOptionsForm | |
0.00% |
0 / 1 |
2 | |
0.00% |
0 / 3 |
|||
| query | |
0.00% |
0 / 1 |
20 | |
0.00% |
0 / 28 |
|||
| calculateDependencies | |
0.00% |
0 / 1 |
12 | |
0.00% |
0 / 8 |
|||
| <?php | |
| /** | |
| * @file | |
| * Contains \Drupal\taxonomy\Plugin\views\relationship\NodeTermData. | |
| */ | |
| namespace Drupal\taxonomy\Plugin\views\relationship; | |
| use Drupal\Core\Form\FormStateInterface; | |
| use Drupal\taxonomy\VocabularyStorageInterface; | |
| use Drupal\views\ViewExecutable; | |
| use Drupal\views\Plugin\views\display\DisplayPluginBase; | |
| use Drupal\views\Plugin\views\relationship\RelationshipPluginBase; | |
| use Symfony\Component\DependencyInjection\ContainerInterface; | |
| /** | |
| * Relationship handler to return the taxonomy terms of nodes. | |
| * | |
| * @ingroup views_relationship_handlers | |
| * | |
| * @ViewsRelationship("node_term_data") | |
| */ | |
| class NodeTermData extends RelationshipPluginBase { | |
| /** | |
| * The vocabulary storage. | |
| * | |
| * @var \Drupal\taxonomy\VocabularyStorageInterface | |
| */ | |
| protected $vocabularyStorage; | |
| /** | |
| * Constructs a NodeTermData object. | |
| * | |
| * @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\taxonomy\VocabularyStorageInterface $vocabulary_storage | |
| * The vocabulary storage. | |
| */ | |
| public function __construct(array $configuration, $plugin_id, $plugin_definition, VocabularyStorageInterface $vocabulary_storage) { | |
| parent::__construct($configuration, $plugin_id, $plugin_definition); | |
| $this->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 Remove the legacy code. | |
| // Convert legacy vids option to machine name vocabularies. | |
| if (!empty($this->options['vids'])) { | |
| $vocabularies = taxonomy_vocabulary_get_names(); | |
| foreach ($this->options['vids'] as $vid) { | |
| if (isset($vocabularies[$vid], $vocabularies[$vid]->machine_name)) { | |
| $this->options['vocabularies'][$vocabularies[$vid]->machine_name] = $vocabularies[$vid]->machine_name; | |
| } | |
| } | |
| } | |
| } | |
| protected function defineOptions() { | |
| $options = parent::defineOptions(); | |
| $options['vids'] = array('default' => array()); | |
| return $options; | |
| } | |
| public function buildOptionsForm(&$form, FormStateInterface $form_state) { | |
| $vocabularies = $this->vocabularyStorage->loadMultiple(); | |
| $options = array(); | |
| foreach ($vocabularies as $voc) { | |
| $options[$voc->id()] = $voc->label(); | |
| } | |
| $form['vids'] = array( | |
| '#type' => 'checkboxes', | |
| '#title' => $this->t('Vocabularies'), | |
| '#options' => $options, | |
| '#default_value' => $this->options['vids'], | |
| '#description' => $this->t('Choose which vocabularies you wish to relate. Remember that every term found will create a new record, so this relationship is best used on just one vocabulary that has only one term per node.'), | |
| ); | |
| parent::buildOptionsForm($form, $form_state); | |
| } | |
| /** | |
| * {@inheritdoc} | |
| */ | |
| public function submitOptionsForm(&$form, FormStateInterface $form_state) { | |
| // Transform the #type = checkboxes value to a numerically indexed array, | |
| // because the config schema expects a sequence, not a mapping. | |
| $vids = $form_state->getValue(['options', 'vids']); | |
| $form_state->setValue(['options', 'vids'], array_values(array_filter($vids))); | |
| } | |
| /** | |
| * Called to implement a relationship in a query. | |
| */ | |
| public function query() { | |
| $this->ensureMyTable(); | |
| $def = $this->definition; | |
| $def['table'] = 'taxonomy_term_field_data'; | |
| if (!array_filter($this->options['vids'])) { | |
| $taxonomy_index = $this->query->addTable('taxonomy_index', $this->relationship); | |
| $def['left_table'] = $taxonomy_index; | |
| $def['left_field'] = 'tid'; | |
| $def['field'] = 'tid'; | |
| $def['type'] = empty($this->options['required']) ? 'LEFT' : 'INNER'; | |
| } | |
| else { | |
| // If vocabularies are supplied join a subselect instead | |
| $def['left_table'] = $this->tableAlias; | |
| $def['left_field'] = 'nid'; | |
| $def['field'] = 'nid'; | |
| $def['type'] = empty($this->options['required']) ? 'LEFT' : 'INNER'; | |
| $def['adjusted'] = TRUE; | |
| $query = db_select('taxonomy_term_field_data', 'td'); | |
| $query->addJoin($def['type'], 'taxonomy_index', 'tn', 'tn.tid = td.tid'); | |
| $query->condition('td.vid', array_filter($this->options['vids']), 'IN'); | |
| $query->addTag('term_access'); | |
| $query->fields('td'); | |
| $query->fields('tn', array('nid')); | |
| $def['table formula'] = $query; | |
| } | |
| $join = \Drupal::service('plugin.manager.views.join')->createInstance('standard', $def); | |
| // use a short alias for this: | |
| $alias = $def['table'] . '_' . $this->table; | |
| $this->alias = $this->query->addRelationship($alias, $join, 'taxonomy_term_field_data', $this->relationship); | |
| } | |
| /** | |
| * {@inheritdoc} | |
| */ | |
| public function calculateDependencies() { | |
| $dependencies = parent::calculateDependencies(); | |
| foreach ($this->options['vids'] as $vocabulary_id) { | |
| if ($vocabulary = $this->vocabularyStorage->load($vocabulary_id)) { | |
| $dependencies[$vocabulary->getConfigDependencyKey()][] = $vocabulary->getConfigDependencyName(); | |
| } | |
| } | |
| return $dependencies; | |
| } | |
| } |