diff options
author | David Rothstein <drothstein@gmail.com> | 2012-06-03 18:56:13 -0400 |
---|---|---|
committer | David Rothstein <drothstein@gmail.com> | 2012-06-03 18:56:13 -0400 |
commit | f209013a5181f6b4e6c435fcc796ee9825aedbc6 (patch) | |
tree | ceae24420a85658586271774b5a401ad3b54ad79 /modules/taxonomy | |
parent | d98d58655d513c737f60486ecc4a92f82aece868 (diff) | |
download | brdo-f209013a5181f6b4e6c435fcc796ee9825aedbc6.tar.gz brdo-f209013a5181f6b4e6c435fcc796ee9825aedbc6.tar.bz2 |
Issue #1054162 by tim.plunkett, Dave Reid, joachim, no_commit_credit, Berdir: Taxonomy bundles not supported by EntityFieldQuery.
Diffstat (limited to 'modules/taxonomy')
-rw-r--r-- | modules/taxonomy/taxonomy.module | 32 | ||||
-rw-r--r-- | modules/taxonomy/taxonomy.test | 54 |
2 files changed, 86 insertions, 0 deletions
diff --git a/modules/taxonomy/taxonomy.module b/modules/taxonomy/taxonomy.module index ca77907ae..ee12be718 100644 --- a/modules/taxonomy/taxonomy.module +++ b/modules/taxonomy/taxonomy.module @@ -1906,3 +1906,35 @@ function taxonomy_taxonomy_term_delete($term) { /** * @} End of "defgroup taxonomy_index". */ + +/** + * Implements hook_entity_query_alter(). + * + * Converts EntityFieldQuery instances on taxonomy terms that have an entity + * condition on term bundles (vocabulary machine names). Since the vocabulary + * machine name is not present in the {taxonomy_term_data} table itself, we have + * to convert the bundle condition into a proprety condition of vocabulary IDs + * to match against {taxonomy_term_data}.vid. + */ +function taxonomy_entity_query_alter($query) { + $conditions = &$query->entityConditions; + + // Alter only taxonomy term queries with bundle conditions. + if (isset($conditions['entity_type']) && $conditions['entity_type']['value'] == 'taxonomy_term' && isset($conditions['bundle'])) { + // Convert vocabulary machine names to vocabulary IDs. + $vocabulary_data = taxonomy_vocabulary_get_names(); + $vids = array(); + if (is_array($conditions['bundle']['value'])) { + foreach ($conditions['bundle']['value'] as $vocabulary_machine_name) { + $vids[] = $vocabulary_data[$vocabulary_machine_name]->vid; + } + } + else { + $vocabulary_machine_name = $conditions['bundle']['value']; + $vids = $vocabulary_data[$vocabulary_machine_name]->vid; + } + + $query->propertyCondition('vid', $vids, $conditions['bundle']['operator']); + unset($conditions['bundle']); + } +} diff --git a/modules/taxonomy/taxonomy.test b/modules/taxonomy/taxonomy.test index 42b4d4767..a84962d0f 100644 --- a/modules/taxonomy/taxonomy.test +++ b/modules/taxonomy/taxonomy.test @@ -1879,3 +1879,57 @@ class TaxonomyThemeTestCase extends TaxonomyWebTestCase { $this->assertRaw('seven/style.css', t("The administrative theme's CSS appears on the page for editing a taxonomy term.")); } } + +/** + * Tests the functionality of EntityFieldQuery for taxonomy entities. + */ +class TaxonomyEFQTestCase extends TaxonomyWebTestCase { + public static function getInfo() { + return array( + 'name' => 'Taxonomy EntityFieldQuery', + 'description' => 'Verifies operation of a taxonomy-based EntityFieldQuery.', + 'group' => 'Taxonomy', + ); + } + + function setUp() { + parent::setUp(); + $this->admin_user = $this->drupalCreateUser(array('administer taxonomy')); + $this->drupalLogin($this->admin_user); + $this->vocabulary = $this->createVocabulary(); + } + + /** + * Tests that a basic taxonomy EntityFieldQuery works. + */ + function testTaxonomyEFQ() { + $terms = array(); + for ($i = 0; $i < 5; $i++) { + $term = $this->createTerm($this->vocabulary); + $terms[$term->tid] = $term; + } + $query = new EntityFieldQuery(); + $query->entityCondition('entity_type', 'taxonomy_term'); + $result = $query->execute(); + $result = $result['taxonomy_term']; + asort($result); + $this->assertEqual(array_keys($terms), array_keys($result), 'Taxonomy terms were retrieved by EntityFieldQuery.'); + + // Create a second vocabulary and five more terms. + $vocabulary2 = $this->createVocabulary(); + $terms2 = array(); + for ($i = 0; $i < 5; $i++) { + $term = $this->createTerm($vocabulary2); + $terms2[$term->tid] = $term; + } + + $query = new EntityFieldQuery(); + $query->entityCondition('entity_type', 'taxonomy_term'); + $query->entityCondition('bundle', $vocabulary2->machine_name); + $result = $query->execute(); + $result = $result['taxonomy_term']; + asort($result); + $this->assertEqual(array_keys($terms2), array_keys($result), format_string('Taxonomy terms from the %name vocabulary were retrieved by EntityFieldQuery.', array('%name' => $vocabulary2->name))); + } + +} |