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

706 lines
22 KiB
PHP

<?php
namespace Nextend\SmartSlider3\Application\Model;
use Nextend\Framework\Data\Data;
use Nextend\Framework\Database\Database;
use Nextend\Framework\Misc\Base64;
use Nextend\Framework\Misc\Str;
use Nextend\Framework\Model\AbstractModelTable;
use Nextend\Framework\Request\Request;
use Nextend\SmartSlider3\Application\Helper\HelperSliderChanged;
use Nextend\SmartSlider3\Renderable\Component\AbstractComponent;
use Nextend\SmartSlider3\Renderable\Component\ComponentCol;
use Nextend\SmartSlider3\Renderable\Component\ComponentContent;
use Nextend\SmartSlider3\Renderable\Component\ComponentLayer;
use Nextend\SmartSlider3\Renderable\Component\ComponentRow;
use Nextend\SmartSlider3\SlideBuilder\BuilderComponentLayer;
use Nextend\SmartSlider3\SlideBuilder\BuilderComponentSlide;
use Nextend\SmartSlider3\Slider\Slide;
use Nextend\SmartSlider3\Slider\Slider;
use Nextend\SmartSlider3\SmartSlider3Info;
use Nextend\SmartSlider3Pro\Renderable\Component\ComponentGroup;
class ModelSlides extends AbstractModelTable {
protected function createConnectorTable() {
return Database::getTable('nextend2_smartslider3_slides');
}
public function get($id) {
return $this->table->findByPk($id);
}
public function getAll($sliderid = 0, $where = '') {
return Database::queryAll('SELECT * FROM ' . $this->getTableName() . ' WHERE slider = ' . $sliderid . ' ' . $where . ' ORDER BY ordering', false, "assoc", null);
}
public function createQuickImage($image, $sliderId) {
$parameters = array(
'background-type' => 'image',
'backgroundImage' => $image['image']
);
if (!empty($image['alt'])) {
$parameters['backgroundAlt'] = $image['alt'];
}
$slideID = $this->create($sliderId, $image['title'], array(), $image['image'], $parameters, array(
'description' => $image['description']
));
$this->markChanged($sliderId);
return $slideID;
}
public function createQuickEmptySlide($sliderId) {
$parameters = array(
'background-type' => 'color'
);
$slideID = $this->create($sliderId, 'Slide', array(), '', $parameters);
$this->markChanged($sliderId);
return $slideID;
}
public function createQuickStaticOverlay($sliderId) {
$parameters = array(
'static-slide' => 1
);
$slideID = $this->create($sliderId, n2_('Static overlay'), array(), '', $parameters);
$this->markChanged($sliderId);
return $slideID;
}
public function createQuickPost($post, $sliderId) {
$data = new Data($post);
$title = $this->removeFourByteChars($data->get('title'));
$description = $this->removeFourByteChars($data->get('description'));
$slideBuilder = new BuilderComponentSlide(array(
'title' => $title,
'description' => $description,
'thumbnail' => $data->get('image'),
'background-type' => 'image',
'backgroundImage' => $data->get('image'),
'backgroundImageOpacity' => 20,
'backgroundColor' => '000000FF'
));
$slideBuilder->content->set(array(
'desktopportraitpadding' => '10|*|100|*|10|*|100|*|px',
'mobileportraitpadding' => '10|*|10|*|10|*|10|*|px'
));
if ($title) {
$heading = new BuilderComponentLayer($slideBuilder->content, 'heading');
$heading->item->set(array(
'heading' => '{name/slide}',
'font' => Base64::encode('{"data":[{"extra":"","color":"ffffffff","size":"48||px","tshadow":"0|*|0|*|0|*|000000ff","afont":"Roboto,Arial","lineheight":"1.5","bold":0,"italic":0,"underline":0,"align":"inherit","letterspacing":"normal","wordspacing":"normal","texttransform":"none"},{"extra":""}]}'),
));
}
if ($description) {
$text = new BuilderComponentLayer($slideBuilder->content, 'text');
$text->set(array(
'desktopportraitmargin' => '0|*|0|*|20|*|0|*|px',
));
$text->item->set(array(
'content' => '{description/slide}',
'font' => Base64::encode('{"data":[{"extra":"","color":"ffffffff","size":"18||px","tshadow":"0|*|0|*|0|*|000000ff","afont":"Roboto,Arial","lineheight":"1.5","bold":0,"italic":0,"underline":0,"align":"inherit","letterspacing":"normal","wordspacing":"normal","texttransform":"none"},{"extra":""}]}'),
));
}
$link = $data->get('link');
if (!empty($link)) {
$buttonLayer = new BuilderComponentLayer($slideBuilder->content, 'button');
$buttonLayer->item->set(array(
'content' => n2_('Read more'),
'link' => $link . '|*|_self'
));
}
$row = $this->convertSlideDataToDatabaseRow($slideBuilder->getData(), $sliderId);
$slideID = $this->create($row['slider'], $row['title'], $row['slide'], $row['thumbnail'], $row['params'], array(
'description' => $row['description'],
'published' => $row['published'],
'publish_up' => $row['publish_up'],
'publish_down' => $row['publish_down']
));
$this->markChanged($sliderId);
return $slideID;
}
public function createSimpleEditAdd($postData, $sliderId) {
$data = new Data($postData);
$title = $data->get('title', '');
$description = $data->get('description', '');
$slideBuilder = new BuilderComponentSlide(array(
'title' => $title,
'description' => $description,
'thumbnailType' => $data->get('thumbnailType', ''),
'thumbnail' => $data->get('backgroundImage', ''),
'background-type' => 'image',
'backgroundImage' => $data->get('backgroundImage', ''),
'backgroundImageOpacity' => 100,
'backgroundColor' => '000000FF',
'href' => $data->get('href', ''),
'href-target' => $data->get('href-target', '')
));
$slideBuilder->content->set(array(
'desktopportraitpadding' => '10|*|100|*|10|*|100|*|px',
'mobileportraitpadding' => '10|*|10|*|10|*|10|*|px'
));
$videoUrl = $data->get('video', '');
if (!empty($videoUrl)) {
preg_match('/^.*(youtu.be\/|v\/|u\/\w\/|embed\/|watch\?v=|\&v=)([^#\&\?]*).*/', $videoUrl, $matches);
if (!empty($matches)) {
/**
* YouTube
*/
$thumbnail = 'https://i.ytimg.com/vi/' . $matches[2] . '/hqdefault.jpg';
$slideBuilder->set('thumbnail', $thumbnail);
$youtubeLayer = new BuilderComponentLayer($slideBuilder->content, 'youtube');
$youtubeLayer->item->set(array(
'code' => $matches[2],
'youtubeurl' => $videoUrl,
'image' => $thumbnail
));
} else {
preg_match('/https?:\/\/(?:www\.|player\.)?vimeo.com\/(?:channels\/(?:\w+\/)?|groups\/([^\/]*)\/videos\/|album\/(\d+)\/video\/|video\/|)(\d+)(?:$|\/|\?)/', $videoUrl, $matches);
if (!empty($matches)) {
/**
* Vimeo
*/
$vimeoLayer = new BuilderComponentLayer($slideBuilder->content, 'vimeo');
$vimeoLayer->item->set(array(
'vimeourl' => $videoUrl
));
} else {
/**
* MP4
*/
$mp4Layer = new BuilderComponentLayer($slideBuilder->content, 'video');
$mp4Layer->item->set(array(
'video_mp4' => $videoUrl
));
}
}
}
/*
if ($title) {
$heading = new BuilderComponentLayer($slideBuilder->content, 'heading');
$heading->item->set(array(
'heading' => '{name/slide}'
));
}
*/
$row = $this->convertSlideDataToDatabaseRow($slideBuilder->getData(), $sliderId);
$slideID = $this->create($row['slider'], $row['title'], $row['slide'], $row['thumbnail'], $row['params'], array(
'description' => $row['description'],
'published' => $row['published'],
'publish_up' => $row['publish_up'],
'publish_down' => $row['publish_down']
));
$this->markChanged($sliderId);
return $slideID;
}
public function import($row, $sliderId) {
if (!$row['params']->has('version')) {
/**
* We must set the missing empty version to allow upgrade of the old slides
*/
$row['params']->set('version', '');
}
return $this->create($sliderId, $row['title'], $row['slide'], $row['thumbnail'], $row['params']->toArray(), array(
'description' => $row['description'],
'published' => $row['published'],
'publish_up' => $row['publish_up'],
'publish_down' => $row['publish_down'],
'first' => $row['first'],
'ordering' => $row['ordering'],
'generator_id' => $row['generator_id']
));
}
private function create($sliderID, $title, $layers, $thumbnail, $params = array(), $optional = array()) {
if (!isset($optional['ordering'])) {
$optional['ordering'] = $this->getNextOrdering($sliderID);
}
if (!isset($params['version'])) {
$params['version'] = SmartSlider3Info::$version;
}
$data = array_merge(array(
'description' => '',
'first' => 0,
'published' => 1,
'publish_up' => '1970-01-01 00:00:00',
'publish_down' => '1970-01-01 00:00:00',
'generator_id' => 0
), $optional, array(
'title' => $title,
'slide' => json_encode($layers, JSON_UNESCAPED_SLASHES),
'thumbnail' => $thumbnail,
'params' => json_encode($params, JSON_UNESCAPED_SLASHES),
'slider' => $sliderID
));
$this->table->insert($data);
return $this->table->insertId();
}
/**
* @param $sliderId
* @param int $generatorID
* @param $slide
*
* @return bool
*/
public function createSlideWithGenerator($sliderId, $generatorID, $slide) {
$row = $this->convertSlideDataToDatabaseRow($slide, $sliderId);
$slideId = $this->create($row['slider'], $row['title'], $row['slide'], $row['thumbnail'], $row['params'], array(
'description' => $row['description'],
'published' => $row['published'],
'publish_up' => $row['publish_up'],
'publish_down' => $row['publish_down'],
'generator_id' => $generatorID
));
$this->markChanged($sliderId);
return $slideId;
}
/**
* @param int $slideID
* @param string $slide
* @param string $guides
*
* @return bool
*/
public function save($slideID, $slide, $guides) {
$slideData = json_decode(Base64::decode($slide), true);
$slideData['guides'] = $guides;
$row = $this->convertSlideDataToDatabaseRow($slideData);
$this->table->update(array(
'title' => $row['title'],
'slide' => json_encode($row['slide'], JSON_UNESCAPED_SLASHES),
'description' => $row['description'],
'thumbnail' => $row['thumbnail'],
'published' => $row['published'],
'publish_up' => $row['publish_up'],
'publish_down' => $row['publish_down'],
'params' => json_encode($row['params'], JSON_UNESCAPED_SLASHES)
), array('id' => $slideID));
$this->markChanged(Request::$REQUEST->getInt('sliderid'));
return true;
}
public function saveSimple($slideID, $title, $description, $params) {
$this->table->update(array(
'title' => $title,
'description' => $description,
'params' => json_encode($params, JSON_UNESCAPED_SLASHES)
), array('id' => $slideID));
}
/**
* Updates the params field of the slide;
*
* @param $id
* @param $params
*/
public function updateSlideParams($id, $params) {
$this->table->update(array(
'params' => json_encode($params)
), array('id' => $id));
}
public function delete($id) {
$slide = $this->get($id);
if ($slide['generator_id'] > 0) {
$slidesWithSameGenerator = $this->getAll($slide['slider'], 'AND generator_id = ' . intval($slide['generator_id']));
if (count($slidesWithSameGenerator) == 1) {
$generatorModel = new ModelGenerator($this);
$generatorModel->delete($slide['generator_id']);
}
}
$this->table->deleteByAttributes(array(
"id" => intval($id)
));
$this->markChanged($slide['slider']);
}
/**
* @param int $id
* @param bool $maintainOrdering
* @param bool|int $targetSliderId
*
* @return int The new slide ID;
*/
public function copyTo($id, $maintainOrdering = false, $targetSliderId = false) {
$row = $this->get($id);
unset($row['id']);
$row['first'] = 0;
if ($targetSliderId === false || $row['slider'] == $targetSliderId) {
/**
* Copy the slide to the same slider
*/
$this->shiftSlideOrdering($row['slider'], $row['ordering']);
} else {
/**
* Copy the slide to another slider
*/
$row['slider'] = $targetSliderId;
if (!$maintainOrdering) {
$row['ordering'] = 0;
}
}
if (!empty($row['generator_id'])) {
$generatorModel = new ModelGenerator($this);
$row['generator_id'] = $generatorModel->duplicate($row['generator_id']);
}
$row['slide'] = json_encode(AbstractComponent::translateUniqueIdentifier(json_decode($row['slide'], true)), JSON_UNESCAPED_SLASHES);
$this->table->insert($row);
$id = $this->table->insertId();
$this->markChanged($row['slider']);
return $id;
}
public function setTitle($id, $title) {
$slide = $this->get($id);
$this->table->update(array(
"title" => $title
), array(
"id" => $id
));
$this->markChanged($slide['slider']);
}
public function first($id) {
$slide = $this->get($id);
$this->table->update(array(
"first" => 0
), array(
"slider" => $slide['slider']
));
$this->table->update(array(
"first" => 1
), array(
"id" => $id
));
$this->markChanged($slide['slider']);
}
public function publish($id) {
$this->markChanged(Request::$REQUEST->getInt('sliderid'));
return $this->table->update(array(
"published" => 1
), array("id" => intval($id)));
}
public function unPublish($id) {
$this->table->update(array(
"published" => 0
), array(
"id" => intval($id)
));
$this->markChanged(Request::$REQUEST->getInt('sliderid'));
}
public function convertToSlide($id) {
$slide = $this->get($id);
$data = new Data($slide['params'], true);
$data->set('static-slide', 0);
$this->table->update(array(
"params" => $data->toJSON()
), array(
"id" => intval($id)
));
$this->markChanged($slide['slider']);
}
public function deleteBySlider($sliderid) {
$slides = $this->getAll($sliderid);
foreach ($slides as $slide) {
$this->delete($slide['id']);
}
$this->markChanged($sliderid);
}
/**
* @param $sliderid
* @param $ids
*
* @return bool|int
*/
public function order($sliderid, $ids) {
if (is_array($ids) && count($ids) > 0) {
$i = 0;
foreach ($ids as $id) {
$id = intval($id);
if ($id > 0) {
$this->table->update(array(
'ordering' => $i + 1,
), array(
"id" => $id,
"slider" => $sliderid
));
$i++;
}
}
$this->markChanged($sliderid);
return $i;
}
return false;
}
private function markChanged($sliderid) {
$helper = new HelperSliderChanged($this);
$helper->setSliderChanged($sliderid, 1);
}
public function convertDynamicSlideToSlides($slideId) {
$slideData = $this->get($slideId);
if ($slideData['generator_id'] > 0) {
$sliderObj = new Slider($this, $slideData['slider'], array(), true);
$rootSlide = new Slide($sliderObj, $slideData);
$rootSlide->initGenerator(array());
$slides = $rootSlide->expandSlide();
$this->shiftSlideOrdering($slideData['slider'], $slideData['ordering'], count($slides));
$firstUsed = false;
$i = 1;
foreach ($slides as $slide) {
$row = $slide->getRow();
$row['title'] = Str::substr($row['title'], 0, 200);
$row['description'] = Str::substr($row['description'], 0, 2000);
// set the proper ordering
$row['ordering'] += $i;
if ($row['first']) {
// Make sure to mark only one slide as start slide
if ($firstUsed) {
$row['first'] = 0;
} else {
$firstUsed = true;
}
}
$this->table->insert($row);
$i++;
}
Database::query("UPDATE {$this->getTableName()} SET published = 0, first = 0 WHERE id = :id", array(
":id" => $slideData['id']
));
return count($slides);
} else {
return false;
}
}
public static function prepareSample(&$layers) {
for ($i = 0; $i < count($layers); $i++) {
if (isset($layers[$i]['type'])) {
switch ($layers[$i]['type']) {
case 'content':
ComponentContent::prepareSample($layers[$i]);
break;
case 'row':
ComponentRow::prepareSample($layers[$i]);
break;
case 'col':
ComponentCol::prepareSample($layers[$i]);
break;
default:
ComponentLayer::prepareSample($layers[$i]);
}
} else {
ComponentLayer::prepareSample($layers[$i]);
}
}
}
public function convertSlideDataToDatabaseRow($slideData, $sliderID = false) {
$slideData['version'] = SmartSlider3Info::$version;
$publish_up = '1970-01-01 00:00:00';
if (isset($slideData['publish_up'])) {
if ($slideData['publish_up'] != '0000-00-00 00:00:00') {
$publish_up = date('Y-m-d H:i:s', strtotime($slideData['publish_up']));
} else {
$publish_up = '1970-01-01 00:00:00';
}
}
$publish_down = '1970-01-01 00:00:00';
if (isset($slideData['publish_down'])) {
if ($slideData['publish_down'] != '0000-00-00 00:00:00') {
$publish_down = date('Y-m-d H:i:s', strtotime($slideData['publish_down']));
} else {
$publish_down = '1970-01-01 00:00:00';
}
}
$row = array(
'title' => $slideData['title'],
'slide' => '',
'description' => $slideData['description'],
'thumbnail' => $slideData['thumbnail'],
'published' => (isset($slideData['published']) ? $slideData['published'] : 1),
'publish_up' => $publish_up,
'publish_down' => $publish_down
);
if ($sliderID !== false) {
$row['slider'] = $sliderID;
}
$row['slide'] = $slideData['layers'];
if (isset($slideData['first'])) {
$row['first'] = intval($slideData['first']);
}
if (isset($slideData['generator_id']) && $slideData['generator_id'] > 0) {
$row['generator_id'] = intval($slideData['generator_id']);
}
unset($slideData['title']);
unset($slideData['layers']);
unset($slideData['description']);
unset($slideData['thumbnail']);
unset($slideData['published']);
unset($slideData['first']);
unset($slideData['publish_up']);
unset($slideData['publish_down']);
unset($slideData['ordering']);
unset($slideData['generator_id']);
$row['params'] = $slideData;
return $row;
}
private function removeFourByteChars($text) {
return preg_replace('/[\x{10000}-\x{10FFFF}]/u', "\xEF\xBF\xBD", $text);
}
/**
* @param int $sliderID
*
* @return int
*/
private function getNextOrdering($sliderID) {
$query = "SELECT MAX(ordering) AS ordering FROM " . $this->getTableName() . " WHERE slider = :id";
$result = Database::queryRow($query, array(
":id" => intval($sliderID)
));
if (isset($result['ordering'])) {
return $result['ordering'] + 1;
}
return 1;
}
/**
* @param int $sliderID
* @param int $offset
* @param int $slidesCount
*/
private function shiftSlideOrdering($sliderID, $offset, $slidesCount = 1) {
// Shift the afterwards slides with the slides count
Database::query("UPDATE {$this->getTableName()} SET ordering = ordering + " . $slidesCount . " WHERE slider = :sliderid AND ordering > :ordering", array(
":sliderid" => intval($sliderID),
":ordering" => intval($offset)
), '');
}
}