You are here

function apachesolr_reference_field_formatter_view in Apachesolr Reference 7

Implements hook_formatter_view().

File

./apachesolr_reference.module, line 304
functionality for creating reference fields to apache solr objects.

Code

function apachesolr_reference_field_formatter_view($entity_type, $entity, $field, $instance, $langcode, $items, $display) {
  $element = array();
  $settings = $display['settings'];
  $field_settings = $field['settings'];

  // Add entity language if set.
  if ($langcode != LANGUAGE_NONE) {
    $field_settings['language'] = $langcode;
  }

  // Check to see if output is for just ids. No need to query solr for that.
  // Since ID's are stored in the db.
  if ($display['type'] == 'apachesolr_reference_formatter_ids') {
    foreach ($items as $delta => $item) {
      $element[$delta] = array(
        '#markup' => $item['target_id'],
      );
    }
  }
  else {
    $items = _apachesolr_reference_fetch_field_items($items, $field_settings);
    if (count($items) > 0) {
      switch ($display['type']) {

        // Display a custom output, replacing tokens with actual field values.
        case 'apachesolr_reference_formatter_custom':
          foreach ($items as $delta => $item) {
            $tokens = array();
            $token_values = array();
            foreach ($field_settings['search_fields'] as $search_field) {
              if (isset($item->{$search_field})) {

                // Multi value? add deltas.
                if (is_array($item->{$search_field})) {
                  foreach ($item->search_field as $sdelta => $value) {
                    $tokens[] = '[' . $search_field . ':' . $sdelta . ']';
                    $token_values[] = $value;
                  }
                  $value = array_shift($item->search_field);
                }
                else {
                  $value = $item->{$search_field};
                }
                $tokens[] = '[' . $search_field . ']';
                $token_values[] = $value;
              }
            }

            // If additional SOLR values to retrieve, add them to array.
            if (strlen($field_settings['field_list']) > 0) {
              $add_fields = explode(',', $field_settings['field_list']);
              foreach ($add_fields as $solr_field) {
                if (isset($item->{$solr_field})) {

                  // Multi value? add deltas.
                  if (is_array($item->{$solr_field})) {
                    foreach ($item->{$solr_field} as $sdelta => $value) {
                      $tokens[] = '[' . $solr_field . ':' . $sdelta . ']';
                      $token_values[] = $value;
                    }
                    $value = array_shift($item->{$solr_field});
                  }
                  else {
                    $value = $item->{$solr_field};
                  }
                  $tokens[] = '[' . $solr_field . ']';
                  $token_values[] = $value;
                }
              }
            }
            $element[$delta] = array(
              '#markup' => str_replace($tokens, $token_values, $settings['custom_display']),
            );
          }
          break;

        // Just display the SOLR label value.
        case 'apachesolr_reference_formatter_label':
          foreach ($items as $delta => $item) {
            $label = $item->{$settings}['label'];
            $element[$delta] = array(
              '#markup' => $label,
            );
          }
          break;

        // Display linked labels.
        case 'apachesolr_reference_formatter_label_link':
          foreach ($items as $delta => $item) {
            $label = $item->{$settings}['label'];
            $url = $item->{$settings}['url'];
            $element[$delta] = array(
              '#markup' => l($label, $url, array(
                'html' => TRUE,
              )),
            );
          }
          break;
      }
    }
  }
  return $element;
}