| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217 | <?php/** * @file * Features support to export entities from any Deploy <em>fetch-only</em> plan. *//** * Implements [component]_features_export_options(). * * Deploy plans are used as the initial source for an export. Deploy solves * complex dependency chains for us, so the entities actually can be used as is. */function uuid_entities_features_export_options() {  $options = array();  if (module_exists('deploy')) {    $plans = deploy_plan_load_all(array('fetch_only' => 1));    foreach ($plans as $plan) {      $options[$plan->name] = $plan->title;    }  }  return $options;}/** * Implements [component]_features_export(). */function uuid_entities_features_export($components, &$export, $module_name) {  foreach ($components as $plan_name) {    $export['features']['uuid_entities'][$plan_name] = $plan_name;  }}/** * Implements [component]_features_export_render(). * * Components corresponds to the name of Deploy plans. However, once exported, * entities can be rendered directly from the default hook without Deploy or the * initial plan. */function uuid_entities_features_export_render($module_name, $components, $export = NULL) {  $code = array();  $code[] = '  $entities = array();';  $code[] = '';  foreach ($components as $component) {    $entities = array();    if (module_exists('deploy') && $plan = deploy_plan_load($component)) {      $entities = $plan->getIterator();    }    else {      features_include_defaults(array('uuid_entities'));      $default_entities = module_invoke($module_name, 'uuid_default_entities');      foreach ($default_entities[$component] as $entity) {        $metadata = $entity->__metadata;        $entity_type = $metadata['type'];        $entity_info = entity_get_info($entity_type);        $results = entity_uuid_load($entity_type, array($entity->{$entity_info['entity keys']['uuid']}), NULL, TRUE);        if (!empty($results)) {          $entity = reset($results);          // Re-attach the metadata after loading the clean entity.          $entity->__metadata = $metadata;          $entities[] = $entity;        }      }    }    foreach ($entities as $entity) {      $entity_type = $entity->__metadata['type'];      $entity_info = entity_get_info($entity_type);      // We need to remove entity id and revision keys for better consistency.      $id_key = $entity_info['entity keys']['id'];      if (isset($entity->{$id_key})) {        unset($entity->{$id_key});      }      if (!empty($entity_info['entity keys']['revision'])) {        $vid_key = $entity_info['entity keys']['revision'];        if (isset($entity->{$vid_key})) {          unset($entity->{$vid_key});        }        if (!empty($entity_info['entity keys']['revision uuid'])) {          $vuuid_key = $entity_info['entity keys']['revision uuid'];          unset($entity->{$vuuid_key});        }      }      // We unset some common timestamp properties, since those will change and      // constantly leave the feature overidden.      $keys = array(        'created',        'updated',        'changed',        'revision_timestamp',        'timestamp',        'stamp',        'current',      );      foreach ($keys as $key) {        if (isset($entity->{$key})) {          unset($entity->{$key});        }      }      // Let other modules alter exported entities.      drupal_alter('uuid_entities_features_export_entity', $entity, $entity_type);      // Field handling.      list(, , $bundle_name) = entity_extract_ids($entity_type, $entity);      $instances = field_info_instances($entity_type, $bundle_name);      foreach ($instances as $field_name => $instance) {        $field = field_info_field($field_name);        if (!empty($entity->{$field_name})) {          foreach ($entity->{$field_name} as $langcode => &$items) {            // Let other modules alter fields on exported entities.            // We are not using drupal_alter() here, because of it's complexity            // dealing with over two alterable arguments.            $hook = 'uuid_entities_features_export_field_alter';            foreach (module_implements($hook) as $module_name) {              $function = $module_name . '_' . $hook;              $function($entity_type, $entity, $field, $instance, $langcode, $items);            }            foreach ($items as &$item) {              // We don't need to export these common field keys.              foreach (array('safe_value', 'safe_summary') as $key) {                if (isset($item[$key])) {                  unset($item[$key]);                }              }              uuid_entities_features_clean($item);            }          }        }      }      uuid_entities_features_clean($entity);      /*       * Convert entities to array to avoid having them in JSON, returned       * from standard implementation of $entity->export().       */      if (is_object($entity) && method_exists($entity, 'export')) {        $entity = get_object_vars($entity);      }      $code[] = '  $entities[\'' . check_plain($component) . '\'][] = (object) ' . features_var_export($entity, '  ') . ';';    }  }  $code[] = '';  $code[] = '  return $entities;';  return array('uuid_default_entities' => implode("\n", $code));}/** * Implements [component]_features_rebuild(). */function uuid_entities_features_rebuild($module_name) {  uuid_entities_rebuild($module_name, 'rebuild');}/** * Implements [component]_features_revert(). */function uuid_entities_features_revert($module_name) {  uuid_entities_rebuild($module_name, 'revert');}/** * Helper function to rebuild entities from a plan. */function uuid_entities_rebuild($module_name = '', $op = 'rebuild') {  features_include_defaults(array('uuid_entities'));  $entities = module_invoke($module_name, 'uuid_default_entities');  if (!empty($entities)) {    foreach ($entities as $plan_name => $entities) {      // Let other modules do things before default entities are created.      module_invoke_all("uuid_entities_pre_$op", $plan_name);      foreach ($entities as $entity) {        entity_uuid_save($entity->__metadata['type'], $entity);      }      // Let other modules do things after default entities are created.      module_invoke_all("uuid_entities_post_$op", $plan_name);    }  }}/** * Helper function to sort properties of an object. * * This will maintain better consistency. Keys might get shifted order or type * due to alterations sometimes. */function uuid_entities_features_clean(&$object) {  $properties = array();  foreach ($object as $key => $value) {    $properties[$key] = $value;    if (is_object($object)) {      unset($object->{$key});    }    elseif (is_array($object)) {      unset($object[$key]);    }  }  ksort($properties);  foreach ($properties as $key => $value) {    // Make properties type consistent.    if (is_string($value) || is_numeric($value)) {      if (is_object($object)) {        $object->{$key} = "$value";      }      elseif (is_array($object)) {        $object[$key] = "$value";      }    }    else {      if (is_object($object)) {        $object->{$key} = $value;      }      elseif (is_array($object)) {        $object[$key] = $value;      }    }  }}
 |