12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394 |
- <?php
- /**
- * @file
- * Enables Taxonomy Term Reference field types to be source of synonyms.
- */
- class TaxonomySynonymsExtractor extends AbstractSynonymsExtractor {
- public static function fieldTypesSupported() {
- return array('taxonomy_term_reference');
- }
- public static function synonymsExtract($items, $field, $instance, $entity, $entity_type) {
- $synonyms = array();
- $terms = array();
- foreach ($items as $item) {
- $terms[] = $item['tid'];
- }
- $terms = taxonomy_term_load_multiple($terms);
- foreach ($terms as $term) {
- $synonyms[] = entity_label('taxonomy_term', $term);
- }
- return $synonyms;
- }
- public static function processEntityFieldQuery($tag, EntityFieldQuery $query, $field, $instance) {
- // Unfortunately EntityFieldQuery does not currently support INNER JOINing
- // term entity that is referenced via taxonomy_term_reference field type.
- // Thus, we use an ugly solution -- going through all terms that exist in
- // vocabulary and trying to see if there is a match by term's name.
- $tids = array();
- foreach ($field['settings']['allowed_values'] as $settings) {
- $efd = new EntityFieldQuery();
- $efd->entityCondition('bundle', $settings['vocabulary'])
- ->entityCondition('entity_type', 'taxonomy_term')
- ->propertyCondition('name', '%' . $tag . '%', 'LIKE');
- $result = $efd->execute();
- if (isset($result['taxonomy_term'])) {
- foreach ($result['taxonomy_term'] as $tid) {
- $tids[] = $tid->tid;
- }
- }
- }
- // Now we have tids of terms from the referenced vocabulary which names
- // LIKE %$tag%, suggested are the terms that refer to any of these $tids.
- if (empty($tids)) {
- // No possible suggestions were found. We have to make sure $query yields
- // no results.
- self::emptyResultsCondition($query);
- return;
- }
- $query->fieldCondition($field, 'tid', $tids);
- }
- public static function mergeEntityAsSynonym($items, $field, $instance, $synonym_entity, $synonym_entity_type) {
- // Taxonomy term reference supports only referencing of entity types
- // 'taxonomy_term'.. duh.
- if ($synonym_entity_type != 'taxonomy_term') {
- return array();
- }
- // Checking that $field is configured to reference the vocabulary of
- // $synonym_entity term.
- $is_allowed = FALSE;
- foreach ($field['settings']['allowed_values'] as $setting) {
- if ($synonym_entity->vocabulary_machine_name == $setting['vocabulary']) {
- if ($setting['parent'] == 0) {
- // No need to check parent property as there is no limitation on it.
- $is_allowed = TRUE;
- break;
- }
- else {
- foreach (taxonomy_get_parents_all($synonym_entity->tid) as $parent) {
- if ($parent->tid == $setting['parent']) {
- $is_allowed = TRUE;
- break(2);
- }
- }
- }
- }
- }
- if (!$is_allowed) {
- // Synonym term is from a vocabulary that is not expected by this field,
- // or under unexpected parent.
- return array();
- }
- return array(array(
- 'tid' => $synonym_entity->tid,
- ));
- }
- }
|