You are here

public function views_handler_field_field::post_execute in Views (for Drupal 7) 7.3

Load the entities for all fields that are about to be displayed.

Overrides views_handler::post_execute

File

modules/field/views_handler_field_field.inc, line 655
Definition of views_handler_field_field.

Class

views_handler_field_field
A field that displays fieldapi fields.

Code

public function post_execute(&$values) {
  if (!empty($values)) {

    // Divide the entity ids by entity type, so they can be loaded in bulk.
    $entities_by_type = array();
    $revisions_by_type = array();
    foreach ($values as $key => $object) {
      if (isset($this->aliases['entity_type']) && isset($object->{$this->aliases['entity_type']}) && isset($object->{$this->field_alias}) && !isset($values[$key]->_field_data[$this->field_alias])) {
        $entity_type = $object->{$this->aliases['entity_type']};
        if (empty($this->definition['is revision'])) {
          $entity_id = $object->{$this->field_alias};
          $entities_by_type[$entity_type][$key] = $entity_id;
        }
        else {
          $revision_id = $object->{$this->field_alias};
          $entity_id = $object->{$this->aliases['entity_id']};
          $entities_by_type[$entity_type][$key] = array(
            $entity_id,
            $revision_id,
          );
        }
      }
    }

    // Load the entities.
    foreach ($entities_by_type as $entity_type => $entity_ids) {
      $entity_info = entity_get_info($entity_type);
      if (empty($this->definition['is revision'])) {
        $entities = entity_load($entity_type, $entity_ids);
        $keys = $entity_ids;
      }
      else {

        // Revisions can't be loaded multiple, so we have to load them
        // one by one.
        $entities = array();
        $keys = array();
        foreach ($entity_ids as $key => $combined) {
          list($entity_id, $revision_id) = $combined;
          $entity = entity_load($entity_type, array(
            $entity_id,
          ), array(
            $entity_info['entity keys']['revision'] => $revision_id,
          ));
          if ($entity) {
            $entities[$revision_id] = array_shift($entity);
            $keys[$key] = $revision_id;
          }
        }
      }
      foreach ($keys as $key => $entity_id) {

        // If this is a revision, load the revision instead.
        if (isset($entities[$entity_id])) {
          $values[$key]->_field_data[$this->field_alias] = array(
            'entity_type' => $entity_type,
            'entity' => $entities[$entity_id],
          );
        }
      }
    }

    // Now, transfer the data back into the resultset so it can be easily
    // used.
    foreach ($values as $row_id => &$value) {
      $value->{'field_' . $this->options['id']} = $this
        ->set_items($value, $row_id);
    }
  }
}