You are here

function bg_image_formatter_field_formatter_view in Background Images Formatter 7.2

Same name and namespace in other branches
  1. 7 bg_image_formatter.module \bg_image_formatter_field_formatter_view()

Implements hook_field_formatter_view().

File

./bg_image_formatter.module, line 372

Code

function bg_image_formatter_field_formatter_view($entity_type, $entity, $field, $instance, $langcode, $items, $display) {
  $element = array();
  $settings = $display['settings'];
  $css_settings = $settings['css_settings'];
  $image_style = $settings['image_style'] ? $settings['image_style'] : NULL;
  $selectors = bg_image_formatter_extract_settings_values($css_settings, 'bg_image_selector');
  $classes = bg_image_formatter_extract_settings_values($css_settings, 'classes');
  $colors = bg_image_formatter_extract_settings_values($css_settings, 'bg_image_color');
  foreach ($items as $delta => $item) {
    $image_url = file_create_url($item['uri']);
    if (!empty($settings['image_style'])) {
      $image_url = image_style_url($settings['image_style'], $item['uri']);
    }
    if (module_exists('token')) {
      $tokens_mapping = array_flip(token_get_entity_mapping());

      // Replace the tokens.
      $selectors = array_map(function ($selector) use ($tokens_mapping, $entity_type, $entity) {
        return token_replace($selector, array(
          $tokens_mapping[$entity_type] => $entity,
        ));
      }, $selectors);
      $colors = array_map(function ($color) use ($tokens_mapping, $entity_type, $entity) {
        return token_replace($color, array(
          $tokens_mapping[$entity_type] => $entity,
        ));
      }, $colors);
    }
    switch ($settings['bg_image_output_type']) {
      case 'css':
        if ($settings['multiple']) {
          $css_settings['bg_image_selector'] = $selectors[$delta % count($selectors)];
          $css_settings['bg_image_color'] = $colors[$delta % count($colors)];
        }
        else {
          $css_settings['bg_image_selector'] = implode(',', $selectors);
          $css_settings['bg_image_color'] = implode('', $colors);
        }
        $context = compact('entity_type', 'entity', 'item');

        // Let other module alter the CSS settings by implementing the hook:
        // hook_bg_image_formatter_css_settings_alter().
        drupal_alter('bg_image_formatter_css_settings', $css_settings, $context);
        if ($css = bg_image_formatter_add_background_image_css($item['uri'], $css_settings, $image_style)) {
          $element[0]['#attached'] = array(
            'css' => array(
              $css['style'] => array(
                'type' => $css['type'],
                'media' => $css['media'],
                'group' => $css['group'],
              ),
            ),
          );
        }
        break;
      case 'inline':
        $important = isset($css_settings['bg_image_important']) ? $css_settings['bg_image_important'] : 1;

        // If important is true, we turn it into a string for css output.
        if ($important) {
          $important = ' !important';
        }
        else {
          $important = '';
        }
        $element[$delta] = array(
          '#theme' => 'bg_image_formatter_inline',
          '#style' => sprintf("background-image: url('%s')%s;", $image_url, $important),
          '#attributes' => array(
            'style' => '%bg-image-formatter-inline%',
            'class' => (bool) $settings['multiple'] ? $classes[$delta % count($classes)] : $classes,
          ),
        );
        $element[$delta]['#attributes'] = array_filter($element[$delta]['#attributes']);
        break;
    }
  }
  return $element;
}