253 lines
7.5 KiB
PHP
253 lines
7.5 KiB
PHP
<?php
|
|
|
|
|
|
namespace Nextend\SmartSlider3\Slider;
|
|
|
|
|
|
use Nextend\SmartSlider3\Application\Model\ModelSlides;
|
|
|
|
class Slides {
|
|
|
|
/**
|
|
* @var Slider
|
|
*/
|
|
protected $slider;
|
|
|
|
/**
|
|
* @var Slide[]
|
|
*/
|
|
protected $slides = array();
|
|
|
|
/**
|
|
* @var Slide[]
|
|
*/
|
|
protected $allEnabledSlides = array();
|
|
|
|
protected $maximumSlideCount = 10000;
|
|
|
|
/**
|
|
* Slides constructor.
|
|
*
|
|
* @param Slider $slider
|
|
*/
|
|
public function __construct($slider) {
|
|
$this->slider = $slider;
|
|
|
|
$this->maximumSlideCount = intval($slider->params->get('maximumslidecount', 10000));
|
|
}
|
|
|
|
|
|
public function initSlides($slidesData = array(), $generatorData = array()) {
|
|
|
|
$this->loadSlides($slidesData);
|
|
|
|
$this->makeSlides($slidesData, $generatorData);
|
|
|
|
return $this->slides;
|
|
}
|
|
|
|
/**
|
|
* @param Slide[] $slides
|
|
*/
|
|
protected function legacyFixOnlyStaticOverlays(&$slides) {
|
|
|
|
if (count($slides)) {
|
|
$hasNonStaticSlide = false;
|
|
foreach ($slides as $slide) {
|
|
if (!$slide->isStatic()) {
|
|
$hasNonStaticSlide = true;
|
|
}
|
|
}
|
|
|
|
if (!$hasNonStaticSlide) {
|
|
foreach ($slides as $slide) {
|
|
$slide->forceNonStatic();
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
protected function makeSlides($slidesData, $extendGenerator = array()) {
|
|
|
|
$slides = &$this->slides;
|
|
|
|
if (count($slides)) {
|
|
for ($i = 0; $i < count($slides); $i++) {
|
|
$slides[$i]->initGenerator($extendGenerator);
|
|
}
|
|
|
|
for ($i = count($slides) - 1; $i >= 0; $i--) {
|
|
if ($slides[$i]->hasGenerator()) {
|
|
array_splice($slides, $i, 1, $slides[$i]->expandSlide());
|
|
}
|
|
}
|
|
|
|
$this->legacyFixOnlyStaticOverlays($slides);
|
|
|
|
$staticSlides = array();
|
|
for ($j = count($slides) - 1; $j >= 0; $j--) {
|
|
$slide = $slides[$j];
|
|
if ($slide->isStatic()) {
|
|
$staticSlides[] = $slide;
|
|
$this->slider->addStaticSlide($slide);
|
|
array_splice($slides, $j, 1);
|
|
}
|
|
}
|
|
|
|
$randomize = intval($this->slider->params->get('randomize', 0));
|
|
$randomizeFirst = intval($this->slider->params->get('randomizeFirst', 0));
|
|
$randomizeCache = intval($this->slider->params->get('randomize-cache', 0));
|
|
if (!$randomizeCache && $randomize) {
|
|
shuffle($slides);
|
|
}
|
|
|
|
$reverse = intval($this->slider->params->get('reverse-slides', 0));
|
|
if ($reverse) {
|
|
$slides = array_reverse($slides);
|
|
}
|
|
|
|
if ($this->maximumSlideCount > 0) {
|
|
$mustShowSlides = array();
|
|
if (!empty($slidesData)) {
|
|
for ($i = count($slides) - 1; $i >= 0; $i--) {
|
|
if (isset($slidesData[$slides[$i]->id])) {
|
|
$mustShowSlides[] = $slides[$i];
|
|
}
|
|
}
|
|
}
|
|
array_splice($slides, $this->maximumSlideCount);
|
|
|
|
if (!empty($mustShowSlides)) {
|
|
for ($i = count($mustShowSlides) - 1; $i >= 0; $i--) {
|
|
if (!in_array($mustShowSlides[$i], $slides)) {
|
|
array_pop($slides);
|
|
} else {
|
|
array_splice($mustShowSlides, $i, 1);
|
|
}
|
|
}
|
|
$slides = array_merge($slides, $mustShowSlides);
|
|
}
|
|
|
|
}
|
|
|
|
if (count($slides)) {
|
|
if (!$randomizeCache && $randomizeFirst) {
|
|
$this->slider->setActiveSlide($slides[mt_rand(0, count($slides) - 1)]);
|
|
} else {
|
|
for ($i = 0; $i < count($slides); $i++) {
|
|
if ($slides[$i]->isFirst()) {
|
|
$this->slider->setActiveSlide($slides[$i]);
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
if (count($slides) == 1 && $this->slider->params->get('autoplay', 0) && $this->slider->data->get('type') === 'simple' && !$slides[0]->hasGenerator()) {
|
|
$slides[1] = clone $slides[0];
|
|
}
|
|
|
|
for ($i = 0; $i < count($slides); $i++) {
|
|
$slides[$i]->setPublicID($i + 1);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
public function addDummySlides() {
|
|
/**
|
|
* When the currently edited slide is static and there is not other slide, we create a temporary empty slide
|
|
*/
|
|
$slidesModel = new ModelSlides($this->slider);
|
|
|
|
$images = array(
|
|
'$ss3-frontend$/images/placeholder/placeholder1.png',
|
|
'$ss3-frontend$/images/placeholder/placeholder2.png'
|
|
);
|
|
for ($i = 0; $i < count($images); $i++) {
|
|
|
|
$this->slides[] = $this->createSlide($slidesModel->convertSlideDataToDatabaseRow(array(
|
|
'id' => $i,
|
|
'title' => 'Slide #' . $i,
|
|
'layers' => '[]',
|
|
'description' => '',
|
|
'thumbnail' => $images[$i],
|
|
'published' => 1,
|
|
'publish_up' => '0000-00-00 00:00:00',
|
|
'publish_down' => '0000-00-00 00:00:00',
|
|
'backgroundImage' => $images[$i],
|
|
"backgroundFocusX" => 50,
|
|
"backgroundFocusY" => 100,
|
|
'slide-background-type' => 'image'
|
|
)));
|
|
}
|
|
|
|
$this->makeSlides(array());
|
|
}
|
|
|
|
protected function loadSlides($extend) {
|
|
|
|
$where = $this->slidesWhereQuery();
|
|
|
|
$slidesModel = new ModelSlides($this->slider);
|
|
$slideRows = $slidesModel->getAll($this->slider->sliderId, $where);
|
|
|
|
for ($i = 0; $i < count($slideRows); $i++) {
|
|
if (isset($extend[$slideRows[$i]['id']])) {
|
|
$slideRows[$i] = array_merge($slideRows[$i], $extend[$slideRows[$i]['id']]);
|
|
}
|
|
$slide = $this->createSlide($slideRows[$i]);
|
|
if ($slide->isVisible()) {
|
|
$this->slides[] = $slide;
|
|
}
|
|
$this->allEnabledSlides[$i] = $slide;
|
|
}
|
|
}
|
|
|
|
protected function createSlide($slideRow) {
|
|
return new Slide($this->slider, $slideRow);
|
|
}
|
|
|
|
protected function slidesWhereQuery() {
|
|
return " AND published = 1 ";
|
|
}
|
|
|
|
public function getNextCacheRefresh() {
|
|
$earlier = 2145916800;
|
|
for ($i = 0; $i < count($this->allEnabledSlides); $i++) {
|
|
$earlier = min($this->allEnabledSlides[$i]->nextCacheRefresh, $earlier);
|
|
}
|
|
|
|
return $earlier;
|
|
}
|
|
|
|
/**
|
|
* @return Slide[]
|
|
*/
|
|
public function getSlides() {
|
|
return $this->slides;
|
|
}
|
|
|
|
/**
|
|
* @return int
|
|
*/
|
|
public function getSlidesCount() {
|
|
return count($this->slides);
|
|
}
|
|
|
|
/**
|
|
* @return bool
|
|
*/
|
|
public function hasSlides() {
|
|
return !empty($this->slides);
|
|
}
|
|
|
|
public function prepareRender() {
|
|
|
|
for ($i = 0; $i < count($this->slides); $i++) {
|
|
$this->slides[$i]->setIndex($i);
|
|
$this->slides[$i]->prepare();
|
|
$this->slides[$i]->setSlidesParams();
|
|
}
|
|
}
|
|
} |