| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265 | 
							- <?php
 
- /**
 
-  * @file
 
-  * Provides basic entity property info for entities provided via the CRUD API,
 
-  * as well as property info for all entity types defined by core. For that
 
-  * the respective modules/MODULE.info.inc files are included.
 
-  */
 
- /**
 
-  * Implements hook_entity_property_info().
 
-  */
 
- function entity_entity_property_info() {
 
-   $items = array();
 
-   // Add in info about entities provided by the CRUD API.
 
-   foreach (entity_crud_get_info() as $type => $info) {
 
-     // Automatically enable the controller only if the module does not implement
 
-     // the hook itself.
 
-     if (!isset($info['metadata controller class']) && !empty($info['base table']) && (!isset($info['module']) || !module_hook($info['module'], 'entity_property_info'))) {
 
-       $info['metadata controller class'] = 'EntityDefaultMetadataController';
 
-     }
 
-     if (!empty($info['metadata controller class'])) {
 
-       $controller = new $info['metadata controller class']($type);
 
-       $items += $controller->entityPropertyInfo();
 
-     }
 
-   }
 
-   // Add in info for all core entities.
 
-   foreach (_entity_metadata_core_modules() as $module) {
 
-     module_load_include('inc', 'entity', "modules/$module.info");
 
-     if (function_exists($function = "entity_metadata_{$module}_entity_property_info")) {
 
-       if ($return = $function()) {
 
-         $items = array_merge_recursive($items, $return);
 
-       }
 
-     }
 
-   }
 
-   return $items;
 
- }
 
- /**
 
-  * Implements hook_entity_property_info_alter().
 
-  */
 
- function entity_entity_property_info_alter(&$entity_info) {
 
-   // Add in info for all core entities.
 
-   foreach (_entity_metadata_core_modules() as $module) {
 
-     module_load_include('inc', 'entity', "modules/$module.info");
 
-     if (function_exists($function = "entity_metadata_{$module}_entity_property_info_alter")) {
 
-       $function($entity_info);
 
-     }
 
-   }
 
- }
 
- function _entity_metadata_core_modules() {
 
-   return array_filter(array('book', 'comment', 'field', 'locale', 'node', 'taxonomy', 'user', 'system', 'statistics'), 'module_exists');
 
- }
 
- /**
 
-  * Default controller for generating some basic metadata for CRUD entity types.
 
-  */
 
- class EntityDefaultMetadataController {
 
-   protected $type, $info;
 
-   public function __construct($type) {
 
-     $this->type = $type;
 
-     $this->info = entity_get_info($type);
 
-   }
 
-   public function entityPropertyInfo() {
 
-     $entity_label = drupal_strtolower($this->info['label']);
 
-     // Provide defaults based on the schema.
 
-     $info['properties'] = $this->convertSchema();
 
-     foreach ($info['properties'] as $name => &$property) {
 
-       // Add a description.
 
-       $property['description'] = t('@entity "@property" property.', array('@entity' => drupal_ucfirst($entity_label), '@property' => $name));
 
-     }
 
-     // Set better metadata for known entity keys.
 
-     $id_key = $this->info['entity keys']['id'];
 
-     if (!empty($this->info['entity keys']['name']) && $key = $this->info['entity keys']['name']) {
 
-       $info['properties'][$key]['type'] = 'token';
 
-       $info['properties'][$key]['label'] = t('Machine-readable name');
 
-       $info['properties'][$key]['description'] = t('The machine-readable name identifying this @entity.', array('@entity' => $entity_label));
 
-       $info['properties'][$id_key]['label'] = t('Internal, numeric @entity ID', array('@entity' => $entity_label));
 
-       $info['properties'][$id_key]['description'] = t('The ID used to identify this @entity internally.', array('@entity' => $entity_label));
 
-     }
 
-     else {
 
-       $info['properties'][$id_key]['label'] = t('@entity ID', array('@entity' => drupal_ucfirst($entity_label)));
 
-       $info['properties'][$id_key]['description'] = t('The unique ID of the @entity.', array('@entity' => $entity_label));
 
-     }
 
-     // Care for the bundle.
 
-     if (!empty($this->info['entity keys']['bundle']) && $key = $this->info['entity keys']['bundle']) {
 
-       $info['properties'][$key]['type'] = 'token';
 
-       $info['properties'][$key]['options list'] = array(get_class($this), 'bundleOptionsList');
 
-     }
 
-     // Care for the label.
 
-     if (!empty($this->info['entity keys']['label']) && $key = $this->info['entity keys']['label']) {
 
-       $info['properties'][$key]['label'] = t('Label');
 
-       $info['properties'][$key]['description'] = t('The human readable label.');
 
-     }
 
-     // Add a computed property for the entity URL and expose it to views.
 
-     if (empty($info['properties']['url']) && !empty($this->info['uri callback'])) {
 
-       $info['properties']['url'] = array(
 
-         'label' => t('URL'),
 
-         'description' => t('The URL of the entity.'),
 
-         'getter callback' => 'entity_metadata_entity_get_properties',
 
-         'type' => 'uri',
 
-         'computed' => TRUE,
 
-         'entity views field' => TRUE,
 
-       );
 
-     }
 
-     return array($this->type => $info);
 
-   }
 
-   /**
 
-    * A options list callback returning all bundles for an entity type.
 
-    */
 
-   public static function bundleOptionsList($name, $info) {
 
-     if (!empty($info['parent']) && $type = $info['parent']) {
 
-       $entity_info = $info['parent']->entityInfo();
 
-       $options = array();
 
-       foreach ($entity_info['bundles'] as $name => $bundle_info) {
 
-         $options[$name] = $bundle_info['label'];
 
-       }
 
-       return $options;
 
-     }
 
-   }
 
-   /**
 
-    * Return a set of properties for an entity based on the schema definition
 
-    */
 
-   protected function convertSchema() {
 
-     return entity_metadata_convert_schema($this->info['base table']);
 
-   }
 
- }
 
- /**
 
-  * Converts the schema information available for the given table to property info.
 
-  *
 
-  * @param $table
 
-  *   The name of the table as used in hook_schema().
 
-  * @return
 
-  *   An array of property info as suiting for hook_entity_property_info().
 
-  */
 
- function entity_metadata_convert_schema($table) {
 
-   $schema = drupal_get_schema($table);
 
-   $properties = array();
 
-   foreach ($schema['fields'] as $name => $info) {
 
-     if ($type = _entity_metadata_convert_schema_type($info['type'])) {
 
-       $properties[$name] = array(
 
-         'type' => $type,
 
-         'label' => drupal_ucfirst($name),
 
-         'schema field' => $name,
 
-         // As we cannot know about any setter access, leave out the setter
 
-         // callback. For getting usually no further access callback is needed.
 
-       );
 
-       if ($info['type'] == 'serial') {
 
-         $properties[$name]['validation callback'] = 'entity_metadata_validate_integer_positive';
 
-       }
 
-     }
 
-   }
 
-   return $properties;
 
- }
 
- function _entity_metadata_convert_schema_type($type) {
 
-   switch ($type) {
 
-     case 'int':
 
-     case 'serial':
 
-     case 'date':
 
-       return 'integer';
 
-     case 'float':
 
-     case 'numeric':
 
-       return 'decimal';
 
-     case 'char':
 
-     case 'varchar':
 
-     case 'text':
 
-       return 'text';
 
-   }
 
- }
 
- /**
 
-  * Interface for extra fields controller.
 
-  *
 
-  * Note: Displays extra fields exposed by this controller are rendered by
 
-  * default by the EntityAPIController.
 
-  */
 
- interface EntityExtraFieldsControllerInterface {
 
-   /**
 
-    * Returns extra fields for this entity type.
 
-    *
 
-    * @see hook_field_extra_fields().
 
-    */
 
-   public function fieldExtraFields();
 
- }
 
- /**
 
-  * Default controller for generating extra fields based on property metadata.
 
-  *
 
-  * By default a display extra field for each property not being a field, ID or
 
-  * bundle is generated.
 
-  */
 
- class EntityDefaultExtraFieldsController implements EntityExtraFieldsControllerInterface {
 
-   /**
 
-    * @var string
 
-    */
 
-   protected $entityType;
 
-   /**
 
-    * @var array
 
-    */
 
-   protected $entityInfo;
 
-   /**
 
-    * Constructor.
 
-    */
 
-   public function __construct($type) {
 
-     $this->entityType = $type;
 
-     $this->entityInfo = entity_get_info($type);
 
-     $this->propertyInfo = entity_get_property_info($type);
 
-   }
 
-   /**
 
-    * Implements EntityExtraFieldsControllerInterface::fieldExtraFields().
 
-    */
 
-   public function fieldExtraFields() {
 
-     $extra = array();
 
-     foreach ($this->propertyInfo['properties'] as $name => $property_info) {
 
-       // Skip adding the ID or bundle.
 
-       if ($this->entityInfo['entity keys']['id'] == $name || $this->entityInfo['entity keys']['bundle'] == $name) {
 
-         continue;
 
-       }
 
-       $extra[$this->entityType][$this->entityType]['display'][$name] = $this->generateExtraFieldInfo($name, $property_info);
 
-     }
 
-     // Handle bundle properties.
 
-     $this->propertyInfo += array('bundles' => array());
 
-     foreach ($this->propertyInfo['bundles'] as $bundle_name => $info) {
 
-       foreach ($info['properties'] as $name => $property_info) {
 
-         if (empty($property_info['field'])) {
 
-           $extra[$this->entityType][$bundle_name]['display'][$name] = $this->generateExtraFieldInfo($name, $property_info);
 
-         }
 
-       }
 
-     }
 
-     return $extra;
 
-   }
 
-   /**
 
-    * Generates the display field info for a given property.
 
-    */
 
-   protected function generateExtraFieldInfo($name, $property_info) {
 
-     $info = array(
 
-       'label' => $property_info['label'],
 
-       'weight' => 0,
 
-     );
 
-     if (!empty($property_info['description'])) {
 
-       $info['description'] = $property_info['description'];
 
-     }
 
-     return $info;
 
-   }
 
- }
 
 
  |