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);
 | 
						|
    }
 | 
						|
} |