annotate modules/contrib/views_slideshow/views_slideshow.theme.inc @ 19:fa3358dc1485 tip

Add ndrum files
author Chris Cannam
date Wed, 28 Aug 2019 13:14:47 +0100
parents c69a71b4f40f
children
rev   line source
Chris@5 1 <?php
Chris@5 2
Chris@5 3 /**
Chris@5 4 * @file
Chris@5 5 * The theme system, which controls the output of views slideshow.
Chris@5 6 */
Chris@5 7
Chris@5 8 /**
Chris@5 9 * @defgroup vss_templates Templates
Chris@5 10 * @{
Chris@5 11 * Slideshow and component templates.
Chris@5 12 *
Chris@5 13 * @see vss_theme
Chris@5 14 * @}
Chris@5 15 */
Chris@5 16
Chris@5 17 /**
Chris@5 18 * @defgroup vss_theme Theme Functions
Chris@5 19 * @{
Chris@5 20 * Theme processing and display generation.
Chris@5 21 *
Chris@5 22 * Most of the logic behind the generation of the slideshow is here.
Chris@5 23 *
Chris@5 24 * @see vss_templates
Chris@5 25 */
Chris@5 26
Chris@5 27 use Drupal\Component\Utility\Html;
Chris@5 28
Chris@5 29 /**
Chris@5 30 * Views Slideshow: slideshow.
Chris@5 31 */
Chris@5 32 function _views_slideshow_preprocess_views_view_slideshow(&$vars) {
Chris@5 33 $options = $vars['view']->style_plugin->options;
Chris@5 34 $vars['skin'] = 'default';
Chris@5 35 $vars['slideshow'] = '';
Chris@5 36 $main_frame_module = $options['slideshow_type'];
Chris@5 37
Chris@5 38 if (empty($main_frame_module)) {
Chris@5 39 // Get all slideshow types.
Chris@5 40 $typeManager = \Drupal::service('plugin.manager.views_slideshow.slideshow_type');
Chris@5 41 $types = $typeManager->getDefinitions();
Chris@5 42
Chris@5 43 if ($types) {
Chris@5 44 foreach ($types as $id => $definition) {
Chris@5 45 $main_frame_module = $id;
Chris@5 46 break;
Chris@5 47 }
Chris@5 48 }
Chris@5 49 }
Chris@5 50
Chris@5 51 // Make sure the main slideshow settings are defined before building the
Chris@5 52 // slideshow.
Chris@5 53 if (empty($main_frame_module)) {
Chris@5 54 drupal_set_message(
Chris@5 55 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.'),
Chris@5 56 'error'
Chris@5 57 );
Chris@5 58 }
Chris@5 59 elseif (empty($options[$main_frame_module])) {
Chris@5 60 drupal_set_message(t('The options for @module does not exists.', ['@module' => $main_frame_module]), 'error');
Chris@5 61 }
Chris@5 62 elseif (!empty($vars['rows'])) {
Chris@5 63 $settings = $options[$main_frame_module];
Chris@5 64 $view = $vars['view'];
Chris@5 65 $rows = $vars['rows'];
Chris@5 66
Chris@5 67 // The #name element is not available on Views edit pages.
Chris@5 68 $view_element_name = (isset($view->element['#name'])) ? $view->element['#name'] : '';
Chris@5 69 $vss_id = $view_element_name . '-' . $view->current_display;
Chris@5 70
Chris@5 71 // Give each slideshow a unique id if there are more than one on the page.
Chris@5 72 static $instances = [];
Chris@5 73 if (isset($instances[$vss_id])) {
Chris@5 74 $instances[$vss_id]++;
Chris@5 75 $vss_id .= "_" . $instances[$vss_id];
Chris@5 76 }
Chris@5 77 else {
Chris@5 78 $instances[$vss_id] = 1;
Chris@5 79 }
Chris@5 80
Chris@5 81 // Building our default methods.
Chris@5 82 $methods = [
Chris@5 83 'goToSlide' => [],
Chris@5 84 'nextSlide' => [],
Chris@5 85 'pause' => [],
Chris@5 86 'play' => [],
Chris@5 87 'previousSlide' => [],
Chris@5 88 'transitionBegin' => [],
Chris@5 89 'transitionEnd' => [],
Chris@5 90 ];
Chris@5 91
Chris@5 92 // Pull all widget info and slideshow info and merge them together.
Chris@5 93 $widgetTypeManager = \Drupal::service('plugin.manager.views_slideshow.widget_type');
Chris@5 94 $widgetTypes = $widgetTypeManager->getDefinitions();
Chris@5 95
Chris@5 96 $slideshowTypeManager = \Drupal::service('plugin.manager.views_slideshow.slideshow_type');
Chris@5 97 $slideshowTypes = $slideshowTypeManager->getDefinitions();
Chris@5 98
Chris@5 99 $addons = array_merge($widgetTypes, $slideshowTypes);
Chris@5 100
Chris@5 101 // Loop through all the addons and call their methods if needed.
Chris@5 102 foreach ($addons as $addon_id => $addon_info) {
Chris@5 103 foreach ($addon_info['accepts'] as $imp_key => $imp_value) {
Chris@5 104 if (is_array($imp_value)) {
Chris@5 105 $methods[$imp_key][] = \Drupal::service('views_slideshow.format_addons_name')->format($addon_id);
Chris@5 106 }
Chris@5 107 else {
Chris@5 108 $methods[$imp_value][] = \Drupal::service('views_slideshow.format_addons_name')->format($addon_id);
Chris@5 109 }
Chris@5 110 }
Chris@5 111 }
Chris@5 112
Chris@5 113 $vars['#attached']['library'][] = 'views_slideshow/widget_info';
Chris@5 114 $vars['#attached']['drupalSettings']['viewsSlideshow'][$vss_id] = [
Chris@5 115 'methods' => $methods,
Chris@5 116 'paused' => 0,
Chris@5 117 ];
Chris@5 118
Chris@5 119 // Process Skins.
Chris@5 120 $skinManager = \Drupal::service('plugin.manager.views_slideshow.slideshow_skin');
Chris@5 121 $skin = $skinManager->createInstance($options['slideshow_skin']);
Chris@5 122
Chris@5 123 $vars['skin'] = $skin->getClass();
Chris@5 124
Chris@5 125 foreach ($skin->getLibraries() as $library) {
Chris@5 126 $vars['#attached']['library'][] = $library;
Chris@5 127 }
Chris@5 128
Chris@5 129 // Process Widgets.
Chris@5 130 // Build weights.
Chris@5 131 $weight = [];
Chris@5 132 for ($i = 1; $i <= count($widgetTypes); $i++) {
Chris@5 133 $weight['top'][$i] = [];
Chris@5 134 $weight['bottom'][$i] = [];
Chris@5 135 }
Chris@5 136
Chris@5 137 $slide_count = count($view->result);
Chris@5 138 if ($slide_count && $vars['view']->style_plugin->options['slideshow_type'] == 'views_slideshow_cycle') {
Chris@5 139 $items_per_slide = $vars['view']->style_plugin->options['views_slideshow_cycle']['items_per_slide'];
Chris@5 140 $slide_count = $slide_count / $items_per_slide;
Chris@5 141 }
Chris@5 142 foreach ($widgetTypes as $widgetTypeId => $widgetTypeName) {
Chris@5 143 foreach ($weight as $location => $order) {
Chris@5 144 if ($options['widgets'][$location][$widgetTypeId]['enable']) {
Chris@5 145 // If hide on single slide and only a single slide skip rendering.
Chris@5 146 if ($options['widgets'][$location][$widgetTypeId]['hide_on_single_slide'] && $slide_count <= 1) {
Chris@5 147 continue;
Chris@5 148 }
Chris@5 149 $widgetWeight = ($options['widgets'][$location][$widgetTypeId]['weight'] > count($widgetTypes)) ? count($widgetTypes) : $options['widgets'][$location][$widgetTypeId]['weight'];
Chris@5 150
Chris@5 151 $weight[$location][$widgetWeight][] = [
Chris@5 152 'widgetId' => $widgetTypeId,
Chris@5 153 'widgetSettings' => $options['widgets'][$location][$widgetTypeId],
Chris@5 154 ];
Chris@5 155 }
Chris@5 156 }
Chris@5 157 }
Chris@5 158
Chris@5 159 // Build our widgets.
Chris@5 160 foreach ($weight as $location => $order) {
Chris@5 161 $vars[$location . '_widget_rendered'] = [];
Chris@5 162 foreach ($order as $widgets) {
Chris@5 163 if (is_array($widgets)) {
Chris@5 164 foreach ($widgets as $widgetData) {
Chris@5 165 $vars[$location . '_widget_rendered'][] = [
Chris@5 166 '#theme' => $view->buildThemeFunctions($widgetData['widgetId'] . '_widget_render'),
Chris@5 167 '#vss_id' => $vss_id,
Chris@5 168 '#view' => $view,
Chris@5 169 '#settings' => $widgetData['widgetSettings'],
Chris@5 170 '#location' => $location,
Chris@5 171 '#rows' => $rows,
Chris@5 172 ];
Chris@5 173 }
Chris@5 174 }
Chris@5 175 }
Chris@5 176 }
Chris@5 177
Chris@5 178 // Process Slideshow.
Chris@5 179 $slides = [
Chris@5 180 '#theme' => $view->buildThemeFunctions($main_frame_module . '_main_frame'),
Chris@5 181 '#vss_id' => $vss_id,
Chris@5 182 '#view' => $view,
Chris@5 183 '#settings' => $settings,
Chris@5 184 '#rows' => $rows,
Chris@5 185 ];
Chris@5 186
Chris@5 187 $vars['slideshow'] = [
Chris@5 188 '#theme' => $view->buildThemeFunctions('views_slideshow_main_section'),
Chris@5 189 '#vss_id' => $vss_id,
Chris@5 190 '#slides' => $slides,
Chris@5 191 '#plugin' => $main_frame_module,
Chris@5 192 ];
Chris@5 193 }
Chris@5 194 }
Chris@5 195
Chris@5 196 /**
Chris@5 197 * Views Slideshow: pager.
Chris@5 198 */
Chris@5 199 function template_preprocess_views_slideshow_pager_widget_render(&$vars) {
Chris@5 200 // Add JavaScript settings for the pager type.
Chris@5 201 $vars['#attached']['library'][] = 'views_slideshow/widget_info';
Chris@5 202 $vars['#attached']['drupalSettings']['viewsSlideshowPager'][$vars['vss_id']] = [
Chris@5 203 $vars['location'] => [
Chris@5 204 'type' => \Drupal::service('views_slideshow.format_addons_name')->format($vars['settings']['type']),
Chris@5 205 ],
Chris@5 206 ];
Chris@5 207
Chris@5 208 // Create some attributes.
Chris@5 209 $attributes['class'][] = 'widget_pager widget_pager_' . $vars['location'];
Chris@5 210 $attributes['id'] = 'widget_pager_' . $vars['location'] . '_' . $vars['vss_id'];
Chris@5 211
Chris@5 212 $pager = [
Chris@5 213 '#theme' => $vars['view']->buildThemeFunctions($vars['settings']['type']),
Chris@5 214 '#vss_id' => $vars['vss_id'],
Chris@5 215 '#view' => $vars['view'],
Chris@5 216 '#settings' => $vars['settings'],
Chris@5 217 '#location' => $vars['location'],
Chris@5 218 '#attributes' => $attributes,
Chris@5 219 ];
Chris@5 220
Chris@5 221 return \Drupal::service('renderer')->render($pager);
Chris@5 222 }
Chris@5 223
Chris@5 224 /**
Chris@5 225 * Theme pager fields.
Chris@5 226 */
Chris@5 227 function template_preprocess_views_slideshow_pager_fields(&$vars) {
Chris@5 228 // Add JavaScript settings for the field.
Chris@5 229 $vars['#attached']['library'][] = 'views_slideshow/widget_info';
Chris@5 230 $vars['#attached']['drupalSettings']['viewsSlideshowPagerFields'][$vars['vss_id']] = [
Chris@5 231 $vars['location'] => [
Chris@5 232 'activatePauseOnHover' => $vars['settings']['views_slideshow_pager_fields']['views_slideshow_pager_fields_hover'],
Chris@5 233 ],
Chris@5 234 ];
Chris@5 235
Chris@5 236 // Add hover intent library.
Chris@5 237 if ($vars['settings']['views_slideshow_pager_fields']['views_slideshow_pager_fields_hover']) {
Chris@5 238 $vars['#attached']['library'][] = 'views_slideshow/jquery_hoverIntent';
Chris@5 239 }
Chris@5 240
Chris@5 241 $vars['widget_id'] = $vars['attributes']['id'];
Chris@5 242 // Add our class to the wrapper.
Chris@5 243 $vars['attributes']['class'][] = 'views_slideshow_pager_field';
Chris@5 244
Chris@5 245 // Render all the fields unless there is only 1 slide and the user specified
Chris@5 246 // to hide them when there is only one slide.
Chris@5 247 $vars['rendered_field_items'] = [];
Chris@5 248 foreach ($vars['view']->result as $count => $node) {
Chris@5 249 $rendered_fields = [];
Chris@5 250 foreach ($vars['settings']['views_slideshow_pager_fields']['views_slideshow_pager_fields_fields'] as $field => $use) {
Chris@5 251 if ($use !== 0 && is_object($vars['view']->field[$field])) {
Chris@5 252 $rendered_fields[] = [
Chris@5 253 '#theme' => $vars['view']->buildThemeFunctions('views_slideshow_pager_field_field'),
Chris@5 254 '#view' => $vars['view'],
Chris@5 255 '#label' => $vars['view']->field[$field]->options['label'],
Chris@5 256 '#output' => $vars['view']->style_plugin->getField($count, $field),
Chris@5 257 '#css_identifier' => Html::cleanCssIdentifier($vars['view']->field[$field]->field),
Chris@5 258 ];
Chris@5 259 }
Chris@5 260 }
Chris@5 261
Chris@5 262 $vars['rendered_field_items'][] = [
Chris@5 263 '#theme' => $vars['view']->buildThemeFunctions('views_slideshow_pager_field_item'),
Chris@5 264 '#vss_id' => $vars['vss_id'],
Chris@5 265 '#item' => $rendered_fields,
Chris@5 266 '#count' => $count,
Chris@5 267 '#location' => $vars['location'],
Chris@5 268 '#length' => count($vars['view']->result),
Chris@5 269 ];
Chris@5 270 }
Chris@5 271 }
Chris@5 272
Chris@5 273 /**
Chris@5 274 * Views Slideshow: pager item.
Chris@5 275 */
Chris@5 276 function template_preprocess_views_slideshow_pager_field_item(&$vars) {
Chris@5 277 $vars['attributes']['class'][] = 'views_slideshow_pager_field_item';
Chris@5 278 $vars['attributes']['class'][] = ($vars['count'] % 2) ? 'views-row-even' : 'views-row-odd';
Chris@5 279 if ($vars['count'] == 0) {
Chris@5 280 $vars['attributes']['class'][] = 'views-row-first';
Chris@5 281 }
Chris@5 282 elseif ($vars['count'] == $vars['length'] - 1) {
Chris@5 283 $vars['attributes']['class'][] = 'views-row-last';
Chris@5 284 }
Chris@5 285 }
Chris@5 286
Chris@5 287 /**
Chris@5 288 * Views Slideshow: Bullets pager.
Chris@5 289 */
Chris@5 290 function template_preprocess_views_slideshow_pager_bullets(&$vars) {
Chris@5 291 $vars['#attached']['library'][] = 'views_slideshow/widget_info';
Chris@5 292 $vars['#attached']['library'][] = 'views_slideshow/pager_bullets';
Chris@5 293 $vars['#attached']['drupalSettings']['viewsSlideshowPagerFields'][$vars['vss_id']] = [
Chris@5 294 $vars['location'] => [
Chris@5 295 'activatePauseOnHover' => $vars['settings']['views_slideshow_pager_bullets']['views_slideshow_pager_bullets_hover'],
Chris@5 296 ],
Chris@5 297 ];
Chris@5 298
Chris@5 299 $vars['bullet_items'] = [
Chris@5 300 '#theme' => 'item_list',
Chris@5 301 '#items' => [],
Chris@5 302 '#attributes' => $vars['attributes'],
Chris@5 303 ];
Chris@5 304 $vars['bullet_items']['#attributes']['class'][] = 'views-slideshow-pager-bullets';
Chris@5 305 $vars['bullet_items']['#attributes']['class'][] = 'views_slideshow_pager_field';
Chris@5 306
Chris@5 307 for ($i = 0; $i < count($vars['view']->result); $i++) {
Chris@5 308 $vars['bullet_items']['#items'][] = [
Chris@5 309 '#markup' => $i,
Chris@5 310 '#wrapper_attributes' => [
Chris@5 311 'id' => 'views_slideshow_pager_field_item_' . $vars['location'] . '_' . $vars['vss_id'] . '_' . $i,
Chris@5 312 ],
Chris@5 313 ];
Chris@5 314 }
Chris@5 315 }
Chris@5 316
Chris@5 317 /**
Chris@5 318 * Views Slideshow: Controls.
Chris@5 319 */
Chris@5 320 function template_preprocess_views_slideshow_controls_widget_render(&$vars) {
Chris@5 321 // Add JavaScript settings for the controls type.
Chris@5 322 $vars['#attached']['library'][] = 'views_slideshow/widget_info';
Chris@5 323 $vars['#attached']['drupalSettings']['viewsSlideshowControls'][$vars['vss_id']] = [
Chris@5 324 $vars['location'] => [
Chris@5 325 'type' => \Drupal::service('views_slideshow.format_addons_name')->format($vars['settings']['type']),
Chris@5 326 ],
Chris@5 327 ];
Chris@5 328
Chris@5 329 $output = [
Chris@5 330 '#theme' => $vars['view']->buildThemeFunctions($vars['settings']['type']),
Chris@5 331 '#vss_id' => $vars['vss_id'],
Chris@5 332 '#view' => $vars['view'],
Chris@5 333 '#settings' => $vars['settings'],
Chris@5 334 '#location' => $vars['location'],
Chris@5 335 '#rows' => $vars['rows'],
Chris@5 336 ];
Chris@5 337
Chris@5 338 return \Drupal::service('renderer')->render($output);
Chris@5 339 }
Chris@5 340
Chris@5 341 /**
Chris@5 342 * The slideshow controls.
Chris@5 343 */
Chris@5 344 function template_preprocess_views_slideshow_controls_text(&$vars) {
Chris@5 345 $vars['#attached']['library'][] = 'views_slideshow/controls_text';
Chris@5 346
Chris@5 347 $vars['attributes']['class'][] = 'views_slideshow_controls_text';
Chris@5 348
Chris@5 349 $vars['rendered_control_previous'] = [
Chris@5 350 '#theme' => $vars['view']->buildThemeFunctions('views_slideshow_controls_text_previous'),
Chris@5 351 '#vss_id' => $vars['vss_id'],
Chris@5 352 '#view' => $vars['view'],
Chris@5 353 '#settings' => $vars['settings'],
Chris@5 354 ];
Chris@5 355
Chris@5 356 $vars['rendered_control_pause'] = [
Chris@5 357 '#theme' => $vars['view']->buildThemeFunctions('views_slideshow_controls_text_pause'),
Chris@5 358 '#vss_id' => $vars['vss_id'],
Chris@5 359 '#view' => $vars['view'],
Chris@5 360 '#settings' => $vars['settings'],
Chris@5 361 ];
Chris@5 362
Chris@5 363 $vars['rendered_control_next'] = [
Chris@5 364 '#theme' => $vars['view']->buildThemeFunctions('views_slideshow_controls_text_next'),
Chris@5 365 '#vss_id' => $vars['vss_id'],
Chris@5 366 '#view' => $vars['view'],
Chris@5 367 '#settings' => $vars['settings'],
Chris@5 368 ];
Chris@5 369 }
Chris@5 370
Chris@5 371 /**
Chris@5 372 * Views Slideshow: "previous" control.
Chris@5 373 */
Chris@5 374 function template_preprocess_views_slideshow_controls_text_previous(&$vars) {
Chris@5 375 $vars['attributes']['class'][] = 'views_slideshow_controls_text_previous';
Chris@5 376 }
Chris@5 377
Chris@5 378 /**
Chris@5 379 * Views Slideshow: "pause" control.
Chris@5 380 */
Chris@5 381 function template_preprocess_views_slideshow_controls_text_pause(&$vars) {
Chris@5 382 $vars['attributes']['class'][] = 'views_slideshow_controls_text_pause views-slideshow-controls-text-status-play';
Chris@5 383 $vars['start_text'] = t('Pause');
Chris@5 384 }
Chris@5 385
Chris@5 386 /**
Chris@5 387 * Views Slideshow: "next" control.
Chris@5 388 */
Chris@5 389 function template_preprocess_views_slideshow_controls_text_next(&$vars) {
Chris@5 390 $vars['attributes']['class'][] = 'views_slideshow_controls_text_next';
Chris@5 391 }
Chris@5 392
Chris@5 393 /**
Chris@5 394 * Views Slideshow: Slide Counter.
Chris@5 395 */
Chris@5 396 function template_preprocess_views_slideshow_slide_counter_widget_render(&$vars) {
Chris@5 397 $slide = [
Chris@5 398 '#theme' => $vars['view']->buildThemeFunctions('views_slideshow_slide_counter'),
Chris@5 399 '#vss_id' => $vars['vss_id'],
Chris@5 400 '#view' => $vars['view'],
Chris@5 401 '#settings' => $vars['settings'],
Chris@5 402 '#location' => $vars['location'],
Chris@5 403 '#rows' => $vars['rows'],
Chris@5 404 ];
Chris@5 405
Chris@5 406 return \Drupal::service('renderer')->render($slide);
Chris@5 407 }
Chris@5 408
Chris@5 409 /**
Chris@5 410 * Views Slideshow: slide counter.
Chris@5 411 */
Chris@5 412 function template_preprocess_views_slideshow_slide_counter(&$vars) {
Chris@5 413 $vars['attributes']['class'][] = 'views_slideshow_slide_counter';
Chris@5 414 $vars['slide_count'] = count($vars['rows']);
Chris@5 415 }
Chris@5 416
Chris@5 417 /**
Chris@5 418 * @} End of "defgroup vss_theme".
Chris@5 419 */