492 lines
		
	
	
		
			13 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			492 lines
		
	
	
		
			13 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
| <?php
 | |
| 
 | |
| 
 | |
| namespace Nextend\SmartSlider3\Slider;
 | |
| 
 | |
| 
 | |
| use Exception;
 | |
| use Nextend\Framework\Asset\AssetManager;
 | |
| use Nextend\Framework\Asset\Css\Css;
 | |
| use Nextend\Framework\Asset\Js\Js;
 | |
| use Nextend\Framework\Data\Data;
 | |
| use Nextend\Framework\Pattern\MVCHelperTrait;
 | |
| use Nextend\Framework\Settings;
 | |
| use Nextend\Framework\View\Html;
 | |
| use Nextend\SmartSlider3\Application\Model\ModelSliders;
 | |
| use Nextend\SmartSlider3\Renderable\AbstractRenderable;
 | |
| use Nextend\SmartSlider3\Slider\Base\PlatformSliderTrait;
 | |
| use Nextend\SmartSlider3\Slider\SliderType\AbstractSliderTypeCss;
 | |
| use Nextend\SmartSlider3\Slider\SliderType\AbstractSliderTypeFrontend;
 | |
| use Nextend\SmartSlider3\Slider\SliderType\SliderTypeFactory;
 | |
| 
 | |
| 
 | |
| class Slider extends AbstractRenderable {
 | |
| 
 | |
|     use PlatformSliderTrait, MVCHelperTrait;
 | |
| 
 | |
|     const LOAD_STATE_NONE = 0;
 | |
|     const LOAD_STATE_SLIDER = 1;
 | |
|     const LOAD_STATE_SLIDES = 2;
 | |
|     const LOAD_STATE_ALL = 3;
 | |
| 
 | |
|     protected $loadState;
 | |
| 
 | |
|     protected $isAdminArea = false;
 | |
| 
 | |
|     public $manifestData = array(
 | |
|         'generator' => array()
 | |
|     );
 | |
| 
 | |
|     protected $isGroup = false;
 | |
| 
 | |
|     public $hasError = false;
 | |
| 
 | |
|     public $sliderId = 0;
 | |
| 
 | |
|     public $cacheId = '';
 | |
| 
 | |
|     public $isFrame = false;
 | |
| 
 | |
|     /** @var  Data */
 | |
|     public $data;
 | |
| 
 | |
|     public $disableResponsive = false;
 | |
| 
 | |
|     protected $parameters = array(
 | |
|         'disableResponsive' => false,
 | |
|         'sliderData'        => array(),
 | |
|         'slidesData'        => array(),
 | |
|         'generatorData'     => array()
 | |
|     );
 | |
| 
 | |
|     public $fontSize = 16;
 | |
| 
 | |
|     /**
 | |
|      * @var Slides
 | |
|      */
 | |
|     protected $slidesBuilder;
 | |
| 
 | |
|     protected $cache = false;
 | |
| 
 | |
|     public static $_identifier = 'n2-ss';
 | |
| 
 | |
|     /** @var Slide[] */
 | |
|     public $staticSlides = array();
 | |
| 
 | |
|     /** @var  AbstractSliderTypeFrontend */
 | |
|     public $sliderType;
 | |
| 
 | |
|     /**
 | |
|      * @var AbstractSliderTypeCss
 | |
|      */
 | |
|     public $assets;
 | |
| 
 | |
|     /**
 | |
|      * @var string contains already escaped data
 | |
|      */
 | |
|     public $staticHtml = '';
 | |
| 
 | |
|     private $sliderRow;
 | |
| 
 | |
|     private $fallbackId;
 | |
| 
 | |
|     public $exposeSlideData = array(
 | |
|         'title'         => true,
 | |
|         'description'   => false,
 | |
|         'thumbnail'     => false,
 | |
|         'lightboxImage' => false
 | |
|     );
 | |
| 
 | |
|     /**
 | |
|      * @var Data
 | |
|      */
 | |
|     public $params;
 | |
| 
 | |
|     /**
 | |
|      * @var Slide
 | |
|      */
 | |
|     protected $activeSlide;
 | |
| 
 | |
|     /**
 | |
|      * Slider constructor.
 | |
|      *
 | |
|      * @param MVCHelperTrait $MVCHelper
 | |
|      * @param                $sliderId
 | |
|      * @param                $parameters
 | |
|      * @param                $isAdminArea
 | |
|      */
 | |
|     public function __construct($MVCHelper, $sliderId, $parameters, $isAdminArea = false) {
 | |
|         $this->loadState = self::LOAD_STATE_NONE;
 | |
| 
 | |
|         $this->isAdminArea = $isAdminArea;
 | |
| 
 | |
|         $this->setMVCHelper($MVCHelper);
 | |
| 
 | |
|         $this->initPlatformSlider();
 | |
| 
 | |
|         $this->sliderId = $sliderId;
 | |
| 
 | |
|         $this->setElementId();
 | |
| 
 | |
|         $this->cacheId = static::getCacheId($this->sliderId);
 | |
| 
 | |
|         $this->parameters = array_merge($this->parameters, $parameters);
 | |
| 
 | |
|         $this->disableResponsive = $this->parameters['disableResponsive'];
 | |
|     }
 | |
| 
 | |
| 
 | |
|     public function setElementId() {
 | |
|         $this->elementId = self::$_identifier . '-' . $this->sliderId;
 | |
|     }
 | |
| 
 | |
|     public static function getCacheId($sliderId) {
 | |
|         return self::$_identifier . '-' . $sliderId;
 | |
|     }
 | |
| 
 | |
|     public function getAlias() {
 | |
|         return $this->data->get('alias', '');
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * @throws Exception
 | |
|      */
 | |
|     public function initSlider() {
 | |
|         if ($this->loadState < self::LOAD_STATE_SLIDER) {
 | |
| 
 | |
|             $slidersModel = new ModelSliders($this->MVCHelper);
 | |
|             $sliderRow    = $slidersModel->get($this->sliderId);
 | |
| 
 | |
|             if (empty($sliderRow)) {
 | |
|                 $this->hasError = true;
 | |
|                 throw new Exception('Slider does not exists!');
 | |
|             } else {
 | |
|                 if (!$this->isAdminArea && $sliderRow['slider_status'] != 'published') {
 | |
|                     $this->hasError = true;
 | |
|                     throw new Exception('Slider is not published!');
 | |
|                 }
 | |
| 
 | |
|                 if (!empty($this->parameters['sliderData'])) {
 | |
|                     $sliderData         = $this->parameters['sliderData'];
 | |
|                     $sliderRow['title'] = $sliderData['title'];
 | |
|                     unset($sliderData['title']);
 | |
|                     $sliderRow['type'] = $sliderData['type'];
 | |
|                     unset($sliderData['type']);
 | |
| 
 | |
|                     $this->data   = new Data($sliderRow);
 | |
|                     $this->params = new SliderParams($this->sliderId, $sliderRow['type'], $sliderData);
 | |
|                 } else {
 | |
|                     $this->data   = new Data($sliderRow);
 | |
|                     $this->params = new SliderParams($this->sliderId, $sliderRow['type'], $sliderRow['params'], true);
 | |
|                 }
 | |
| 
 | |
|                 switch ($sliderRow['type']) {
 | |
|                     case 'group':
 | |
|                         throw new Exception(n2_('Groups are only available in the Pro version.'));
 | |
|                     
 | |
|                         $this->isGroup = true;
 | |
|                         break;
 | |
|                 }
 | |
|             }
 | |
| 
 | |
|             $this->loadState = self::LOAD_STATE_SLIDER;
 | |
|         }
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * @throws Exception
 | |
|      */
 | |
|     public function initSlides() {
 | |
|         if ($this->loadState < self::LOAD_STATE_SLIDES) {
 | |
| 
 | |
|             $this->initSlider();
 | |
| 
 | |
|             if (!$this->isGroup) {
 | |
|                 $this->slidesBuilder = new Slides($this);
 | |
| 
 | |
|                 $this->slidesBuilder->initSlides($this->parameters['slidesData'], $this->parameters['generatorData']);
 | |
|             }
 | |
| 
 | |
|             $this->loadState = self::LOAD_STATE_SLIDES;
 | |
|         }
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * @throws Exception
 | |
|      */
 | |
|     public function initAll() {
 | |
|         if ($this->loadState < self::LOAD_STATE_ALL) {
 | |
| 
 | |
|             $this->initSlides();
 | |
|             $this->loadState = self::LOAD_STATE_ALL;
 | |
|         }
 | |
|     }
 | |
| 
 | |
| 
 | |
|     private function setSliderIDFromAlias($slider) {
 | |
|         if (is_numeric($slider)) {
 | |
|             return $slider;
 | |
|         } else {
 | |
|             $slidersModel = new ModelSliders($this->MVCHelper);
 | |
|             $slider       = $slidersModel->getByAlias($slider);
 | |
| 
 | |
|             return $slider['id'];
 | |
|         }
 | |
| 
 | |
|     }
 | |
| 
 | |
|     private function loadSlider() {
 | |
| 
 | |
|         $this->sliderType = SliderTypeFactory::createFrontend($this->data->get('type', 'simple'), $this);
 | |
|         $defaults         = $this->sliderType->getDefaults();
 | |
| 
 | |
|         $this->params->fillDefault($defaults);
 | |
|         $this->sliderType->limitParams($this->params);
 | |
| 
 | |
|         if (!$this->isGroup) {
 | |
|             $this->features = new FeatureManager($this);
 | |
|         }
 | |
| 
 | |
|         return true;
 | |
|     }
 | |
| 
 | |
|     public function getNextCacheRefresh() {
 | |
|         if ($this->isGroup) {
 | |
|             return $this->sliderType->getNextCacheRefresh();
 | |
|         }
 | |
| 
 | |
|         return $this->slidesBuilder->getNextCacheRefresh();
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * @return string
 | |
|      * @throws Exception
 | |
|      */
 | |
|     public function render() {
 | |
|         if ($this->loadState < self::LOAD_STATE_ALL) {
 | |
|             throw new Exception('Load state not reached all!');
 | |
|         }
 | |
| 
 | |
|         if (!$this->loadSlider()) {
 | |
|             return false;
 | |
|         }
 | |
| 
 | |
|         if (!$this->isGroup) {
 | |
|             if (!$this->hasSlides()) {
 | |
|                 $this->slidesBuilder->addDummySlides();
 | |
|             }
 | |
| 
 | |
|             if (!$this->getActiveSlide()) {
 | |
|                 $slides = $this->getSlides();
 | |
|                 $this->setActiveSlide($slides[0]);
 | |
|             }
 | |
| 
 | |
|             $this->getActiveSlide()
 | |
|                  ->setFirst();
 | |
|         }
 | |
| 
 | |
|         $this->assets = SliderTypeFactory::createCss($this->data->get('type', 'simple'), $this);
 | |
| 
 | |
|         if (!$this->isGroup) {
 | |
| 
 | |
|             $this->slidesBuilder->prepareRender();
 | |
| 
 | |
|             $this->renderStaticSlide();
 | |
|         }
 | |
|         $slider = $this->sliderType->render($this->assets);
 | |
| 
 | |
|         $slider = str_replace('n2-ss-0', $this->elementId, $slider);
 | |
| 
 | |
|         $rockedLoader = false;
 | |
|         if (!$this->isAdmin) {
 | |
|             $rocketAttributes = '';
 | |
| 
 | |
|             $loadingType = $this->params->get('loading-type');
 | |
|             if ($loadingType == 'afterOnLoad') {
 | |
|                 $rocketAttributes .= ' data-loading-type="' . $loadingType . '"';
 | |
|             } else if ($loadingType == 'afterDelay') {
 | |
| 
 | |
|                 $delay = max(0, intval($this->params->get('delay'), 0));
 | |
|                 if ($delay > 0) {
 | |
|                     $rocketAttributes .= ' data-loading-type="' . $loadingType . '"';
 | |
|                     $rocketAttributes .= ' data-loading-delay="' . $delay . '"';
 | |
|                 }
 | |
|             }
 | |
| 
 | |
|             if (!empty($rocketAttributes)) {
 | |
|                 $slider       = '<template id="' . $this->elementId . '_t"' . $rocketAttributes . '>' . $slider . '</template>';
 | |
|                 $rockedLoader = true;
 | |
|             }
 | |
|         }
 | |
|         if (!$this->isGroup) {
 | |
|             $slider = $this->features->translateUrl->replaceUrl($slider) . HTML::tag('ss3-loader', array(), '');
 | |
| 
 | |
|             $slider = $this->features->align->renderSlider($slider, $this->assets->sizes['width']);
 | |
|             $slider = $this->features->margin->renderSlider($slider);
 | |
| 
 | |
| 
 | |
|             Css::addInline($this->features->translateUrl->replaceUrl($this->sliderType->getStyle()), $this->elementId);
 | |
|             /**
 | |
|              * On WordPress, we need to add the slider's Inline JavaScript into the Head.
 | |
|              *
 | |
|              * @see SSDEV-3540
 | |
|              */
 | |
|             Js::addInline($this->sliderType->getScript());
 | |
|         }
 | |
| 
 | |
|         $html = '';
 | |
| 
 | |
|         $classes = array(
 | |
|             'n2-section-smartslider',
 | |
|             'fitvidsignore',
 | |
|             $this->params->get('classes', '')
 | |
|         );
 | |
| 
 | |
|         if (intval($this->params->get('clear-both', 1))) {
 | |
|             $classes[] = 'n2_clear';
 | |
|         }
 | |
| 
 | |
| 
 | |
|         $sliderAttributes = array(
 | |
|             'class'     => implode(' ', $classes),
 | |
|             'data-ssid' => $this->sliderId
 | |
|         );
 | |
| 
 | |
|         if ($this->fallbackId) {
 | |
|             $sliderAttributes['data-fallback-for'] = $this->fallbackId;
 | |
|         }
 | |
| 
 | |
|         $ariaLabel = $this->params->get('aria-label', 'Slider');
 | |
|         if (!empty($ariaLabel)) {
 | |
|             $sliderAttributes['tabindex']   = '0';
 | |
|             $sliderAttributes['role']       = 'region';
 | |
|             $sliderAttributes['aria-label'] = $ariaLabel;
 | |
|         }
 | |
| 
 | |
|         $alias = $this->getAlias();
 | |
|         if (!empty($alias)) {
 | |
|             $sliderAttributes['data-alias'] = $alias;
 | |
| 
 | |
|             if (intval($this->params->get('alias-id', 0))) {
 | |
|                 $sliderAttributes['id'] = $alias;
 | |
| 
 | |
|                 if (intval($this->params->get('alias-slideswitch-scroll', 1))) {
 | |
|                     $slideAnchorHTML = '';
 | |
|                     $slideCount      = $this->getSlidesCount();
 | |
|                     for ($i = 1; $i <= $slideCount; $i++) {
 | |
|                         $slideAnchorHTML .= Html::tag('div', array(
 | |
|                             'id' => $alias . '-' . $i
 | |
|                         ));
 | |
|                     }
 | |
| 
 | |
|                     $slider = $slideAnchorHTML . $slider;
 | |
|                 }
 | |
|             }
 | |
|         }
 | |
| 
 | |
|         $sizes = $this->assets->sizes;
 | |
| 
 | |
|         if ($rockedLoader && !empty($sizes['width']) && !empty($sizes['height'])) {
 | |
|             $sliderAttributes['style'] = 'height:' . $sizes['height'] . 'px;';
 | |
|         }
 | |
| 
 | |
|         $html .= Html::tag("div", $sliderAttributes, $slider);
 | |
| 
 | |
|         AssetManager::$image->add($this->images);
 | |
| 
 | |
|         $needDivWrap = false;
 | |
| 
 | |
|         if (!$this->isGroup && !$this->isAdmin && $this->features->responsive->forceFull) {
 | |
|             $html        = Html::tag("ss3-force-full-width", array(
 | |
|                 'data-overflow-x'          => $this->features->responsive->forceFullOverflowX,
 | |
|                 'data-horizontal-selector' => $this->features->responsive->forceFullHorizontalSelector
 | |
|             ), $html);
 | |
|             $needDivWrap = true;
 | |
|         }
 | |
| 
 | |
|         if ($needDivWrap) {
 | |
|             $attr = array();
 | |
|             if ($this->params->get('clear-both', 1)) {
 | |
|                 $attr['class'] = 'n2_clear';
 | |
|             }
 | |
| 
 | |
|             return Html::tag("div", $attr, $html);
 | |
|         }
 | |
| 
 | |
|         return $html;
 | |
|     }
 | |
| 
 | |
|     public function addStaticSlide($slide) {
 | |
|         $this->staticSlides[] = $slide;
 | |
|     }
 | |
| 
 | |
|     public function renderStaticSlide() {
 | |
|         $this->staticHtml = '';
 | |
|         if (count($this->staticSlides)) {
 | |
|             for ($i = 0; $i < count($this->staticSlides); $i++) {
 | |
|                 $this->staticHtml .= $this->staticSlides[$i]->getAsStatic();
 | |
|             }
 | |
|         }
 | |
|     }
 | |
| 
 | |
|     public static function removeShortcode($content) {
 | |
|         $content = preg_replace('/smartslider3\[([0-9]+)\]/', '', $content);
 | |
|         $content = preg_replace('/\[smartslider3 slider="([0-9]+)"\]/', '', $content);
 | |
|         $content = preg_replace('/\[smartslider3 slider=([0-9]+)\]/', '', $content);
 | |
| 
 | |
|         return $content;
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * @return Slide
 | |
|      */
 | |
|     public function getActiveSlide() {
 | |
|         return $this->activeSlide;
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * @param Slide $activeSlide
 | |
|      */
 | |
|     public function setActiveSlide($activeSlide) {
 | |
|         $this->activeSlide = $activeSlide;
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * @return Slide[]
 | |
|      */
 | |
|     public function getSlides() {
 | |
|         return $this->slidesBuilder->getSlides();
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * @return bool
 | |
|      */
 | |
|     public function hasSlides() {
 | |
|         if ($this->isGroup) {
 | |
|             return true;
 | |
|         }
 | |
| 
 | |
|         return $this->slidesBuilder->hasSlides();
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * @return int
 | |
|      */
 | |
|     public function getSlidesCount() {
 | |
|         if ($this->isGroup) {
 | |
|             return 0;
 | |
|         }
 | |
| 
 | |
|         return $this->slidesBuilder->getSlidesCount();
 | |
|     }
 | |
| 
 | |
|     public function isGroup() {
 | |
|         $this->initSlider();
 | |
| 
 | |
|         return $this->isGroup;
 | |
|     }
 | |
| 
 | |
|     public function isLegacyFontScale() {
 | |
|         return !!$this->params->get('legacy-font-scale', 0);
 | |
|     }
 | |
| } |