EntityReferenceSynonymsBehavior.class.inc 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  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 AbstractSynonymsSynonymsBehavior implements SynonymsSynonymsBehavior, AutocompleteSynonymsBehavior, SelectSynonymsBehavior {
  10. public function extractSynonyms($items, $field, $instance, $entity, $entity_type) {
  11. $synonyms = array();
  12. $target_tids = array();
  13. foreach ($items as $item) {
  14. $target_tids[] = $item['target_id'];
  15. }
  16. $entities = entity_load($field['settings']['target_type'], $target_tids);
  17. foreach ($entities as $entity) {
  18. $synonyms[] = entity_label($field['settings']['target_type'], $entity);
  19. }
  20. return $synonyms;
  21. }
  22. public function mergeEntityAsSynonym($items, $field, $instance, $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 = $field['settings']['target_type'];
  26. if ($expected_synonym_entity_type != $synonym_entity_type) {
  27. return array();
  28. }
  29. $synonym_entity_id = entity_id($synonym_entity_type, $synonym_entity);
  30. return array(array(
  31. 'target_id' => $synonym_entity_id,
  32. ));
  33. }
  34. public function synonymItemHash($item, $field, $instance) {
  35. return $field['settings']['target_type'] . $item['target_id'];
  36. }
  37. public function synonymsFind(QueryConditionInterface $condition, $field, $instance) {
  38. if ($field['storage']['type'] != 'field_sql_storage') {
  39. throw new SynonymsSynonymsBehaviorException(t('Not supported storage engine %type in synonymsFind() method.', array(
  40. '%type' => $field['storage']['type'],
  41. )));
  42. }
  43. $table = array_keys($field['storage']['details']['sql'][FIELD_LOAD_CURRENT]);
  44. $table = reset($table);
  45. $column = $field['storage']['details']['sql'][FIELD_LOAD_CURRENT][$table]['target_id'];
  46. $query = db_select($table, 'field');
  47. $target_entity_type_info = entity_get_info($field['settings']['target_type']);
  48. if (!isset($target_entity_type_info['base table']) || !$target_entity_type_info['base table']) {
  49. throw new SynonymsSynonymsBehaviorException(t('Target entity type %entity_type is not stored in database.', array(
  50. '%entity_type' => $field['settings']['target_type'],
  51. )));
  52. }
  53. if (!isset($target_entity_type_info['entity keys']['id'])) {
  54. throw new SynonymsSynonymsBehaviorException(t('Target entity type %entity_type does not declare primary key.', array(
  55. '%entity_type' => $field['settings']['target_type'],
  56. )));
  57. }
  58. if (!isset($target_entity_type_info['entity keys']['label'])) {
  59. throw new SynonymsSynonymsBehaviorException(t('Target entity type %entity_type does not declare label column.', array(
  60. '%entity_type' => $field['settings']['target_type'],
  61. )));
  62. }
  63. $target_entity_alias = $query->innerJoin($target_entity_type_info['base table'], 'target_entity', 'field.' . $column . ' = target_entity.' . $target_entity_type_info['entity keys']['id']);
  64. $query->addField($target_entity_alias, $target_entity_type_info['entity keys']['label'], 'synonym');
  65. $query->fields('field', array('entity_id'));
  66. $query->condition('field.entity_type', $instance['entity_type']);
  67. $query->condition('field.bundle', $instance['bundle']);
  68. $this->synonymsFindProcessCondition($condition, $target_entity_alias . '.' . $target_entity_type_info['entity keys']['label']);
  69. $query->condition($condition);
  70. return $query->execute();
  71. }
  72. }