You are here

flexslider_fields.module in Flex Slider 7.2

Adds fields integration with FlexSlider

@author jepedo @author Mathew Winstone <mwinstone@coldfrontlabs.ca>

File

flexslider_fields/flexslider_fields.module
View source
<?php

/**
 * @file
 * Adds fields integration with FlexSlider
 *
 * @author jepedo
 * @author Mathew Winstone <mwinstone@coldfrontlabs.ca>
 */

/**
 * Implements hook_field_formatter_info().
 *
 * Adds the flexslider format option within the manage display form of
 * of an image field.
 */
function flexslider_fields_field_formatter_info() {
  $info = array(
    'flexslider' => array(
      'label' => t('flexslider'),
      'field types' => array(
        'image',
        'media',
      ),
      'settings' => array(
        'optionset' => 'default',
        'image_style' => '',
        'caption' => FALSE,
      ),
    ),
  );

  // Integrate with file entity / media.
  if (module_exists('file_entity')) {
    $info['flexslider_file_entity'] = array(
      'label' => t('FlexSlider File Entity'),
      'description' => t('Render files in a specific view mode.'),
      'field types' => array(
        'image',
        'media',
        'file',
      ),
      'settings' => array(
        'optionset' => 'default',
        'file_view_mode' => 'default',
        'caption' => FALSE,
      ),
    );
  }
  return $info;
}

/**
 * Implements hook_field_formatter_settings_form().
 *
 * Provides display settings form within the manage display page of
 * an image field with formatter flexslider.
 */
function flexslider_fields_field_formatter_settings_form($field, $instance, $view_mode, $form, &$form_state) {
  $display = $instance['display'][$view_mode];
  $settings = $display['settings'];
  $form = array();

  // Show select box for the option set
  $optionsets = array();
  ctools_include('export');
  foreach (flexslider_optionset_load_all() as $name => $optionset) {
    $optionsets[$name] = check_plain($optionset->title);
  }
  $form['optionset'] = array(
    '#title' => t('Option set'),
    '#type' => 'select',
    '#options' => $optionsets,
    '#default_value' => $settings['optionset'],
  );
  if ($display['type'] == 'flexslider') {
    $image_styles = image_style_options(FALSE, PASS_THROUGH);
    $form['image_style'] = array(
      '#title' => t('Image style'),
      '#type' => 'select',
      '#default_value' => $settings['image_style'],
      '#empty_option' => t('None (original image)'),
      '#options' => $image_styles,
    );
  }
  elseif ($display['type'] == 'flexslider_file_entity') {
    $form['file_view_mode'] = array(
      '#title' => t('File view mode'),
      '#type' => 'select',
      '#default_value' => $settings['file_view_mode'],
      '#options' => file_entity_view_mode_labels(),
    );
  }
  if (!empty($instance['settings'])) {

    // If the image field doesn't have the Title field enabled, tell the user.
    if ($instance['settings']['title_field'] == FALSE and $instance['bundle'] != 'ctools') {
      $form['caption'] = array(
        '#title' => t('Choose a caption source'),
        '#type' => 'select',
        '#disabled' => TRUE,
        '#options' => array(
          0 => t('None'),
          1 => t('Image title'),
          'alt' => t('Image ALT attribute'),
        ),
        '#description' => t('You need to <a href="@url">enable the Title field</a> for this image field to be able use it as a caption.', array(
          '@url' => url('admin/structure/types/manage/' . $instance['bundle'] . '/fields/' . $instance['field_name'], array(
            'fragment' => 'edit-instance-settings-title-field',
            'query' => array(
              'destination' => 'admin/structure/types/manage/' . $instance['bundle'] . '/display',
            ),
          )),
        )),
      );
    }
    else {
      $form['caption'] = array(
        '#title' => t('Choose a caption source'),
        '#type' => 'select',
        '#options' => array(
          0 => t('None'),
          1 => t('Image title'),
          'alt' => t('Image ALT attribute'),
        ),
        '#default_value' => $settings['caption'],
      );
    }
  }
  return $form;
}

/**
 * Implements hook_field_formatter_settings_summary().
 *
 * Displays the summary of the set options of a flexslider formatted image field
 */
function flexslider_fields_field_formatter_settings_summary($field, $instance, $view_mode) {
  $display = $instance['display'][$view_mode];
  $settings = $display['settings'];
  $summary = array();

  // Load option set.
  ctools_include('export');
  if (!empty($settings['optionset'])) {
    $o = flexslider_optionset_load($settings['optionset']);
    if ($o !== NULL) {
      $optionset = $o;
    }
  }

  // Display the selected image style.
  if ($instance['display'][$view_mode]['type'] == 'flexslider') {
    if (!empty($settings['image_style'])) {
      $is = t('Image style: %imagestyle', array(
        '%imagestyle' => $settings['image_style'],
      ));
    }
    else {
      $is = t('Image style: None (original image)');
    }
  }
  elseif ($instance['display'][$view_mode]['type'] == 'flexslider_file_entity') {
    if (!empty($settings['file_view_mode'])) {
      $is = t('File view mode: %file_view_mode', array(
        '%file_view_mode' => file_entity_view_mode_label($settings['file_view_mode']),
      ));
    }
    else {
      $is = t('File view mode: Default');
    }
  }

  // Build settings summary.
  $optionset = isset($optionset) ? $optionset->title : t('Default settings');
  $summary[] = t('Option set: %optionset', array(
    '%optionset' => $optionset,
  ));
  $summary[] = $is;
  return implode('<br />', $summary);
}

/**
 * Implements hook_field_formatter_view().
 *
 * Prepares a renderable array of images and adds the necessary JS and CSS.
 */
function flexslider_fields_field_formatter_view($entity_type, $entity, $field, $instance, $langcode, $items, $display) {

  // If file entity formatter is selected render all files initially.
  if ($display['type'] == 'flexslider_file_entity') {
    $file_display = $display;
    $file_display['type'] = 'file_rendered';
    $file_items = module_invoke('file_entity', 'field_formatter_view', $entity_type, $entity, $field, $instance, $langcode, $items, $file_display);
  }
  $element = array();
  if (count($items) > 0) {
    foreach ($items as $key => $item) {
      if (isset($item['item'])) {
        continue;
      }
      $tmp = $item;
      $item = array();
      $item['item'] = $tmp;

      // Setup the variables for calling theme_image_style
      if (isset($item['item']['uri'])) {
        $item['slide']['path'] = $item['item']['uri'];
      }
      if (isset($display['settings']['image_style'])) {
        $item['slide']['style_name'] = $display['settings']['image_style'];
      }
      if (isset($item['item']['width'])) {
        $item['slide']['width'] = $item['item']['width'];
      }
      if (isset($item['item']['height'])) {
        $item['slide']['height'] = $item['item']['height'];
      }
      if (isset($item['item']['alt'])) {
        $item['slide']['alt'] = $item['item']['alt'];
      }
      if (isset($item['item']['title'])) {
        $item['slide']['title'] = $item['item']['title'];
      }

      // Render the slide item.
      if ($display['type'] == 'flexslider') {

        // If no style set, we have to call theme_image since theme_image_style
        // doesn't auto-fallback to full size image.
        if (!empty($item['slide']['style_name'])) {

          // Generate the HTML for the slide.
          $item['slide'] = theme('image_style', $item['slide']);
        }
        else {

          // Generate the HTML for the slide.
          $item['slide'] = theme('image', $item['slide']);
        }
      }
      elseif ($display['type'] == 'flexslider_file_entity') {
        $item['slide'] = render($file_items[$key]);
      }

      // Check caption settings.
      if ($display['settings']['caption'] === '1') {
        $item['caption'] = filter_xss($item['item']['title']);
      }
      elseif ($display['settings']['caption'] === 'alt') {
        $item['caption'] = filter_xss($item['item']['alt']);
      }
      $items[$key] = $item;
    }
    $element[0] = array(
      '#theme' => 'flexslider',
      '#items' => $items,
      '#settings' => $display['settings'],
    );
  }
  return $element;
}