You are here

views_slideshow_rendered_entity_pager.module in Views Slideshow Rendered Entity Pager 7

Same filename and directory in other branches
  1. 8.4 views_slideshow_rendered_entity_pager.module

Provide a specific pager displaying node in a specific view mode.

File

views_slideshow_rendered_entity_pager.module
View source
<?php

/**
 * @file
 * Provide a specific pager displaying node in a specific view mode.
 */

/**
 * Implements hook_views_slideshow_widget_pager_info().
 */
function views_slideshow_rendered_entity_pager_views_slideshow_widget_pager_info($view) {
  $settings = array(
    'views_slideshow_rendered_entity_pager' => array(
      'name' => t('Rendered entity'),
    ),
  );
  return $settings;
}

/**
 * Implements hook_views_slideshow_pager_form_options().
 */
function views_slideshow_rendered_entity_pager_views_slideshow_widget_pager_form_options(&$form, &$form_state, &$view, $defaults, $dependency) {

  // Prepare the list of available view modes.
  $entity_info = entity_get_info($view->view->base_table);
  $options = array();
  if (!empty($entity_info['view modes'])) {
    foreach ($entity_info['view modes'] as $mode => $settings) {
      $options[$mode] = $settings['label'];
    }
  }
  if (empty($options)) {
    $options = array(
      'teaser' => t('Teaser'),
      'full' => t('Full content'),
    );
  }

  // Display a list only if user has selected "Rendered entity" as pager style.
  $default_value = isset($defaults['views_slideshow_rendered_entity_pager_view_mode']) ? $defaults['views_slideshow_rendered_entity_pager_view_mode'] : '';
  $form['views_slideshow_rendered_entity_pager_view_mode'] = array(
    '#type' => 'select',
    '#title' => t('Pager view mode'),
    '#options' => $options,
    '#default_value' => $default_value,
    '#description' => t('Choose the view mode that will appear in the pager.'),
    '#states' => array(
      'visible' => array(
        ':input[name="' . $dependency . '[enable]"]' => array(
          'checked' => TRUE,
        ),
        ':input[name="' . $dependency . '[type]"]' => array(
          'value' => 'views_slideshow_rendered_entity_pager',
        ),
      ),
    ),
  );
  return $form;
}

/**
 * Implements hook_theme().
 */
function views_slideshow_rendered_entity_pager_theme($existing, $type, $theme, $path) {
  return array(
    'views_slideshow_rendered_entity_pager' => array(
      'variables' => array(
        'vss_id' => NULL,
        'view' => NULL,
        'settings' => array(),
        'location' => NULL,
        'attributes' => array(),
      ),
      'template' => 'theme/views-slideshow-pager-fields',
      'path' => drupal_get_path('module', 'views_slideshow'),
    ),
  );
}

/**
 * Template preprocess function for Views Slideshow rendered entity pager.
 */
function template_preprocess_views_slideshow_rendered_entity_pager(&$vars) {

  // Call the default fields pager preprocess function.
  _views_slideshow_preprocess_views_slideshow_pager_fields($vars);

  // Override the (empty) rendered field items with our rendered nodes.
  $entity_info = entity_get_info('node');
  if (!empty($vars['settings']['views_slideshow_rendered_entity_pager_view_mode']) && !empty($entity_info['view modes'][$vars['settings']['views_slideshow_rendered_entity_pager_view_mode']])) {
    $vars['rendered_field_items'] = '';

    // Prepare an array with entity ids.
    $ids = array();
    foreach ($vars['view']->result as $item) {
      $ids[] = $item->{$vars['view']->base_field};
    }

    // Load all entities with the appropriate view mode.
    $entities = entity_load($vars['view']->base_table, $ids);
    $entities = entity_view($vars['view']->base_table, $entities, $vars['settings']['views_slideshow_rendered_entity_pager_view_mode']);

    // Add each themed entity to the array used by views_slideshow.
    // We use the views result instead of $entities to keep the expected order.
    foreach ($vars['view']->result as $count => $entity) {
      $vars['rendered_field_items'] .= theme('views_slideshow_pager_field_item', array(
        'vss_id' => $vars['vss_id'],
        'item' => render($entities[$vars['view']->base_table][$entity->{$vars['view']->base_field}]),
        'count' => $count,
        'location' => $vars['location'],
      ));
    }

    // Clone the pager fields JavaScript object and methods.
    drupal_add_js('Drupal.viewsSlideshowRenderedEntityPager = Drupal.viewsSlideshowPagerFields || {};', 'inline');
  }
}