Loading core/modules/taxonomy/src/Plugin/views/relationship/NodeTermData.php +3 −1 Original line number Diff line number Diff line Loading @@ -133,7 +133,9 @@ public function query() { $query = Database::getConnection()->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'); if (empty($this->query->options['disable_sql_rewrite'])) { $query->addTag('taxonomy_term_access'); } $query->fields('td'); $query->fields('tn', ['nid']); $def['table formula'] = $query; Loading core/modules/taxonomy/tests/src/Functional/Views/RelationshipNodeTermDataTest.php +49 −0 Original line number Diff line number Diff line Loading @@ -3,6 +3,7 @@ namespace Drupal\Tests\taxonomy\Functional\Views; use Drupal\views\Views; use Drupal\views\ViewExecutable; /** * Tests the taxonomy term on node relationship handler. Loading Loading @@ -60,4 +61,52 @@ public function testViewsHandlerRelationshipNodeTermData() { $this->assertIdenticalResultset($view, $expected_result, $column_map); } /** * Tests that the 'taxonomy_term_access' tag is added to the Views query. */ public function testTag() { // Change the view to test relation limited by vocabulary. $this->config('views.view.test_taxonomy_node_term_data') ->set('display.default.display_options.relationships.term_node_tid.vids', ['views_testing_tags']) ->save(); $view = Views::getView('test_taxonomy_node_term_data'); $this->executeView($view, [$this->term1->id()]); // By default, view has taxonomy_term_access tag. $this->assertQueriesTermAccessTag($view, TRUE); // The term_access tag is not set if disable_sql_rewrite is set. $view = Views::getView('test_taxonomy_node_term_data'); $display = $view->getDisplay(); $display_options = $display->getOption('query'); $display_options['options']['disable_sql_rewrite'] = TRUE; $display->setOption('query', $display_options); $view->save(); $this->executeView($view, [$this->term1->id()]); $this->assertQueriesTermAccessTag($view, FALSE); } /** * Assert views queries have taxonomy_term_access tag. * * @param \Drupal\views\ViewExecutable $view * The View to check for the term access tag. * @param bool $hasTag * The expected existence of taxonomy_term_access tag. */ protected function assertQueriesTermAccessTag(ViewExecutable $view, $hasTag) { $main_query = $view->build_info['query']; $count_query = $view->build_info['count_query']; foreach ([$main_query, $count_query] as $query) { $tables = $query->getTables(); foreach ($tables as $join_table) { if (is_object($join_table['table'])) { $this->assertSame($join_table['table']->hasTag('taxonomy_term_access'), $hasTag); } } } } } Loading
core/modules/taxonomy/src/Plugin/views/relationship/NodeTermData.php +3 −1 Original line number Diff line number Diff line Loading @@ -133,7 +133,9 @@ public function query() { $query = Database::getConnection()->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'); if (empty($this->query->options['disable_sql_rewrite'])) { $query->addTag('taxonomy_term_access'); } $query->fields('td'); $query->fields('tn', ['nid']); $def['table formula'] = $query; Loading
core/modules/taxonomy/tests/src/Functional/Views/RelationshipNodeTermDataTest.php +49 −0 Original line number Diff line number Diff line Loading @@ -3,6 +3,7 @@ namespace Drupal\Tests\taxonomy\Functional\Views; use Drupal\views\Views; use Drupal\views\ViewExecutable; /** * Tests the taxonomy term on node relationship handler. Loading Loading @@ -60,4 +61,52 @@ public function testViewsHandlerRelationshipNodeTermData() { $this->assertIdenticalResultset($view, $expected_result, $column_map); } /** * Tests that the 'taxonomy_term_access' tag is added to the Views query. */ public function testTag() { // Change the view to test relation limited by vocabulary. $this->config('views.view.test_taxonomy_node_term_data') ->set('display.default.display_options.relationships.term_node_tid.vids', ['views_testing_tags']) ->save(); $view = Views::getView('test_taxonomy_node_term_data'); $this->executeView($view, [$this->term1->id()]); // By default, view has taxonomy_term_access tag. $this->assertQueriesTermAccessTag($view, TRUE); // The term_access tag is not set if disable_sql_rewrite is set. $view = Views::getView('test_taxonomy_node_term_data'); $display = $view->getDisplay(); $display_options = $display->getOption('query'); $display_options['options']['disable_sql_rewrite'] = TRUE; $display->setOption('query', $display_options); $view->save(); $this->executeView($view, [$this->term1->id()]); $this->assertQueriesTermAccessTag($view, FALSE); } /** * Assert views queries have taxonomy_term_access tag. * * @param \Drupal\views\ViewExecutable $view * The View to check for the term access tag. * @param bool $hasTag * The expected existence of taxonomy_term_access tag. */ protected function assertQueriesTermAccessTag(ViewExecutable $view, $hasTag) { $main_query = $view->build_info['query']; $count_query = $view->build_info['count_query']; foreach ([$main_query, $count_query] as $query) { $tables = $query->getTables(); foreach ($tables as $join_table) { if (is_object($join_table['table'])) { $this->assertSame($join_table['table']->hasTag('taxonomy_term_access'), $hasTag); } } } } }