wp_blog/wp-content/plugins/revslider/inc_php/revslider_slider.class.php
2020-01-02 23:15:16 +07:00

896 lines
22 KiB
PHP

<?php
class RevSlider extends UniteElementsBaseRev{
const VALIDATE_NUMERIC = "numeric";
const VALIDATE_EMPTY = "empty";
const FORCE_NUMERIC = "force_numeric";
private $id;
private $title;
private $alias;
private $arrParams;
private $arrSlides = null;
public function __construct(){
parent::__construct();
}
/**
*
* validate that the slider is inited. if not - throw error
*/
private function validateInited(){
if(empty($this->id))
UniteFunctionsRev::throwError("The slider is not inited!");
}
/**
*
* init slider by db data
*
*/
public function initByDBData($arrData){
$this->id = $arrData["id"];
$this->title = $arrData["title"];
$this->alias = $arrData["alias"];
$params = $arrData["params"];
$params = (array)json_decode($params);
$this->arrParams = $params;
}
/**
*
* init the slider object by database id
*/
public function initByID($sliderID){
UniteFunctionsRev::validateNumeric($sliderID,"Slider ID");
$sliderID = $this->db->escape($sliderID);
try{
$sliderData = $this->db->fetchSingle(GlobalsRevSlider::$table_sliders,"id=$sliderID");
}catch(Exception $e){
UniteFunctionsRev::throwError("Slider with ID: $sliderID Not Found");
}
$this->initByDBData($sliderData);
}
/**
*
* init slider by alias
*/
public function initByAlias($alias){
$alias = $this->db->escape($alias);
try{
$where = "alias='$alias'";
$sliderData = $this->db->fetchSingle(GlobalsRevSlider::$table_sliders,$where);
}catch(Exception $e){
$arrAliases = $this->getAllSliderAliases();
$strAliases = "";
if(!empty($arrAliases))
$strAliases = "'".implode("' or '", $arrAliases)."'";
$errorMessage = "Slider with alias <strong>$alias</strong> not found.";
if(!empty($strAliases))
$errorMessage .= " <br><br>Maybe you mean: ".$strAliases;
UniteFunctionsRev::throwError($errorMessage);
}
$this->initByDBData($sliderData);
}
/**
*
* init by id or alias
*/
public function initByMixed($mixed){
if(is_numeric($mixed))
$this->initByID($mixed);
else
$this->initByAlias($mixed);
}
/**
*
* get data functions
*/
public function getTitle(){
return($this->title);
}
public function getID(){
return($this->id);
}
public function getParams(){
return($this->arrParams);
}
/**
*
* set slider params
*/
public function setParams($arrParams){
$this->arrParams = $arrParams;
}
/**
*
* get parameter from params array. if no default, then the param is a must!
*/
function getParam($name,$default=null,$validateType = null,$title=""){
if($default === null){
if(!array_key_exists($name, $this->arrParams))
UniteFunctionsRev::throwError("The param <b>$name</b> not found in slider params.");
$default = "";
}
$value = UniteFunctionsRev::getVal($this->arrParams, $name,$default);
//validation:
switch($validateType){
case self::VALIDATE_NUMERIC:
case self::VALIDATE_EMPTY:
$paramTitle = !empty($title)?$title:$name;
if($value !== "0" && $value !== 0 && empty($value))
UniteFunctionsRev::throwError("The param <strong>$paramTitle</strong> should not be empty.");
break;
case self::VALIDATE_NUMERIC:
$paramTitle = !empty($title)?$title:$name;
if(!is_numeric($value))
UniteFunctionsRev::throwError("The param <strong>$paramTitle</strong> should be numeric. Now it's: $value");
break;
case self::FORCE_NUMERIC:
if(!is_numeric($value)){
$value = 0;
if(!empty($default))
$value = $default;
}
break;
}
return $value;
}
public function getAlias(){
return($this->alias);
}
/**
* get combination of title (alias)
*/
public function getShowTitle(){
$showTitle = $this->title." ($this->alias)";
return($showTitle);
}
/**
*
* get slider shortcode
*/
public function getShortcode(){
$shortCode = "[rev_slider {$this->alias}]";
return($shortCode);
}
/**
*
* check if alias exists in DB
*/
private function isAliasExistsInDB($alias){
$alias = $this->db->escape($alias);
$where = "alias='$alias'";
if(!empty($this->id))
$where .= " and id != '{$this->id}'";
$response = $this->db->fetch(GlobalsRevSlider::$table_sliders,$where);
return(!empty($response));
}
/**
*
* validate settings for add
*/
private function validateInputSettings($title,$alias,$params){
UniteFunctionsRev::validateNotEmpty($title,"title");
UniteFunctionsRev::validateNotEmpty($alias,"alias");
if($this->isAliasExistsInDB($alias))
UniteFunctionsRev::throwError("Some other slider with alias '$alias' already exists");
}
/**
*
* create / update slider from options
*/
private function createUpdateSliderFromOptions($options,$sliderID = null){
$arrMain = UniteFunctionsRev::getVal($options, "main");
$params = UniteFunctionsRev::getVal($options, "params");
//trim all input data
$arrMain = UniteFunctionsRev::trimArrayItems($arrMain);
$params = UniteFunctionsRev::trimArrayItems($params);
$params = array_merge($arrMain,$params);
$title = UniteFunctionsRev::getVal($arrMain, "title");
$alias = UniteFunctionsRev::getVal($arrMain, "alias");
if(!empty($sliderID))
$this->initByID($sliderID);
$this->validateInputSettings($title, $alias, $params);
$jsonParams = json_encode($params);
//insert slider to database
$arrData = array();
$arrData["title"] = $title;
$arrData["alias"] = $alias;
$arrData["params"] = $jsonParams;
if(empty($sliderID)){ //create slider
$sliderID = $this->db->insert(GlobalsRevSlider::$table_sliders,$arrData);
return($sliderID);
}else{ //update slider
$this->initByID($sliderID);
$sliderID = $this->db->update(GlobalsRevSlider::$table_sliders,$arrData,array("id"=>$sliderID));
}
}
/**
*
* delete slider from datatase
*/
private function deleteSlider(){
$this->validateInited();
//delete slider
$this->db->delete(GlobalsRevSlider::$table_sliders,"id=".$this->id);
//delete slides
$this->deleteAllSlides();
}
/**
*
* delete all slides
*/
private function deleteAllSlides(){
$this->validateInited();
$this->db->delete(GlobalsRevSlider::$table_slides,"slider_id=".$this->id);
}
/**
*
* duplicate slider in datatase
*/
private function duplicateSlider(){
$this->validateInited();
//get slider number:
$response = $this->db->fetch(GlobalsRevSlider::$table_sliders);
$numSliders = count($response);
$newSliderSerial = $numSliders+1;
$newSliderTitle = "Slider".$newSliderSerial;
$newSliderAlias = "slider".$newSliderSerial;
//insert a new slider
$sqlSelect = "select ".GlobalsRevSlider::FIELDS_SLIDER." from ".GlobalsRevSlider::$table_sliders." where id={$this->id}";
$sqlInsert = "insert into ".GlobalsRevSlider::$table_sliders." (".GlobalsRevSlider::FIELDS_SLIDER.") ($sqlSelect)";
$this->db->runSql($sqlInsert);
$lastID = $this->db->getLastInsertID();
UniteFunctionsRev::validateNotEmpty($lastID);
//update the new slider with the title and the alias values
$arrUpdate = array();
$arrUpdate["title"] = $newSliderTitle;
$arrUpdate["alias"] = $newSliderAlias;
$this->db->update(GlobalsRevSlider::$table_sliders, $arrUpdate, array("id"=>$lastID));
//duplicate slides
$fields_slide = GlobalsRevSlider::FIELDS_SLIDE;
$fields_slide = str_replace("slider_id", $lastID, $fields_slide);
$sqlSelect = "select ".$fields_slide." from ".GlobalsRevSlider::$table_slides." where slider_id={$this->id}";
$sqlInsert = "insert into ".GlobalsRevSlider::$table_slides." (".GlobalsRevSlider::FIELDS_SLIDE.") ($sqlSelect)";
$this->db->runSql($sqlInsert);
}
/**
*
* duplicate slide
*/
private function duplicateSlide($slideID){
$slide = new RevSlide();
$slide->initByID($slideID);
$order = $slide->getOrder();
$slides = $this->getSlides();
$newOrder = $order+1;
$this->shiftOrder($newOrder);
//do duplication
$sqlSelect = "select ".GlobalsRevSlider::FIELDS_SLIDE." from ".GlobalsRevSlider::$table_slides." where id={$slideID}";
$sqlInsert = "insert into ".GlobalsRevSlider::$table_slides." (".GlobalsRevSlider::FIELDS_SLIDE.") ($sqlSelect)";
$this->db->runSql($sqlInsert);
$lastID = $this->db->getLastInsertID();
UniteFunctionsRev::validateNotEmpty($lastID);
//update order
$arrUpdate = array("slide_order"=>$newOrder);
$this->db->update(GlobalsRevSlider::$table_slides,$arrUpdate, array("id"=>$lastID));
return($lastID);
}
/**
*
* copy / move slide
*/
private function copyMoveSlide($slideID,$targetSliderID,$operation){
if($operation == "move"){
$targetSlider = new RevSlider();
$targetSlider->initByID($targetSliderID);
$maxOrder = $targetSlider->getMaxOrder();
$newOrder = $maxOrder+1;
$arrUpdate = array("slider_id"=>$targetSliderID,"slide_order"=>$newOrder);
$this->db->update(GlobalsRevSlider::$table_slides,$arrUpdate,array("id"=>$slideID));
}else{ //in place of copy
$this->duplicateSlide($slideID);
$this->copyMoveSlide($slideID,$targetSliderID,"move");
}
}
/**
*
* shift order of the slides from specific order
*/
private function shiftOrder($fromOrder){
$where = " slider_id={$this->id} and slide_order >= $fromOrder";
$sql = "update ".GlobalsRevSlider::$table_slides." set slide_order=(slide_order+1) where $where";
$this->db->runSql($sql);
}
/**
*
* create slider in database from options
*/
public function createSliderFromOptions($options){
$sliderID = $this->createUpdateSliderFromOptions($options);
return($sliderID);
}
/**
*
* export slider from data, output a file for download
*/
public function exportSlider(){
$this->validateInited();
$sliderParams = $this->getParamsForExport();
$arrSlides = $this->getSlidesForExport();
$arrSliderExport = array("params"=>$sliderParams,"slides"=>$arrSlides);
$strExport = serialize($arrSliderExport);
if(!empty($this->alias))
$filename = $this->alias.".txt";
else
$filename = "slider_export.txt";
UniteFunctionsRev::downloadFile($strExport,$filename);
}
/**
*
* import slider from multipart form
*/
public function importSliderFromPost(){
try{
$sliderID = UniteFunctionsRev::getPostVariable("sliderid");
$sliderExists = !empty($sliderID);
if($sliderExists)
$this->initByID($sliderID);
$filepath = $_FILES["import_file"]["tmp_name"];
if(file_exists($filepath) == false)
UniteFunctionsRev::throwError("Import file not found!!!");
//get content array
$content = @file_get_contents($filepath);
$arrSlider = @unserialize($content);
if(empty($arrSlider))
UniteFunctionsRev::throwError("Wrong export slider file format!");
//update slider params
$sliderParams = $arrSlider["params"];
if($sliderExists){
$sliderParams["title"] = $this->arrParams["title"];
$sliderParams["alias"] = $this->arrParams["alias"];
$sliderParams["shortcode"] = $this->arrParams["shortcode"];
}
if(isset($sliderParams["background_image"]))
$sliderParams["background_image"] = UniteFunctionsWPRev::getImageUrlFromPath($sliderParams["background_image"]);
$json_params = json_encode($sliderParams);
//update slider or craete new
if($sliderExists){
$arrUpdate = array("params"=>$json_params);
$this->db->update(GlobalsRevSlider::$table_sliders,$arrUpdate,array("id"=>$sliderID));
}
else{ //new slider
$arrInsert = array();
$arrInsert["params"] = $json_params;
$arrInsert["title"] = UniteFunctionsRev::getVal($sliderParams, "title","Slider1");
$arrInsert["alias"] = UniteFunctionsRev::getVal($sliderParams, "alias","slider1");
$sliderID = $this->db->insert(GlobalsRevSlider::$table_sliders,$arrInsert);
}
//-------- Slides Handle -----------
//delete current slides
if($sliderExists)
$this->deleteAllSlides();
//create all slides
$arrSlides = $arrSlider["slides"];
foreach($arrSlides as $slide){
$params = $slide["params"];
$layers = $slide["layers"];
//convert params images:
if(isset($params["image"]))
$params["image"] = UniteFunctionsWPRev::getImageUrlFromPath($params["image"]);
//convert layers images:
foreach($layers as $key=>$layer){
if(isset($layer["image_url"])){
$layer["image_url"] = UniteFunctionsWPRev::getImageUrlFromPath($layer["image_url"]);
$layers[$key] = $layer;
}
}
//create new slide
$arrCreate = array();
$arrCreate["slider_id"] = $sliderID;
$arrCreate["slide_order"] = $slide["slide_order"];
$arrCreate["layers"] = json_encode($layers);
$arrCreate["params"] = json_encode($params);
$this->db->insert(GlobalsRevSlider::$table_slides,$arrCreate);
}
}catch(Exception $e){
$errorMessage = $e->getMessage();
return(array("success"=>false,"error"=>$errorMessage,"sliderID"=>$sliderID));
}
return(array("success"=>true,"sliderID"=>$sliderID));
}
/**
*
* update slider from options
*/
public function updateSliderFromOptions($options){
$sliderID = UniteFunctionsRev::getVal($options, "sliderid");
UniteFunctionsRev::validateNotEmpty($sliderID,"Slider ID");
$this->createUpdateSliderFromOptions($options,$sliderID);
}
/**
*
* delete slider from input data
*/
public function deleteSliderFromData($data){
$sliderID = UniteFunctionsRev::getVal($data, "sliderid");
UniteFunctionsRev::validateNotEmpty($sliderID,"Slider ID");
$this->initByID($sliderID);
$this->deleteSlider();
}
/**
*
* delete slider from input data
*/
public function duplicateSliderFromData($data){
$sliderID = UniteFunctionsRev::getVal($data, "sliderid");
UniteFunctionsRev::validateNotEmpty($sliderID,"Slider ID");
$this->initByID($sliderID);
$this->duplicateSlider();
}
/**
*
* duplicate slide from input data
*/
public function duplicateSlideFromData($data){
//init the slider
$sliderID = UniteFunctionsRev::getVal($data, "sliderID");
UniteFunctionsRev::validateNotEmpty($sliderID,"Slider ID");
$this->initByID($sliderID);
//get the slide id
$slideID = UniteFunctionsRev::getVal($data, "slideID");
UniteFunctionsRev::validateNotEmpty($slideID,"Slide ID");
$this->duplicateSlide($slideID);
return($sliderID);
}
/**
*
* copy / move slide from data
*/
public function copyMoveSlideFromData($data){
$sliderID = UniteFunctionsRev::getVal($data, "sliderID");
UniteFunctionsRev::validateNotEmpty($sliderID,"Slider ID");
$this->initByID($sliderID);
$targetSliderID = UniteFunctionsRev::getVal($data, "targetSliderID");
UniteFunctionsRev::validateNotEmpty($sliderID,"Target Slider ID");
$this->initByID($sliderID);
if($targetSliderID == $sliderID)
UniteFunctionsRev::throwError("The target slider can't be equal to the source slider");
$slideID = UniteFunctionsRev::getVal($data, "slideID");
UniteFunctionsRev::validateNotEmpty($slideID,"Slide ID");
$operation = UniteFunctionsRev::getVal($data, "operation");
$this->copyMoveSlide($slideID,$targetSliderID,$operation);
return($sliderID);
}
/**
*
* create a slide from input data
*/
public function createSlideFromData($data,$returnSlideID = false){
$sliderID = UniteFunctionsRev::getVal($data, "sliderid");
$obj = UniteFunctionsRev::getVal($data, "obj");
UniteFunctionsRev::validateNotEmpty($sliderID,"Slider ID");
$this->initByID($sliderID);
if(is_array($obj)){ //multiple
foreach($obj as $item){
$slide = new RevSlide();
$slideID = $slide->createSlide($sliderID, $item);
}
return(count($obj));
}else{ //signle
$urlImage = $obj;
$slide = new RevSlide();
$slideID = $slide->createSlide($sliderID, $urlImage);
if($returnSlideID == true)
return($slideID);
else
return(1); //num slides -1 slide created
}
}
/**
*
* update slides order from data
*/
public function updateSlidesOrderFromData($data){
$sliderID = UniteFunctionsRev::getVal($data, "sliderID");
$arrIDs = UniteFunctionsRev::getVal($data, "arrIDs");
UniteFunctionsRev::validateNotEmpty($arrIDs,"slides");
$this->initByID($sliderID);
foreach($arrIDs as $index=>$slideID){
$order = $index+1;
$arrUpdate = array("slide_order"=>$order);
$where = array("id"=>$slideID);
$this->db->update(GlobalsRevSlider::$table_slides,$arrUpdate,$where);
}
}
/**
*
* get the "main" and "settings" arrays, for dealing with the settings.
*/
public function getSettingsFields(){
$this->validateInited();
$arrMain = array();
$arrMain["title"] = $this->title;
$arrMain["alias"] = $this->alias;
$arrRespose = array("main"=>$arrMain,
"params"=>$this->arrParams);
return($arrRespose);
}
/**
*
* get slides of the current slider
*/
public function getSlides($publishedOnly = false){
$this->validateInited();
$arrSlides = array();
$arrSlideRecords = $this->db->fetch(GlobalsRevSlider::$table_slides,"slider_id=".$this->id,"slide_order");
foreach ($arrSlideRecords as $record){
$slide = new RevSlide();
$slide->initByData($record);
if($publishedOnly == true){
$state = $slide->getParam("state","published");
if($state == "unpublished")
continue;
}
$arrSlides[] = $slide;
}
$this->arrSlides = $arrSlides;
return($arrSlides);
}
/**
*
* get array of slide names
*/
public function getArrSlideNames(){
if(empty($this->arrSlides))
$this->getSlides();
$arrSlideNames = array();
foreach($this->arrSlides as $number=>$slide){
$slideID = $slide->getID();
$filename = $slide->getImageFilename();
$slideName = "Slide ".($number+1);
if(!empty($filename))
$slideName .= " ($filename)";
$arrSlideNames[$slideID] = $slideName;
}
return($arrSlideNames);
}
/**
*
* get array of slides numbers by id's
*/
public function getSlidesNumbersByIDs($publishedOnly = false){
if(empty($this->arrSlides))
$this->getSlides($publishedOnly);
$arrSlideNumbers = array();
foreach($this->arrSlides as $number=>$slide){
$slideID = $slide->getID();
$arrSlideNumbers[$slideID] = ($number+1);
}
return($arrSlideNumbers);
}
/**
*
* get slider params for export slider
*/
private function getParamsForExport(){
$exportParams = $this->arrParams;
//modify background image
$urlImage = UniteFunctionsRev::getVal($exportParams, "background_image");
if(!empty($urlImage))
$exportParams["background_image"] = $urlImage;
return($exportParams);
}
/**
*
* get slides for export
*/
private function getSlidesForExport(){
$arrSlides = $this->getSlides();
$arrSlidesExport = array();
foreach($arrSlides as $slide){
$slideNew = array();
$slideNew["params"] = $slide->getParamsForExport();
$slideNew["slide_order"] = $slide->getOrder();
$slideNew["layers"] = $slide->getLayersForExport();
$arrSlidesExport[] = $slideNew;
}
return($arrSlidesExport);
}
/**
*
* get slides number
*/
public function getNumSlides($publishedOnly = false){
if($this->arrSlides == null)
$this->getSlides($publishedOnly);
$numSlides = count($this->arrSlides);
return($numSlides);
}
/**
*
* get sliders array - function don't belong to the object!
*/
public function getArrSliders(){
$where = "";
$response = $this->db->fetch(GlobalsRevSlider::$table_sliders,$where,"id");
$arrSliders = array();
foreach($response as $arrData){
$slider = new RevSlider();
$slider->initByDBData($arrData);
$arrSliders[] = $slider;
}
return($arrSliders);
}
/**
*
* get aliasees array
*/
public function getAllSliderAliases(){
$where = "";
$response = $this->db->fetch(GlobalsRevSlider::$table_sliders,$where,"id");
$arrAliases = array();
foreach($response as $arrSlider){
$arrAliases[] = $arrSlider["alias"];
}
return($arrAliases);
}
/**
*
* get array of slider id -> title
*/
public function getArrSlidersShort($exceptID = null){
$arrSliders = $this->getArrSliders();
$arrShort = array();
foreach($arrSliders as $slider){
$id = $slider->getID();
if(!empty($exceptID) && $exceptID == $id)
continue;
$title = $slider->getTitle();
$arrShort[$id] = $title;
}
return($arrShort);
}
/**
*
* get max order
*/
public function getMaxOrder(){
$this->validateInited();
$maxOrder = 0;
$arrSlideRecords = $this->db->fetch(GlobalsRevSlider::$table_slides,"slider_id=".$this->id,"slide_order desc","","limit 1");
if(empty($arrSlideRecords))
return($maxOrder);
$maxOrder = $arrSlideRecords[0]["slide_order"];
return($maxOrder);
}
/**
*
* get setting - start with slide
*/
public function getStartWithSlideSetting(){
$numSlides = $this->getNumSlides();
$startWithSlide = $this->getParam("start_with_slide","1");
if(is_numeric($startWithSlide)){
$startWithSlide = (int)$startWithSlide - 1;
if($startWithSlide < 0)
$startWithSlide = 0;
if($startWithSlide >= $numSlides)
$startWithSlide = 0;
}else
$startWithSlide = 0;
return($startWithSlide);
}
}
?>