You are here

rss_enclosure.module in RSS field formatters 7

Provides an RSS enclosure field formatter for file, image and media fields.

File

rss_enclosure.module
View source
<?php

/**
 * @file
 * Provides an RSS enclosure field formatter for file, image and media fields.
 */

/**
 * Implements hook_field_formatter_info().
 */
function rss_enclosure_field_formatter_info() {
  return array(
    'rss_enclosure' => array(
      'label' => t('RSS enclosure'),
      'field types' => array(
        'file',
        'image',
        'media',
      ),
      'settings' => array(
        'image_style' => '',
      ),
    ),
  );
}

/**
 * Implements hook_field_formatter_view().
 */
function rss_enclosure_field_formatter_view($entity_type, $entity, $field, $instance, $langcode, $items, $display) {
  $element = array();

  // RSS only allows one enclosure per item.
  // @see http://en.wikipedia.org/wiki/RSS_enclosure
  if (isset($entity->rss_elements)) {
    foreach ($entity->rss_elements as $rss_element) {
      if ($rss_element['key'] == 'enclosure') {
        return $element;
      }
    }
  }
  foreach ($items as $item) {

    // Media field items contain a file object and do not use display property.
    if (!isset($item['uri']) && isset($item['file'])) {
      $item = (array) $item['file'];
    }
    if (!empty($item['display']) || !isset($item['display'])) {
      $url = file_create_url($item['uri']);
      $length = $item['filesize'];
      $type = $item['filemime'];
      if ($field['type'] == 'image' && !empty($display['settings']['image_style'])) {
        $url = image_style_url($display['settings']['image_style'], $item['uri']);
        $uri = image_style_path($display['settings']['image_style'], $item['uri']);
        if ($info = image_get_info($uri)) {
          $length = $info['file_size'];
          $type = $info['mime_type'];
        }
      }
      $entity->rss_elements[] = array(
        'key' => 'enclosure',
        'attributes' => array(
          // URL attribute of an enclosure element must use an HTTP URL.
          // @see http://www.rssboard.org/rss-specification#ltenclosuregtSubelementOfLtitemgt
          'url' => preg_replace('/^https:/', 'http:', $url),
          'length' => $length,
          'type' => $type,
        ),
      );
      break;
    }
  }
  return $element;
}

/**
 * Implements hook_field_formatter_settings_form().
 */
function rss_enclosure_field_formatter_settings_form($field, $instance, $view_mode, $form, &$form_state) {
  $element = array();
  if ($field['type'] == 'image') {
    $display = $instance['display'][$view_mode];
    $settings = $display['settings'];
    $image_styles = image_style_options(FALSE);
    $element['image_style'] = array(
      '#title' => t('Image style'),
      '#type' => 'select',
      '#default_value' => $settings['image_style'],
      '#empty_option' => t('None (original image)'),
      '#options' => $image_styles,
    );
  }
  return $element;
}

/**
 * Implements hook_field_formatter_settings_summary().
 */
function rss_enclosure_field_formatter_settings_summary($field, $instance, $view_mode) {
  $summary = array();
  if ($field['type'] == 'image') {
    $display = $instance['display'][$view_mode];
    $settings = $display['settings'];
    $image_styles = image_style_options(FALSE);

    // Unset possible 'No defined styles' option.
    unset($image_styles['']);

    // Styles could be lost because of enabled/disabled modules that defines
    // their styles in code.
    if (isset($image_styles[$settings['image_style']])) {
      $summary[] = t('Image style: @style', array(
        '@style' => $image_styles[$settings['image_style']],
      ));
    }
    else {
      $summary[] = t('Original image');
    }
  }
  return implode('<br />', $summary);
}