acf
This commit is contained in:
292
plugins/system/nrframework/NRFramework/Widgets/Slideshow.php
Normal file
292
plugins/system/nrframework/NRFramework/Widgets/Slideshow.php
Normal file
@ -0,0 +1,292 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* @author Tassos Marinos <info@tassos.gr>
|
||||
* @link https://www.tassos.gr
|
||||
* @copyright Copyright © 2024 Tassos All Rights Reserved
|
||||
* @license GNU GPLv3 <http://www.gnu.org/licenses/gpl.html> or later
|
||||
*/
|
||||
|
||||
namespace NRFramework\Widgets;
|
||||
|
||||
defined('_JEXEC') or die;
|
||||
|
||||
use \NRFramework\Helpers\Widgets\Gallery as GalleryHelper;
|
||||
use NRFramework\Mimes;
|
||||
use NRFramework\File;
|
||||
use NRFramework\Image;
|
||||
use Joomla\CMS\Factory;
|
||||
|
||||
class Slideshow extends Widget
|
||||
{
|
||||
/**
|
||||
* Widget default options
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
protected $widget_options = [
|
||||
// Slides per view
|
||||
'slides_per_view' => [
|
||||
'desktop' => 1
|
||||
],
|
||||
|
||||
// Space between slides in px
|
||||
'space_between_slides' => [
|
||||
'desktop' => 10
|
||||
],
|
||||
|
||||
// Enable Infinite Loop
|
||||
'infinite_loop' => false,
|
||||
|
||||
// Enable Keyboard Control
|
||||
'keyboard_control' => false,
|
||||
|
||||
/**
|
||||
* Set the ordering.
|
||||
*
|
||||
* Available values:
|
||||
* - default
|
||||
* - alphabetical
|
||||
* - reverse_alphabetical
|
||||
* - random
|
||||
*/
|
||||
'ordering' => 'default',
|
||||
|
||||
/**
|
||||
* The transition effect.
|
||||
*
|
||||
* Available values:
|
||||
* - slide
|
||||
* - fade
|
||||
* - cube
|
||||
* - coverflow
|
||||
* - flip
|
||||
*/
|
||||
'transition_effect' => 'slide',
|
||||
|
||||
// Enable Autoplay
|
||||
'autoplay' => false,
|
||||
|
||||
// Autoplay delay
|
||||
'autoplay_delay' => 3000,
|
||||
|
||||
// Enable autoplay circular progress
|
||||
'autoplay_progress' => false,
|
||||
|
||||
// Show thumbnails below the slideshow
|
||||
'show_thumbnails' => false,
|
||||
|
||||
// Set whether to show arrows in the thumbnails slider
|
||||
'show_thumbnails_arrows' => false,
|
||||
|
||||
/**
|
||||
* Navigation controls.
|
||||
*
|
||||
* Accepted values:
|
||||
* - arrows
|
||||
* - dots
|
||||
* - arrows_dots
|
||||
*/
|
||||
'nav_controls' => false,
|
||||
|
||||
// Theme color
|
||||
'theme_color' => '#007aff',
|
||||
|
||||
// Set whether to display a lightbox
|
||||
'lightbox' => false,
|
||||
|
||||
// Set the module key to display whenever we are viewing a single item's lightbox, appearing after the image
|
||||
'module' => '',
|
||||
|
||||
// Options
|
||||
'options' => []
|
||||
];
|
||||
|
||||
public function __construct($options = [])
|
||||
{
|
||||
parent::__construct($options);
|
||||
|
||||
$this->prepare();
|
||||
|
||||
$this->prepareItems();
|
||||
|
||||
$this->setOrdering();
|
||||
|
||||
$this->setCSSVars();
|
||||
}
|
||||
|
||||
private function prepare()
|
||||
{
|
||||
if ($this->options['lightbox'])
|
||||
{
|
||||
$this->options['css_class'] .= ' lightbox';
|
||||
}
|
||||
|
||||
$options = [
|
||||
'transition_effect' => $this->options['transition_effect'],
|
||||
'infinite_loop' => $this->options['infinite_loop'],
|
||||
'keyboard_control' => $this->options['keyboard_control'],
|
||||
'autoplay' => $this->options['autoplay'],
|
||||
'autoplay_delay' => $this->options['autoplay_delay'],
|
||||
'autoplay_progress' => $this->options['autoplay_progress'],
|
||||
'show_thumbnails' => $this->options['show_thumbnails'],
|
||||
'show_thumbnails_arrows' => $this->options['show_thumbnails_arrows'],
|
||||
'lightbox' => $this->options['lightbox'],
|
||||
'breakpoints' => \NRFramework\Helpers\Responsive::getBreakpointsSettings(),
|
||||
'slides_per_view' => $this->options['slides_per_view'],
|
||||
'space_between_slides' => $this->getSpaceBetweenSlides(),
|
||||
'nav_controls' => $this->options['nav_controls']
|
||||
];
|
||||
|
||||
$this->options['options'] = $options;
|
||||
}
|
||||
|
||||
private function getSpaceBetweenSlides()
|
||||
{
|
||||
$space_between_slides = $this->options['space_between_slides'];
|
||||
|
||||
if (is_array($space_between_slides))
|
||||
{
|
||||
foreach ($space_between_slides as $key => &$value)
|
||||
{
|
||||
$value = \NRFramework\Helpers\Controls\Control::getCSSValue($value['value']);
|
||||
}
|
||||
}
|
||||
|
||||
return $space_between_slides;
|
||||
}
|
||||
|
||||
/**
|
||||
* Prepares the items.
|
||||
*
|
||||
* - Sets the thumbnails image dimensions.
|
||||
* - Assures caption property exist.
|
||||
*
|
||||
* @return mixed
|
||||
*/
|
||||
private function prepareItems()
|
||||
{
|
||||
if (!is_array($this->options['items']) || !count($this->options['items']))
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
$smartTagsInstance = \NRFramework\SmartTags::getInstance();
|
||||
|
||||
foreach ($this->options['items'] as $key => &$item)
|
||||
{
|
||||
// Initialize image atts
|
||||
$item['img_atts'] = '';
|
||||
|
||||
// Initializes caption if none given
|
||||
if (!isset($item['caption']))
|
||||
{
|
||||
$item['caption'] = '';
|
||||
}
|
||||
|
||||
if (!isset($item['alt']) || empty($item['alt']))
|
||||
{
|
||||
$item['alt'] = !empty($item['caption']) ? mb_substr($item['caption'], 0, 100) : pathinfo($item['url'], PATHINFO_FILENAME);
|
||||
}
|
||||
|
||||
// Replace Smart Tags in alt
|
||||
$item['alt'] = $smartTagsInstance->replace($item['alt']);
|
||||
|
||||
// Ensure a thumbnail is given
|
||||
if (!isset($item['thumbnail_url']))
|
||||
{
|
||||
// If no thumbnail is given, set it to the full image
|
||||
$item['thumbnail_url'] = $item['url'];
|
||||
continue;
|
||||
}
|
||||
|
||||
// If the thumbnail size for this item is given, set the image attributes
|
||||
if (isset($item['thumbnail_size']))
|
||||
{
|
||||
$item['img_atts'] = 'width="' . $item['thumbnail_size']['width'] . '" height="' . $item['thumbnail_size']['height'] . '"';
|
||||
continue;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets the ordering of the gallery.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
private function setOrdering()
|
||||
{
|
||||
switch ($this->options['ordering']) {
|
||||
case 'random':
|
||||
shuffle($this->options['items']);
|
||||
break;
|
||||
case 'alphabetical':
|
||||
usort($this->options['items'], [$this, 'compareByThumbnailASC']);
|
||||
break;
|
||||
case 'reverse_alphabetical':
|
||||
usort($this->options['items'], [$this, 'compareByThumbnailDESC']);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Compares thumbnail file names in ASC order
|
||||
*
|
||||
* @param array $a
|
||||
* @param array $b
|
||||
*
|
||||
* @return bool
|
||||
*/
|
||||
private function compareByThumbnailASC($a, $b)
|
||||
{
|
||||
return strcmp(basename($a['thumbnail']), basename($b['thumbnail']));
|
||||
}
|
||||
|
||||
/**
|
||||
* Compares thumbnail file names in DESC order
|
||||
*
|
||||
* @param array $a
|
||||
* @param array $b
|
||||
*
|
||||
* @return bool
|
||||
*/
|
||||
private function compareByThumbnailDESC($a, $b)
|
||||
{
|
||||
return strcmp(basename($b['thumbnail']), basename($a['thumbnail']));
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets the CSS variables.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
private function setCSSVars()
|
||||
{
|
||||
if (!$this->options['load_css_vars'])
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
$controls = [
|
||||
[
|
||||
'property' => '--slideshow-slides-per-view',
|
||||
'value' => $this->options['slides_per_view']
|
||||
],
|
||||
[
|
||||
'property' => '--slideshow-space-between-slides',
|
||||
'value' => $this->options['space_between_slides']
|
||||
]
|
||||
];
|
||||
|
||||
$selector = '.nrf-widget.tf-slideshow-wrapper.' . $this->options['id'];
|
||||
|
||||
$controlsInstance = new \NRFramework\Controls\Controls(null, $selector);
|
||||
|
||||
if (!$controlsCSS = $controlsInstance->generateCSS($controls))
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
Factory::getDocument()->addStyleDeclaration($controlsCSS);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user