wp_back/wp-content/plugins/smart-slider-3/Nextend/SmartSlider3/Slider/Slider.php
2024-05-20 15:37:46 +03:00

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