EntityReferenceSynonymsBehavior.class.inc 3.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586
  1. <?php
  2. /**
  3. * @file
  4. * Enables Entity Reference field type to be source of synonyms.
  5. */
  6. /**
  7. * Definition of EntityReferenceSynonymsBehavior class.
  8. */
  9. class EntityReferenceSynonymsBehavior extends AbstractFieldSynonymsBehavior implements AutocompleteSynonymsBehavior, SelectSynonymsBehavior {
  10. public function extractSynonyms($entity, $langcode = NULL) {
  11. $synonyms = array();
  12. $target_tids = array();
  13. foreach ($this->entityItems($entity, $langcode) as $item) {
  14. $target_tids[] = $item['target_id'];
  15. }
  16. $entities = entity_load($this->field['settings']['target_type'], $target_tids);
  17. foreach ($entities as $entity) {
  18. $synonyms[] = entity_label($this->field['settings']['target_type'], $entity);
  19. }
  20. return $synonyms;
  21. }
  22. public function mergeEntityAsSynonym($trunk_entity, $synonym_entity, $synonym_entity_type) {
  23. // Firstly validating that this entity reference is able to reference to
  24. // that type of entity.
  25. $expected_synonym_entity_type = $this->field['settings']['target_type'];
  26. $items = $this->entityItems($trunk_entity);
  27. if ($expected_synonym_entity_type != $synonym_entity_type) {
  28. return;
  29. }
  30. $synonym_entity_id = entity_extract_ids($synonym_entity_type, $synonym_entity);
  31. $synonym_entity_id = $synonym_entity_id[0];
  32. $items[] = array(
  33. 'target_id' => $synonym_entity_id,
  34. );
  35. $trunk_entity->{$this->field['field_name']}[LANGUAGE_NONE] = $this->uniqueItems($items, array('target_id'));
  36. }
  37. public function synonymsFind(QueryConditionInterface $condition) {
  38. if ($this->field['storage']['type'] != 'field_sql_storage') {
  39. throw new SynonymsBehaviorException(t('Not supported storage engine %type in @method() method.', array(
  40. '%type' => $this->field['storage']['type'],
  41. '@method' => __METHOD__,
  42. )));
  43. }
  44. $table = array_keys($this->field['storage']['details']['sql'][FIELD_LOAD_CURRENT]);
  45. $table = reset($table);
  46. $column = $this->field['storage']['details']['sql'][FIELD_LOAD_CURRENT][$table]['target_id'];
  47. $query = db_select($table, 'field');
  48. $target_entity_type_info = entity_get_info($this->field['settings']['target_type']);
  49. if (!isset($target_entity_type_info['base table']) || !$target_entity_type_info['base table']) {
  50. throw new SynonymsBehaviorException(t('Target entity type %entity_type is not stored in database.', array(
  51. '%entity_type' => $this->field['settings']['target_type'],
  52. )));
  53. }
  54. if (!isset($target_entity_type_info['entity keys']['id'])) {
  55. throw new SynonymsBehaviorException(t('Target entity type %entity_type does not declare primary key.', array(
  56. '%entity_type' => $this->field['settings']['target_type'],
  57. )));
  58. }
  59. if (!isset($target_entity_type_info['entity keys']['label'])) {
  60. throw new SynonymsBehaviorException(t('Target entity type %entity_type does not declare label column.', array(
  61. '%entity_type' => $this->field['settings']['target_type'],
  62. )));
  63. }
  64. $target_entity_alias = $query->innerJoin($target_entity_type_info['base table'], 'target_entity', 'field.' . $column . ' = target_entity.' . $target_entity_type_info['entity keys']['id']);
  65. $query->addField($target_entity_alias, $target_entity_type_info['entity keys']['label'], 'synonym');
  66. $query->fields('field', array('entity_id'));
  67. $query->condition('field.entity_type', $this->instance['entity_type']);
  68. $query->condition('field.bundle', $this->instance['bundle']);
  69. $this->synonymsFindProcessCondition($condition, $target_entity_alias . '.' . $target_entity_type_info['entity keys']['label'], 'field.entity_id');
  70. $query->condition($condition);
  71. return $query->execute();
  72. }
  73. }