tr('Swiper'), 'documentation' => 'PluginSwiper', 'description' => tr('Embed swiper in content, support file galleries, files id and custom content'), 'prefs' => ['wikiplugin_swiper'], 'body' => tr('Enter custom slides data separated by "|". Wiki Syntax / HTML supported in slide text, to include wiki page in slide text use pluginInclude.title:Slide 1 title;text:HTML/Wiki Syntax Supported Slide 1 text;image:Slide Image URL;bgcolor:#colorcode;color: #color code for text | title:Slide 2 title;text:Slide 2 text;image:Slide Image URL;bgcolor:#colorcode '), 'iconname' => 'tv', 'introduced' => 19, 'tags' => 'basic', 'params' => [ 'fgalId' => [ 'required' => false, 'name' => tr('File Gallery ID'), 'description' => tr('Enter file gallery id for slider'), 'since' => '19', 'separator' => ':', 'profile_reference' => 'file_gallery', ], 'fileIds' => [ 'required' => false, 'name' => tr('File IDs'), 'description' => tr('List of IDs of images from the File Galleries separated by commas.'), 'filter' => 'striptags', 'default' => '', ], 'effect' => [ 'required' => false, 'name' => tr('Transition Effect'), 'description' => tr('Tranisition effect. Could be "slide", "fade", "cube", "coverflow" or "flip"'), 'filter' => 'word', 'default' => 'slide', 'since' => '19.0', 'options' => [ ['text' => 'Slide', 'value' => 'slide'], ['text' => 'Fade', 'value' => 'fade'], ['text' => 'Cube', 'value' => 'cube'], ['text' => 'Coverflow', 'value' => 'coverflow'], ['text' => 'Flip', 'value' => 'flip'], ], ], 'sliderPosition' => [ 'required' => false, 'name' => tr('Slider Placement on Page'), 'description' => tr('Placement of slider, above topbar, below topbar, above menus and content or inside content'), 'filter' => 'word', 'default' => '', 'since' => '19.0', 'options' => [ ['text' => tr(''), 'value' => ''], ['text' => tr('Inside Content'), 'value' => ''], ['text' => tr('Above top bar / Top of page'), 'value' => 'abovetopbar'], ['text' => tr('Above Content/Under top bar'), 'value' => 'undertopbar'] ], ], 'pagination' => [ 'required' => false, 'name' => tr('Pagination'), 'description' => tr('Slider pagination, default bullets'), 'filter' => 'word', 'default' => 'bullets', 'since' => '19.0', 'advanced' => true, 'options' => [ ['text' => '', 'value' => ''], ['text' => 'Off', 'value' => 'n'], ['text' => tr('Bullets'), 'value' => 'bullets'], ['text' => tr('Fraction'), 'value' => 'fraction'], ['text' => tr('Progress bar'), 'value' => 'progressbar'], ], ], 'navigation' => [ 'required' => false, 'name' => tr('Navigation'), 'description' => tr('Display navigation arrows'), 'filter' => 'alpha', 'default' => 'y', 'since' => '19.0', 'options' => [ ['text' => 'Yes', 'value' => 'y'], ['text' => 'No ', 'value' => 'n'], ], ], 'background' => [ 'required' => false, 'name' => tr('Slider Background Color'), 'description' => tr('Slider background color, enter color code for example #000'), 'since' => '19.0' ], 'parallaxBgImg' => [ 'required' => false, 'name' => tr('Slider Parallax Background Image'), 'description' => tr('Enter image url for parallax background behind swiper'), 'filter' => 'text', 'default' => '', 'advanced' => true, 'since' => '19.0' ], 'width' => [ 'required' => false, 'name' => tr('Width'), 'description' => tr('Enter width of slider in px, default 100%'), 'filter' => 'word', 'default' => '100%', 'since' => '19.0' ], 'height' => [ 'required' => false, 'name' => tr('Height'), 'description' => tr('Enter height of slider in px, default min height 100px, max height will adjust with content'), 'filter' => 'word', 'default' => '100px', 'since' => '19.0' ], 'titleColor' => [ 'required' => false, 'name' => tr('Slide title color'), 'description' => tr('Enter text color code of slide title, for example #ccc'), 'filter' => 'text', 'default' => '', 'since' => '19.0' ], 'titleSize' => [ 'required' => false, 'name' => tr('Title font size'), 'description' => tr('For example 42px, default 32 px'), 'filter' => 'word', 'default' => '32px', 'advanced' => true, 'since' => '19.0' ], 'descriptionColor' => [ 'required' => false, 'name' => tr('Slide description color'), 'description' => tr('Enter text color code of slide description, for example #ccc'), 'filter' => 'text', 'default' => '', 'since' => '19.0' ], 'descriptionSize' => [ 'required' => false, 'name' => tr('Description font size'), 'description' => tr('For example 24px, default 16 px'), 'filter' => 'word', 'default' => '16px', 'advanced' => true, 'since' => '19.0' ], 'slideContentBg' => [ 'required' => false, 'name' => tr('Slide content background'), 'description' => tr('Enter a valid CSS color code, or an rgba value if opacity is desired; for example: #000 or rgba(00, 00, 00, 0.5).'), 'filter' => 'text', 'default' => '', 'since' => '19.0' ], 'slideContentPostion' => [ 'required' => false, 'name' => tr('Slide content position'), 'description' => tr('Enter position for example top:20%;left:20% or bottom:20%;right:10%'), 'filter' => 'text', 'default' => 'top:20%;left:20%', 'since' => '19.0' ], 'autoPlay' => [ 'required' => false, 'name' => tr('Auto Play'), 'description' => tr('Autoplay slider, on by default'), 'filter' => 'alpha', 'default' => 'y', 'since' => '19.0', 'advanced' => true, 'options' => [ ['text' => 'Yes', 'value' => 'y'], ['text' => 'No ', 'value' => 'n'], ], ], 'autoPlayDelay' => [ 'required' => false, 'name' => tr('Auto Play Delay'), 'description' => tr('Time interval to pause before moving to next slide in seconds.'), 'filter' => 'digits', 'default' => '5', 'since' => '19.0' ], 'displayThumbnails' => [ 'required' => false, 'name' => tr('Display Thumbnails'), 'description' => tr('Show thumbnails under main slider'), 'filter' => 'alpha', 'default' => 'n', 'since' => '19.0', 'options' => [ ['text' => 'No', 'value' => 'n'], ['text' => 'Yes', 'value' => 'y'], ], ], 'speed' => [ 'required' => false, 'name' => tr('Speed'), 'description' => tr('Duration of transition between slides (in seconds)'), 'filter' => 'digits', 'default' => 300, 'advance' => true, 'since' => '19.0' ], 'autoHeight' => [ 'required' => false, 'name' => tr('Auto Height'), 'description' => tr('Set to true and slider wrapper will adopt its height to the height of the currently active slide'), 'filter' => 'alpha', 'default' => 'n', 'since' => '19.0', 'advanced' => true, 'options' => [ ['text' => 'No', 'value' => 'n'], ['text' => 'Yes', 'value' => 'y'], ], ], //Slides grid 'spaceBetween' => [ 'required' => false, 'name' => tr('Space Between'), 'description' => tr('Distance between slides in px.'), 'filter' => 'digits', 'default' => 0, 'advanced' => true, 'since' => '19.0' ], 'slidesPerView' => [ 'required' => false, 'name' => tr('Slides Per View'), 'description' => tr('Slides visible at the same time on slider\'s container. Coverflow transition works best with 3 slides per view'), 'filter' => 'digits', 'default' => 1, 'since' => '19.0' ], 'slidesPerViewMobile' => [ 'required' => false, 'name' => tr('Slides Per View Mobile Screen'), 'description' => tr('Slides visible at the same time on small screens'), 'filter' => 'digits', 'default' => 0, 'advanced' => true, 'since' => '19.0' ], 'slidesPerViewTab' => [ 'required' => false, 'name' => tr('Slides Per View Tablet'), 'description' => tr('Slides visible at the same time on low resolution tablets'), 'filter' => 'digits', 'default' => 0, 'advanced' => true, 'since' => '19.0' ], 'slidesPerColumn' => [ 'required' => false, 'name' => tr('Slides Per Column'), 'description' => tr('Number of slides per column, for multirow layout'), 'filter' => 'digits', 'default' => 1, 'advanced' => true, 'since' => '19.0' ], 'slidesPerColumnFill' => [ 'required' => false, 'name' => tr('Slides Per Column Fill'), 'description' => tr('Could be \'column\' or \'row\'. Defines how slides should fill rows, by column or by row'), 'filter' => 'word', 'default' => 'column', 'since' => '19.0', 'advanced' => true, 'options' => [ ['text' => 'Column', 'value' => 'column'], ['text' => 'Row', 'value' => 'row'], ], ], 'centeredSlides' => [ 'required' => false, 'name' => tr('Centered Slides'), 'description' => tr('If true, then active slide will be centered, not always on the left side.'), 'filter' => 'alpha', 'default' => 'y', 'since' => '19.0', 'advanced' => true, 'options' => [ ['text' => 'No', 'value' => 'n'], ['text' => 'Yes', 'value' => 'y'], ], ], 'slidesOffsetBefore' => [ 'required' => false, 'name' => tr('Slides Offset Before'), 'description' => tr('Add (in px) additional slide offset in the beginning of the container (before all slides)'), 'filter' => 'digits', 'default' => 0, 'advanced' => true, 'since' => '19.0' ], 'slidesOffsetAfter' => [ 'required' => false, 'name' => tr('Slides Offset After'), 'description' => tr('Add (in px) additional slide offset in the end of the container (after all slides)'), 'filter' => 'digits', 'default' => 0, 'advanced' => true, 'since' => '19.0' ], 'slideToClickedSlide' => [ 'required' => false, 'name' => tr('Slide To Clicked Slide'), 'description' => tr('Set to true and click on any slide will produce transition to this slide.'), 'filter' => 'word', 'default' => 'n', 'since' => '19.0', 'advanced' => true, 'options' => [ ['text' => 'No', 'value' => 'n'], ['text' => 'Yes', 'value' => 'y'], ], ], //freemode 'freeMode' => [ 'required' => false, 'name' => tr('Free Mode'), 'description' => tr('If true then slides will not have fixed positions.'), 'filter' => 'word', 'default' => 'n', 'since' => '19.0', 'advanced' => true, 'options' => [ ['text' => 'No', 'value' => 'n'], ['text' => 'Yes', 'value' => 'y'], ], ], //Images 'preloadImages' => [ 'required' => false, 'name' => tr('Preload Images'), 'description' => tr('When enabled Swiper will force to load all images.'), 'filter' => 'word', 'default' => 'y', 'since' => '19.0', 'advanced' => true, 'options' => [ ['text' => 'Yes', 'value' => 'y'], ['text' => 'No', 'value' => 'n'], ], ], 'updateOnImagesReady' => [ 'required' => false, 'name' => tr('Update On Images Ready'), 'description' => tr('When enabled Swiper will be reinitialized after all inner images ( tags) are loaded. Required preloadimages: true.'), 'filter' => 'word', 'default' => 'y', 'since' => '19.0', 'advanced' => true, 'options' => [ ['text' => 'Yes', 'value' => 'y'], ['text' => 'No', 'value' => 'n'], ], ], //Loop 'loop' => [ 'required' => false, 'name' => tr('Loop Slider'), 'description' => tr('Set to true to enable continuous loop mode (If you use it along with slidesperView: \'auto\' then you need to specify loopedslides parameter with amount of slides to loop (duplicate)).'), 'filter' => 'word', 'default' => 'n', 'since' => '19.0', 'options' => [ ['text' => 'Yes', 'value' => 'y'], ['text' => 'No', 'value' => 'n'], ], ], ] ]; } function wikiplugin_swiper($data, $params) { //checking for swiper existance if (! file_exists("vendor_bundled/vendor/nolimits4web/swiper/dist/js/swiper.min.js")) { Feedback::error(tr(' Please update composer to install required files')); return; } if ((! empty($params['fileIds']) && ! $params['fileIds']) && ! $params['fgalId'] && ! $data) { Feedback::error(tr('Paramaters missing: Please either select file gallery, give file ids or custom slide code in body.')); return; } static $uid = 0; $uid++; $defaults = []; $plugininfo = wikiplugin_swiper_info(); foreach ($plugininfo['params'] as $key => $param) { $defaults["$key"] = (! empty($param['default']) ? $param['default'] : ''); //separating digits filter parameters if (! empty($param['filter']) && $param['filter'] == "digits") { $swiperDigitsParams[] = $key; } } $params = array_merge($defaults, $params); if ($params['autoPlay'] != 'n') { $autoplayDelay = $params['autoPlayDelay'] * 1000; $autoPlay = 'autoplay: { delay: ' . $autoplayDelay . ', },'; } else { $autoPlay = ''; } if ($params['pagination'] != 'n') { $pagination = 'pagination: { el: \'.swiper-pagination\', clickable: true, type:"' . $params['pagination'] . '" },'; $paginationDiv = "
"; } else { $pagination = ""; $paginationDiv = ""; } if ($params['effect'] == "fade") { $fadeEffectCSS = "#swiper-container" . $uid . " .swiper-slide:not(.swiper-slide-active){opacity: 0 !important;}"; } else { $fadeEffectCSS = ''; } if ($params['navigation'] != 'n') { $navigation = 'navigation: { nextEl: \'#swiper' . $uid . '-button-next\', prevEl: \'#swiper' . $uid . '-button-prev\', },'; $navigationDiv = '
'; } else { $navigation = ""; $navigationDiv = ''; } $headerlib = TikiLib::lib('header'); $headerlib->add_jsfile('vendor_bundled/vendor/nolimits4web/swiper/dist/js/swiper.min.js'); $headerlib->add_cssfile('vendor_bundled/vendor/nolimits4web/swiper/dist/css/swiper.css'); $slides = explode("|", ($data ? $data : "")); $slidesHtml = ''; //checking if gallery is choosen $filegallib = TikiLib::lib('filegal'); if ($params['fgalId']) { $files = $filegallib->get_files(0, -1, '', '', $params['fgalId']); } if ($params['fileIds']) { $params['fileIds'] = explode(',', $params['fileIds']); foreach ($params['fileIds'] as $fileId) { $file = $filegallib->get_file($fileId); if (! is_null($file)) { $files['data'][] = $file; } } } if (! empty($files['data'])) { foreach ($files['data'] as $file) { $slidesHtml .= '
' . htmlentities($file['description']) . '
'; } } foreach ($slides as $slide) { if (trim($slide)) { //processing slides $slideArr = explode(";", $slide); if (count($slideArr) > 0) { foreach ($slideArr as $slideValue) { $slideData = explode(":", $slideValue, 2); $slideArr[trim($slideData[0])] = trim($slideData[1]); } } else { $slideArr['text'] = $slideArr[0]; //single attribute slide } (empty($slideArr['text']) || $slideArr['text'] == '') ? $slideArr['text'] = '' : $slideArr['text'] = '
' . TikiLib::lib('parser')->parse_data($slideArr['text'], ['is_html' => true, 'parse_wiki' => true]) . '
'; if (empty($slideArr['color'])) { $slideArr['color'] = ''; } if (empty($slideArr['bgcolor'])) { $slideArr['bgcolor'] = ''; } if (empty($slideArr['title'])) { $slideArr['title'] = ''; } $slidesHtml .= '

' . $slideArr['title'] . '

' . $slideArr['text'] . '
'; } } $swiperSettings = ''; $swiperParams = array('effect','autoHeight','speed','spaceBetween','slidesPerView','slidesPerColumn','slidesPerColumnFill','centeredSlides','slidesOffsetBefore','slidesOffsetAfter','loop','preloadImages','slideToClickedSlide','freeMode','updateOnImagesReady'); foreach ($swiperParams as $swiperParam) { $swiperSettings .= $swiperParam . ":"; if (! in_array($swiperParam, $swiperDigitsParams)) { $swiperSettings .= "'" . $params[$swiperParam] . "',"; } else { $params[$swiperParam] == '' ? $swiperSettings .= "0," : $swiperSettings .= $params[$swiperParam] . ","; } } $breakpoints = ''; if ($params['slidesPerViewMobile'] > 0 || $params['slidesPerViewTab'] > 0) { $slidesPerView = $params['slidesPerView'] == '' ? 1 : $params['slidesPerView']; $slidesPerViewTab = $params['slidesPerViewTab'] == '' ? $slidesPerView : $params['slidesPerViewTab']; //if not defined use default slides per view $slidesPerViewMobile = $params['slidesPerViewMobile'] == '' ? $slidesPerViewTab : $params['slidesPerViewMobile']; //if not defined use tablets slides per view $breakpoints = 'breakpointsInverse: true, breakpoints: { 320: { slidesPerView: ' . $slidesPerViewMobile . '},768: {slidesPerView: ' . $slidesPerViewTab . '},1024: {slidesPerView: ' . $slidesPerView . '}},'; } $swiperSettings = str_replace(array("'y'","'n'"), array("'true'","'false'"), $swiperSettings); $headerlib->add_css('#swiper-container' . $uid . ' {width: ' . $params['width'] . ';background:' . $params['background'] . ';margin-bottom:20px;} #swiper-container' . $uid . ' .swiper-slide {font-size:' . $params['descriptionSize'] . ';color:' . $params['descriptionColor'] . ';min-height:' . $params['height'] . ';text-align: center;width:100%;overflow:hidden;} .gallery-top {height: 80%;width: 100%;}.gallery-thumbs {height: 20%;box-sizing: border-box;padding: 10px 0;}.gallery-thumbs img {max-height:120px;height:120px;width:auto; margin-bottom:2%;cursor:pointer}.gallery-thumbs .swiper-slide {width: 25%; height: 100%;opacity: 0.4;}.gallery-thumbs .swiper-slide-active {opacity: 1;} #swiper-container' . $uid . ' .swiper-slide h1{font-size:' . $params['titleSize'] . ';color:' . $params['titleColor'] . '} .slide-content' . $uid . '{min-width:60%;position:absolute;' . $params['slideContentPostion'] . ';background:' . $params['slideContentBg'] . ';padding:1%;text-align:left} .parallax-bg { position: absolute;left: 0;top: 0;width: 130%;height: 100%;-webkit-background-size: cover;background-size: cover;background-position: center;} .swiper-slide img{max-width:100%}' . $fadeEffectCSS); $thumbnails = ''; $thumbclass = ''; $swiperOpts = ''; $thumbAfter = ''; $thumbsSettings = ''; if ($params['displayThumbnails'] == "y") { $thumbnails = ' ' ; $thumbclass = 'gallery-top'; $swiperOpts = 'var galleryThumbs' . $uid . ' = new Swiper("#gallery-thumbs' . $uid . '", {spaceBetween: 10, slidesPerView: 3, loopedSlides:1, loop:true, watchSlidesVisibility: true, watchSlidesProgress: true, slideToClickedSlide: true });'; $thumbsSettings = ''; //' thumbs: {swiper: galleryThumbs'.$uid.'},'; $thumbAfter = 'swiper' . $uid . '.controller.control = galleryThumbs' . $uid . ';galleryThumbs' . $uid . '.controller.control =swiper' . $uid . ';'; } $swiperOpts .= 'var swiper' . $uid . ' = new Swiper("#swiper-container' . $uid . '",{ ' . $swiperSettings . ' init:false, ' . $thumbsSettings . ' ' . $pagination . ' keyboard: { enabled: true, onlyInViewport: false, }, ' . $breakpoints . ' ' . $autoPlay . ' ' . $navigation . ' });' . $thumbAfter; if ($params['sliderPosition'] == 'abovetopbar') { $headerlib->add_css("#swiper-container" . $uid . "{visibility:hidden;}"); $swiperOpts .= 'var container=$(".container").first();$("#swiper-container' . $uid . '").insertBefore( container );$("#gallery-thumbs' . $uid . '").insertAfter( "#swiper-container' . $uid . '" );'; } elseif ($params['sliderPosition'] == 'undertopbar') { $headerlib->add_css("#swiper-container" . $uid . "{visibility:hidden;}"); $headerlib->add_js('$( document ).ready(function() { $("#swiper-container' . $uid . '").insertAfter( "#page-header" ); $("#gallery-thumbs' . $uid . '").insertAfter( "#swiper-container' . $uid . '" );})'); } //delaying initialization till window is fully loaded $swiperOpts .= 'setTimeout( function(){ $(window).trigger("resize") }, 100); $(window).resize(function(){swiper' . $uid . '.init(); $("#swiper-container' . $uid . '").css("visibility","visible"); });'; $headerlib->add_js( '$( document ).ready(function() {' . $swiperOpts . ';$("#swiper-container' . $uid . '").css("max-width",$("#swiper-container' . $uid . '").parent().width());})' ); $swiperCode = '
' . $slidesHtml . '
' . $paginationDiv . $navigationDiv . '
' . $thumbnails; return $swiperCode; }