/** * Get referenced ID. * * @param string $value * The provided value, it can be an ID or not. * @param ResourceFieldInterface $resource_field * The resource field that points to another entity. * * @return string * If the field uses an alternate ID property, then the ID gets translated * to the original entity ID. If not, then the same provided ID is returned. * * @todo: Add testing to this functionality. */ protected function getReferencedId($value, ResourceFieldInterface $resource_field) { $field_definition = $resource_field->getDefinition(); if (empty($field_definition['referencedIdProperty'])) { return $value; } // Get information about the the Drupal field to see what entity type we are // dealing with. $field_info = field_info_field($resource_field->getProperty()); // We support: // - Entity Reference. // - Taxonomy Term. // - File & Image field. // - uid property. // - vid property. // If you need to support other types, you can create a custom data provider // that overrides this method. $target_entity_type = NULL; $bundles = array(); if (!$field_info) { if ($resource_field->getProperty() == 'uid') { // We make a special case for the user id. $target_entity_type = 'user'; } elseif ($resource_field->getProperty() == 'vid') { // We make a special case for the vocabulary id. $target_entity_type = 'taxonomy_vocabulary'; } } elseif (!empty($field_info['type']) && $field_info['type'] == 'entityreference') { $target_entity_type = $field_info['settings']['target_type']; $bundles = empty($field_info['settings']['handler_settings']['target_bundles']) ? array() : $field_info['settings']['handler_settings']['target_bundles']; } elseif (!empty($field_info['type']) && $field_info['type'] == 'file') { $target_entity_type = 'file'; } elseif (!empty($field_info['type']) && $field_info['type'] == 'taxonomy_term_reference') { $target_entity_type = 'taxonomy_term'; // Narrow down with the vocabulary information. Very useful if there are // multiple terms with the same name in different vocabularies. foreach ($field_info['settings']['allowed_values'] as $allowed_value) { $bundles[] = $allowed_value['vocabulary']; } } if (empty($target_entity_type) && $resource_field instanceof ResourceFieldResourceInterface && ($resource_info = $resource_field->getResource())) { $instance_id = sprintf('%s:%d.%d', $resource_info['name'], $resource_info['majorVersion'], $resource_info['minorVersion']); try { $handler = restful()->getResourceManager()->getPlugin($instance_id); if ($handler instanceof ResourceEntity) { $target_entity_type = $handler->getEntityType(); $bundles = $handler->getBundles(); } } catch (PluginNotFoundException $e) { // Do nothing. } } if (empty($target_entity_type)) { return $value; } // Now we have the entity type and bundles to look for the entity based on // the contents of the field or the entity property. $query = $this->EFQObject(); $query->entityCondition('entity_type', $target_entity_type); if (!empty($bundles)) { // Narrow down for bundles. $query->entityCondition('bundle', $bundles, 'IN'); } // Check if the referencedIdProperty is a field or a property. $id_property = $field_definition['referencedIdProperty']; if (field_info_field($id_property)) { $query->fieldCondition($id_property, $resource_field->getColumn(), $value); } else { $query->propertyCondition($id_property, $value); } // Only one result is returned. This assumes the reference fields are unique // for every entity. $results = $query->range(0, 1)->execute(); if ($results[$target_entity_type]) { return key($results[$target_entity_type]); } // If no entity could be found, fall back to the original value. return $value; }
/** * {@inheritdoc} */ public function getDefinition() { return $this->decorated->getDefinition(); }