You are here

function field_extractor_handler_field::post_execute in Field Extractor 7

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

Overrides views_handler::post_execute

File

views/field_extractor_handler_field.inc, line 146

Class

field_extractor_handler_field
Field extractor views field.

Code

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

    // Load the parent entities.
    list($this->entity_type, $this->entities) = $this->query
      ->get_result_entities($values);

    // Gather a list of referenced ids, load the entities, then store them
    // in $this->referenced_entities grouped by referencing entity id.
    $referenced_ids = array();
    $referenced_ids_by_parent = array();
    foreach ($this->entities as $entity) {
      $items = field_get_items($this->entity_type, $entity, $this->definition['field_name']);
      if (!empty($items)) {
        list($entity_id) = entity_extract_ids($this->entity_type, $entity);
        foreach ($items as $item) {
          $referenced_ids[] = $item[$this->settings['column']];
          $referenced_ids_by_parent[$entity_id][] = $item[$this->settings['column']];
        }
      }
    }
    $referenced_entities = entity_load($this->settings['entity_type'], $referenced_ids);
    foreach ($referenced_ids_by_parent as $entity_id => $referenced_ids) {
      foreach ($referenced_ids as $id) {
        if (!empty($referenced_entities[$id])) {
          $this->referenced_entities[$entity_id][] = $referenced_entities[$id];
        }
      }
    }

    // Build the extracted field data for each row.
    foreach ($values as $row_id => &$value) {
      $entity = $this->entities[$row_id];
      list($entity_id) = entity_extract_ids($this->entity_type, $entity);
      if (!empty($this->referenced_entities[$entity_id])) {
        $element = field_extractor_build_element($this->referenced_entities[$entity_id], $this->settings['entity_type'], $this->options);

        // Only take the items from the renderable array.
        $items = array();
        foreach (element_children($element) as $key) {
          $items[$key] = $element[$key];
        }
      }
      else {
        $items = array();
      }
      $value->{'field_extractor_' . $this->options['id']} = $items;
    }
  }
}