Mercurial > hg > isophonics-drupal-site
diff modules/contrib/views_slideshow/views_slideshow.theme.inc @ 5:c69a71b4f40f
Add slideshow module
author | Chris Cannam |
---|---|
date | Thu, 07 Dec 2017 14:46:23 +0000 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/modules/contrib/views_slideshow/views_slideshow.theme.inc Thu Dec 07 14:46:23 2017 +0000 @@ -0,0 +1,419 @@ +<?php + +/** + * @file + * The theme system, which controls the output of views slideshow. + */ + +/** + * @defgroup vss_templates Templates + * @{ + * Slideshow and component templates. + * + * @see vss_theme + * @} + */ + +/** + * @defgroup vss_theme Theme Functions + * @{ + * Theme processing and display generation. + * + * Most of the logic behind the generation of the slideshow is here. + * + * @see vss_templates + */ + +use Drupal\Component\Utility\Html; + +/** + * Views Slideshow: slideshow. + */ +function _views_slideshow_preprocess_views_view_slideshow(&$vars) { + $options = $vars['view']->style_plugin->options; + $vars['skin'] = 'default'; + $vars['slideshow'] = ''; + $main_frame_module = $options['slideshow_type']; + + if (empty($main_frame_module)) { + // Get all slideshow types. + $typeManager = \Drupal::service('plugin.manager.views_slideshow.slideshow_type'); + $types = $typeManager->getDefinitions(); + + if ($types) { + foreach ($types as $id => $definition) { + $main_frame_module = $id; + break; + } + } + } + + // Make sure the main slideshow settings are defined before building the + // slideshow. + if (empty($main_frame_module)) { + drupal_set_message( + t('No main frame module is enabled for views slideshow. This is often because another module which Views Slideshow needs is not enabled. For example, 4.x needs a module like "Views Slideshow: Cycle" enabled.'), + 'error' + ); + } + elseif (empty($options[$main_frame_module])) { + drupal_set_message(t('The options for @module does not exists.', ['@module' => $main_frame_module]), 'error'); + } + elseif (!empty($vars['rows'])) { + $settings = $options[$main_frame_module]; + $view = $vars['view']; + $rows = $vars['rows']; + + // The #name element is not available on Views edit pages. + $view_element_name = (isset($view->element['#name'])) ? $view->element['#name'] : ''; + $vss_id = $view_element_name . '-' . $view->current_display; + + // Give each slideshow a unique id if there are more than one on the page. + static $instances = []; + if (isset($instances[$vss_id])) { + $instances[$vss_id]++; + $vss_id .= "_" . $instances[$vss_id]; + } + else { + $instances[$vss_id] = 1; + } + + // Building our default methods. + $methods = [ + 'goToSlide' => [], + 'nextSlide' => [], + 'pause' => [], + 'play' => [], + 'previousSlide' => [], + 'transitionBegin' => [], + 'transitionEnd' => [], + ]; + + // Pull all widget info and slideshow info and merge them together. + $widgetTypeManager = \Drupal::service('plugin.manager.views_slideshow.widget_type'); + $widgetTypes = $widgetTypeManager->getDefinitions(); + + $slideshowTypeManager = \Drupal::service('plugin.manager.views_slideshow.slideshow_type'); + $slideshowTypes = $slideshowTypeManager->getDefinitions(); + + $addons = array_merge($widgetTypes, $slideshowTypes); + + // Loop through all the addons and call their methods if needed. + foreach ($addons as $addon_id => $addon_info) { + foreach ($addon_info['accepts'] as $imp_key => $imp_value) { + if (is_array($imp_value)) { + $methods[$imp_key][] = \Drupal::service('views_slideshow.format_addons_name')->format($addon_id); + } + else { + $methods[$imp_value][] = \Drupal::service('views_slideshow.format_addons_name')->format($addon_id); + } + } + } + + $vars['#attached']['library'][] = 'views_slideshow/widget_info'; + $vars['#attached']['drupalSettings']['viewsSlideshow'][$vss_id] = [ + 'methods' => $methods, + 'paused' => 0, + ]; + + // Process Skins. + $skinManager = \Drupal::service('plugin.manager.views_slideshow.slideshow_skin'); + $skin = $skinManager->createInstance($options['slideshow_skin']); + + $vars['skin'] = $skin->getClass(); + + foreach ($skin->getLibraries() as $library) { + $vars['#attached']['library'][] = $library; + } + + // Process Widgets. + // Build weights. + $weight = []; + for ($i = 1; $i <= count($widgetTypes); $i++) { + $weight['top'][$i] = []; + $weight['bottom'][$i] = []; + } + + $slide_count = count($view->result); + if ($slide_count && $vars['view']->style_plugin->options['slideshow_type'] == 'views_slideshow_cycle') { + $items_per_slide = $vars['view']->style_plugin->options['views_slideshow_cycle']['items_per_slide']; + $slide_count = $slide_count / $items_per_slide; + } + foreach ($widgetTypes as $widgetTypeId => $widgetTypeName) { + foreach ($weight as $location => $order) { + if ($options['widgets'][$location][$widgetTypeId]['enable']) { + // If hide on single slide and only a single slide skip rendering. + if ($options['widgets'][$location][$widgetTypeId]['hide_on_single_slide'] && $slide_count <= 1) { + continue; + } + $widgetWeight = ($options['widgets'][$location][$widgetTypeId]['weight'] > count($widgetTypes)) ? count($widgetTypes) : $options['widgets'][$location][$widgetTypeId]['weight']; + + $weight[$location][$widgetWeight][] = [ + 'widgetId' => $widgetTypeId, + 'widgetSettings' => $options['widgets'][$location][$widgetTypeId], + ]; + } + } + } + + // Build our widgets. + foreach ($weight as $location => $order) { + $vars[$location . '_widget_rendered'] = []; + foreach ($order as $widgets) { + if (is_array($widgets)) { + foreach ($widgets as $widgetData) { + $vars[$location . '_widget_rendered'][] = [ + '#theme' => $view->buildThemeFunctions($widgetData['widgetId'] . '_widget_render'), + '#vss_id' => $vss_id, + '#view' => $view, + '#settings' => $widgetData['widgetSettings'], + '#location' => $location, + '#rows' => $rows, + ]; + } + } + } + } + + // Process Slideshow. + $slides = [ + '#theme' => $view->buildThemeFunctions($main_frame_module . '_main_frame'), + '#vss_id' => $vss_id, + '#view' => $view, + '#settings' => $settings, + '#rows' => $rows, + ]; + + $vars['slideshow'] = [ + '#theme' => $view->buildThemeFunctions('views_slideshow_main_section'), + '#vss_id' => $vss_id, + '#slides' => $slides, + '#plugin' => $main_frame_module, + ]; + } +} + +/** + * Views Slideshow: pager. + */ +function template_preprocess_views_slideshow_pager_widget_render(&$vars) { + // Add JavaScript settings for the pager type. + $vars['#attached']['library'][] = 'views_slideshow/widget_info'; + $vars['#attached']['drupalSettings']['viewsSlideshowPager'][$vars['vss_id']] = [ + $vars['location'] => [ + 'type' => \Drupal::service('views_slideshow.format_addons_name')->format($vars['settings']['type']), + ], + ]; + + // Create some attributes. + $attributes['class'][] = 'widget_pager widget_pager_' . $vars['location']; + $attributes['id'] = 'widget_pager_' . $vars['location'] . '_' . $vars['vss_id']; + + $pager = [ + '#theme' => $vars['view']->buildThemeFunctions($vars['settings']['type']), + '#vss_id' => $vars['vss_id'], + '#view' => $vars['view'], + '#settings' => $vars['settings'], + '#location' => $vars['location'], + '#attributes' => $attributes, + ]; + + return \Drupal::service('renderer')->render($pager); +} + +/** + * Theme pager fields. + */ +function template_preprocess_views_slideshow_pager_fields(&$vars) { + // Add JavaScript settings for the field. + $vars['#attached']['library'][] = 'views_slideshow/widget_info'; + $vars['#attached']['drupalSettings']['viewsSlideshowPagerFields'][$vars['vss_id']] = [ + $vars['location'] => [ + 'activatePauseOnHover' => $vars['settings']['views_slideshow_pager_fields']['views_slideshow_pager_fields_hover'], + ], + ]; + + // Add hover intent library. + if ($vars['settings']['views_slideshow_pager_fields']['views_slideshow_pager_fields_hover']) { + $vars['#attached']['library'][] = 'views_slideshow/jquery_hoverIntent'; + } + + $vars['widget_id'] = $vars['attributes']['id']; + // Add our class to the wrapper. + $vars['attributes']['class'][] = 'views_slideshow_pager_field'; + + // Render all the fields unless there is only 1 slide and the user specified + // to hide them when there is only one slide. + $vars['rendered_field_items'] = []; + foreach ($vars['view']->result as $count => $node) { + $rendered_fields = []; + foreach ($vars['settings']['views_slideshow_pager_fields']['views_slideshow_pager_fields_fields'] as $field => $use) { + if ($use !== 0 && is_object($vars['view']->field[$field])) { + $rendered_fields[] = [ + '#theme' => $vars['view']->buildThemeFunctions('views_slideshow_pager_field_field'), + '#view' => $vars['view'], + '#label' => $vars['view']->field[$field]->options['label'], + '#output' => $vars['view']->style_plugin->getField($count, $field), + '#css_identifier' => Html::cleanCssIdentifier($vars['view']->field[$field]->field), + ]; + } + } + + $vars['rendered_field_items'][] = [ + '#theme' => $vars['view']->buildThemeFunctions('views_slideshow_pager_field_item'), + '#vss_id' => $vars['vss_id'], + '#item' => $rendered_fields, + '#count' => $count, + '#location' => $vars['location'], + '#length' => count($vars['view']->result), + ]; + } +} + +/** + * Views Slideshow: pager item. + */ +function template_preprocess_views_slideshow_pager_field_item(&$vars) { + $vars['attributes']['class'][] = 'views_slideshow_pager_field_item'; + $vars['attributes']['class'][] = ($vars['count'] % 2) ? 'views-row-even' : 'views-row-odd'; + if ($vars['count'] == 0) { + $vars['attributes']['class'][] = 'views-row-first'; + } + elseif ($vars['count'] == $vars['length'] - 1) { + $vars['attributes']['class'][] = 'views-row-last'; + } +} + +/** + * Views Slideshow: Bullets pager. + */ +function template_preprocess_views_slideshow_pager_bullets(&$vars) { + $vars['#attached']['library'][] = 'views_slideshow/widget_info'; + $vars['#attached']['library'][] = 'views_slideshow/pager_bullets'; + $vars['#attached']['drupalSettings']['viewsSlideshowPagerFields'][$vars['vss_id']] = [ + $vars['location'] => [ + 'activatePauseOnHover' => $vars['settings']['views_slideshow_pager_bullets']['views_slideshow_pager_bullets_hover'], + ], + ]; + + $vars['bullet_items'] = [ + '#theme' => 'item_list', + '#items' => [], + '#attributes' => $vars['attributes'], + ]; + $vars['bullet_items']['#attributes']['class'][] = 'views-slideshow-pager-bullets'; + $vars['bullet_items']['#attributes']['class'][] = 'views_slideshow_pager_field'; + + for ($i = 0; $i < count($vars['view']->result); $i++) { + $vars['bullet_items']['#items'][] = [ + '#markup' => $i, + '#wrapper_attributes' => [ + 'id' => 'views_slideshow_pager_field_item_' . $vars['location'] . '_' . $vars['vss_id'] . '_' . $i, + ], + ]; + } +} + +/** + * Views Slideshow: Controls. + */ +function template_preprocess_views_slideshow_controls_widget_render(&$vars) { + // Add JavaScript settings for the controls type. + $vars['#attached']['library'][] = 'views_slideshow/widget_info'; + $vars['#attached']['drupalSettings']['viewsSlideshowControls'][$vars['vss_id']] = [ + $vars['location'] => [ + 'type' => \Drupal::service('views_slideshow.format_addons_name')->format($vars['settings']['type']), + ], + ]; + + $output = [ + '#theme' => $vars['view']->buildThemeFunctions($vars['settings']['type']), + '#vss_id' => $vars['vss_id'], + '#view' => $vars['view'], + '#settings' => $vars['settings'], + '#location' => $vars['location'], + '#rows' => $vars['rows'], + ]; + + return \Drupal::service('renderer')->render($output); +} + +/** + * The slideshow controls. + */ +function template_preprocess_views_slideshow_controls_text(&$vars) { + $vars['#attached']['library'][] = 'views_slideshow/controls_text'; + + $vars['attributes']['class'][] = 'views_slideshow_controls_text'; + + $vars['rendered_control_previous'] = [ + '#theme' => $vars['view']->buildThemeFunctions('views_slideshow_controls_text_previous'), + '#vss_id' => $vars['vss_id'], + '#view' => $vars['view'], + '#settings' => $vars['settings'], + ]; + + $vars['rendered_control_pause'] = [ + '#theme' => $vars['view']->buildThemeFunctions('views_slideshow_controls_text_pause'), + '#vss_id' => $vars['vss_id'], + '#view' => $vars['view'], + '#settings' => $vars['settings'], + ]; + + $vars['rendered_control_next'] = [ + '#theme' => $vars['view']->buildThemeFunctions('views_slideshow_controls_text_next'), + '#vss_id' => $vars['vss_id'], + '#view' => $vars['view'], + '#settings' => $vars['settings'], + ]; +} + +/** + * Views Slideshow: "previous" control. + */ +function template_preprocess_views_slideshow_controls_text_previous(&$vars) { + $vars['attributes']['class'][] = 'views_slideshow_controls_text_previous'; +} + +/** + * Views Slideshow: "pause" control. + */ +function template_preprocess_views_slideshow_controls_text_pause(&$vars) { + $vars['attributes']['class'][] = 'views_slideshow_controls_text_pause views-slideshow-controls-text-status-play'; + $vars['start_text'] = t('Pause'); +} + +/** + * Views Slideshow: "next" control. + */ +function template_preprocess_views_slideshow_controls_text_next(&$vars) { + $vars['attributes']['class'][] = 'views_slideshow_controls_text_next'; +} + +/** + * Views Slideshow: Slide Counter. + */ +function template_preprocess_views_slideshow_slide_counter_widget_render(&$vars) { + $slide = [ + '#theme' => $vars['view']->buildThemeFunctions('views_slideshow_slide_counter'), + '#vss_id' => $vars['vss_id'], + '#view' => $vars['view'], + '#settings' => $vars['settings'], + '#location' => $vars['location'], + '#rows' => $vars['rows'], + ]; + + return \Drupal::service('renderer')->render($slide); +} + +/** + * Views Slideshow: slide counter. + */ +function template_preprocess_views_slideshow_slide_counter(&$vars) { + $vars['attributes']['class'][] = 'views_slideshow_slide_counter'; + $vars['slide_count'] = count($vars['rows']); +} + +/** + * @} End of "defgroup vss_theme". + */