1 views_handler_field_field.inc views_handler_field_field::get_value($values, $field = NULL)

Get the value that's supposed to be rendered.

This api exists so that other modules can easy set the values of the field without having the need to change the render method as well.

Parameters

$values: An object containing all retrieved values.

$field: Optional name of the field where the value is stored.

Overrides views_handler_field::get_value

File

core/modules/field/views/views_handler_field_field.inc, line 769
Definition of views_handler_field_field.

Class

views_handler_field_field
A field that displays fieldapi fields.

Code

function get_value($values, $field = NULL) {
  if (!isset($values->_field_data[$this->field_alias]['entity']) || !is_object($values->_field_data[$this->field_alias]['entity'])) {
    return array();
  }

  // Go ahead and render and store in $this->items.
  $entity = clone $values->_field_data[$this->field_alias]['entity'];

  $entity_type = $values->_field_data[$this->field_alias]['entity_type'];
  $langcode = $this->field_language($entity_type, $entity);
  // If we are grouping, copy our group fields into the cloned entity.
  // It's possible this will cause some weirdness, but there's only
  // so much we can hope to do.
  if (!empty($this->group_fields)) {
    // first, test to see if we have a base value.
    $base_value = array();
    // Note: We would copy original values here, but it can cause problems.
    // For example, text fields store cached filtered values as
    // 'safe_value' which doesn't appear anywhere in the field definition
    // so we can't affect it. Other side effects could happen similarly.
    $data = FALSE;
    foreach ($this->group_fields as $field_name => $column) {
      if (property_exists($values, $this->aliases[$column])) {
        $base_value[$field_name] = $values->{$this->aliases[$column]};
        if (isset($base_value[$field_name])) {
          $data = TRUE;
        }
      }
    }

    // If any of our aggregated fields have data, fake it:
    if ($data) {
      // Now, overwrite the original value with our aggregated value.
      // This overwrites it so there is always just one entry.
      $entity->{$this->definition['field_name']}[$langcode] = array($base_value);
    }
    else {
      $entity->{$this->definition['field_name']}[$langcode] = array();
    }
  }

  // The field we are trying to display doesn't exist on this entity.
  if (!isset($entity->{$this->definition['field_name']})) {
    return array();
  }

  // We are supposed to show only certain deltas.
  if ($this->limit_values && !empty($entity->{$this->definition['field_name']})) {
    $all_values = !empty($entity->{$this->definition['field_name']}[$langcode]) ? $entity->{$this->definition['field_name']}[$langcode] : array();
    if ($this->options['delta_reversed']) {
      $all_values = array_reverse($all_values);
    }

    // Offset is calculated differently when row grouping for a field is
    // not enabled. Since there are multiple rows, the delta needs to be
    // taken into account, so that different values are shown per row.
    if (!$this->options['group_rows'] && isset($this->aliases['delta']) && isset($values->{$this->aliases['delta']})) {
      $delta_limit = 1;
      $offset = $values->{$this->aliases['delta']};
    }
    // Single fields don't have a delta available so choose 0.
    elseif (!$this->options['group_rows'] && !$this->multiple) {
      $delta_limit = 1;
      $offset = 0;
    }
    else {
      $delta_limit = $this->options['delta_limit'];
      $offset = intval($this->options['delta_offset']);

      // We should only get here in this case if there's an offset, and
      // in that case we're limiting to all values after the offset.
      if ($delta_limit == 'all') {
        $delta_limit = count($all_values) - $offset;
      }
    }

    // Determine if only the first and last values should be shown
    $delta_first_last = $this->options['delta_first_last'];

    $new_values = array();
    for ($i = 0; $i < $delta_limit; $i++) {
      $new_delta = $offset + $i;

      if (isset($all_values[$new_delta])) {
        // If first-last option was selected, only use the first and last values
        if (!$delta_first_last
          // Use the first value.
           || $new_delta == $offset
            // Use the last value.
             || $new_delta == ($delta_limit + $offset - 1)) {
          $new_values[] = $all_values[$new_delta];
        }
      }
    }
    $entity->{$this->definition['field_name']}[$langcode] = $new_values;
  }

  if ($field == 'entity') {
    return $entity;
  }
  else {
    return !empty($entity->{$this->definition['field_name']}[$langcode]) ? $entity->{$this->definition['field_name']}[$langcode] : array();
  }
}