You are here

function views_slideshow_royalslider_views_pre_render in RoyalSlider Integration 7

Implements hook_views_prerender().

File

contrib/views_slideshow_royalslider/views_slideshow_royalslider.module, line 22
Views Slideshow: RoyalSlider module.

Code

function views_slideshow_royalslider_views_pre_render(&$view) {
  $display = $view->display[$view->current_display];
  if ($view->style_plugin->plugin_name == 'slideshow' && $view->style_options['slideshow_type'] == 'views_slideshow_royalslider') {

    // Get the caption field.
    if (!empty($view->style_options['views_slideshow_royalslider']['caption'])) {
      $caption_field = $view->style_options['views_slideshow_royalslider']['caption'];

      // Add the rsCaption class.
      $field = $display->handler->handlers['field'][$caption_field];
      $field->options['element_class'] .= strlen($field->options['element_class']) > 0 ? ' rsCaption' : 'rsCaption';
    }
    if (!empty($view->style_options['views_slideshow_royalslider']['main_image'])) {
      $main_image_field = $view->style_options['views_slideshow_royalslider']['main_image'];

      // @TODO: Check if there's a cleaner way to get the field name OR change the render array.
      $view_field_name = 'field_' . $main_image_field;
      foreach ($view->result as $i => $result) {
        $image_render_field = current($result->{$view_field_name});
        if (!is_array($image_render_field)) {

          // The result has no value for the field that is selected as its' image field.
          // @TODO: remove the item from the view result
          // unset($view->result[$i]);
        }
        else {
          $theme = $image_render_field['rendered']['#theme'];

          // @TODO: check if the image render field exists.. otherwise it kills views.
          // RoyalSlider views supports both image fields and file fields.
          if ($theme == 'image_formatter') {
            $render_item = _views_slideshow_royalslider_process_image_item($image_render_field['rendered']['#item'], $image_render_field);
            $image_render_field['rendered']['#item'] = $render_item['item'];
            $new_attributes = $render_item['attributes'];
            $image_style = $image_render_field['rendered']['#image_style'];
            $image_path = image_style_url($image_style, $image_render_field['raw']['uri']);
          }
          elseif ($theme == 'file_entity') {
            if ($image_render_field['rendered']['#bundle'] == 'image') {
              $render_item = _views_slideshow_royalslider_process_image_item($image_render_field['rendered']['file']['#item'], $image_render_field);
              $image_render_field['rendered']['file']['#item'] = $render_item['item'];
              $new_attributes = $render_item['attributes'];

              // The image path should use the image style.
              $image_style = $image_render_field['rendered']['file']['#image_style'];
              $image_path = image_style_url($image_style, $image_render_field['raw']['uri']);
            }
            elseif ($image_render_field['rendered']['#bundle'] == 'video') {
              $render_item = _views_slideshow_royalslider_process_video_item($image_render_field['rendered']['file'], $image_render_field);
              $image_render_field['rendered']['file'] = $render_item['item'];
              $new_attributes = $render_item['#attributes'];
              $image_path = image_style_url($render_item['#style_name'], $render_item['#path']);
            }
          }
          else {

            // @TODO: this throws views errors, use another way to let people know they should choose another formatter for their field.
            // drupal_set_message(t('RoyalSlider: The formatter for the image field you selected is not supported.'), 'warning');
          }

          // @TODO: add support for a custom image field for the video?
          // @TODO: cleanup the variable name(s) as it might not be an image field but a video field.
          // Convert the image to a preloaded one if preloading is enabled.
          $optionset_name = isset($view->style_options['views_slideshow_royalslider']['optionset']) ? $view->style_options['views_slideshow_royalslider']['optionset'] : 'default';
          $optionset = royalslider_optionset_load($optionset_name);
          if ($optionset->options['usePreloader'] == TRUE) {

            // @TODO with preload set, check the number of items that should be preloaded.
            // @TODO Is there a cleaner way to get the image style into the view to use in theme_views_slideshow_royalslider_main_frame() ?
            $original_render_field = $image_render_field;
            $image_render_field['rendered'] = array(
              '#theme' => 'link',
              '#path' => $image_path,
              '#text' => $image_render_field['raw']['alt'],
              '#options' => array(
                'attributes' => $new_attributes,
                'html' => FALSE,
              ),
            );
            if (array_key_exists('#image_style', $original_render_field['rendered'])) {
              $image_render_field['rendered']['#image_style'] = $original_render_field['rendered']['#image_style'];
            }
          }
          $view->result[$i]->{$view_field_name} = array(
            $image_render_field,
          );
        }
      }
    }

    // @TODO: figure out how to wrap the loaded image in a link again (to enable clickable slides linking to other content).
  }
}