* @link https://www.themepunch.com/
* @copyright 2019 ThemePunch
*/
if(!defined('ABSPATH')) exit();
$rs_double_jquery_script = false;
$rs_material_icons_css = false;
$rs_material_icons_css_parsed = false;
$rs_slider_serial = 0;
$rs_ids_collection = array();
class RevSliderOutput extends RevSliderFunctions {
//START transfered from the layer add process and some of these are only filled if putSlides() is called
public $zIndex = 1;
//public $in_class_usage = array();
public $enabled_sizes = array();
public $adv_resp_sizes = array();
public $icon_sets = array();//RevSliderBase::set_icon_sets(array());
public $container_mode = '';
public $row_zindex = 0;
//END transfered from the layer add process and some of these are only filled if putSlides() is called
/**
* variables for error handling, to know if we need to close the div or not
**/
public $rs_module_wrap_open = false;
public $rs_module_open = false;
public $rs_module_wrap_closed = false;
public $rs_module_closed = false;
public $rs_custom_navigation_css = '';
/**
* ShortCode based Global Values
* usage : Is Module to emebed as Modal ?
* sc_layout : overwrite original module Layout,
* offset : padding and margin of the wrapping Module
* modal : Modal Settings
**/
public $usage = '';
public $sc_layout = '';
public $offset = '';
public $modal = '';
public $ajax_loaded = false;
/**
* if set to true, needed js variables for frontend actions will be added
**/
public $frontend_action = false;
/**
* holds the layer depth, used for having a more structured HTML
**/
public $layer_depth = '';
/**
* holds the current slider
**/
public $slider;
/**
* holds the current slide
**/
private $slide;
/**
* holds the current slides of the slider
**/
private $slides;
/**
* holds the current layers of a slide
**/
private $layers;
/**
* holds the current used layer
**/
private $layer;
/**
* holds the current slider id
**/
private $slider_id = 0;
/**
* holds the current layers of a slide
* @before: RevSliderOutput::$slideID
**/
private $slide_id;
/**
* holds the current layer unique id
**/
private $uid;
/**
* if set, these will be pushed inside the Slider
* @before: RevSliderOutput::$gal_ids
**/
public $gallery_ids = array();
/**
* holds all the hover css in ids of the layers
**/
public $hover_css = array();
/**
* holds all the classes, that are already used in layers
* @before: RevSliderOutput::$class_include
**/
public $classes = array();
/**
* holds if static layers should be done
**/
private $do_static = true;
/**
* if set, the Slider will only be added if the current page/post meets what is into this variable
* @before: RevSliderOutput::$putIn
**/
public $add_to = '';
/**
* if set to true we are in preview mode
* @before: RevSliderOutput::$previewMode
**/
private $preview_mode = false;
/**
* if set, the Slider will take changes on what is added to this array
* @before: RevSliderOutput::$settings
**/
public $custom_settings = array();
/**
* if set, the Slider will take changes on the selected skin
**/
public $custom_skin = '';
/**
* holds the skin data to change layers based on
**/
public $custom_skin_data = array();
/**
* if set to true the markup will be exported
* @before: RevSliderOutput::$markup_export
**/
private $markup_export = false;
/**
* if set, the Slider will take order changes on the order in this array
* @before: RevSliderOutput::$order
**/
public $custom_order = array();
/**
* set if only published will be used
**/
private $only_published = true;
/**
* holds the number index of all slides
* @before: RevSliderOutput::$slidesNumIndex
**/
private $slides_num_index;
/**
* if set to true tells the plugin that there is only one Slide from now on
* @before: RevSliderOutput::$hasOnlyOneSlide;
**/
private $is_single_slide = false;
/**
* holds all the static slide data including layers
**/
private $static_slide = array();
/**
* set the language here, used for WPML
* @before: RevSliderOutput::$sliderLang
**/
private $language = 'all';
/**
* holds the current html id
**/
private $html_id;
/**
* holds the current html id
**/
private $orig_html_id = false;
/**
* knows if we are currently processing a static slide
**/
private $is_static = false;
/**
* holds the inline js for adding it to footer
**/
private $rev_inline_js = '';
/**
* holds slider that are loaded for modal cover checks
**/
private $modal_sliders = array();
/**
* holds easings that the slider is using
**/
private $easings = array();
/**
* START: DEPRECATED FUNCTIONS THAT ARE IN HERE FOR OLD ADDONS TO WORK PROPERLY
**/
/**
* old version of check_add_to()
**/
public static function isPutIn($empty_is_false = false){
$o = new RevSliderOutput();
return $o->check_add_to($empty_is_false);
}
/**
* END: DEPRECATED FUNCTIONS THAT ARE IN HERE FOR OLD ADDONS TO WORK PROPERLY
**/
/**
* pre init the static slide
*/
public function __construct(){
$this->static_slide = new RevSliderSlide();
}
/**
* set the current slider_id
*/
public function set_slider_id($sid){
$this->slider_id = apply_filters('revslider_set_slider_id', $sid, $this);
}
/**
* set the add_to variable
*/
public function set_add_to($add_to) {
$this->add_to = apply_filters('revslider_set_add_to', $add_to, $this);
}
/**
* get the add_to variable
*/
public function get_add_to(){
return apply_filters('revslider_get_add_to', trim(strtolower($this->add_to)), $this);
}
/**
* set the slider manually
* @since: 6.0
*/
public function set_slider($slider){
$this->slider = apply_filters('revslider_set_slider', $slider, $this);
}
/**
* get the last slider after the output
* @before: RevSliderOutput::getSlider()
*/
public function get_slider(){
return apply_filters('revslider_get_slider', $this->slider, $this);
}
/**
* get the current slider_id
*/
public function get_slider_id(){
return apply_filters('revslider_get_slider_id', $this->slider_id, $this);
}
/**
* set the HTML ID
* @since 6.1.6: added option to check for duplications
*/
public function set_html_id($html_id, $check_for_duplication = true){
global $rs_ids_collection;
if($check_for_duplication){ //check if it already exists, if yes change it and add attribute for console output
if(in_array($html_id, $rs_ids_collection, true)){
$this->orig_html_id = $html_id; //set the original_html_id to push a console message
$i = 0;
do{ $i++; }while(in_array($html_id.'_'.$i, $rs_ids_collection, true));
$html_id .= '_'.$i;
}
}
if(!in_array($html_id, $rs_ids_collection)) $rs_ids_collection[] = $html_id;
$this->html_id = apply_filters('revslider_set_html_id', $html_id, $this);
}
/**
* set slide slide_id
*/
public function set_slide_id($slide_id){
$this->slide_id = apply_filters('revslider_set_slide_id', $slide_id, $this);
}
/**
* set the slides so that it can be used from anywhere
**/
public function set_current_slides($slides){
$this->slides = $slides;
}
/**
* get the slides so that it can be used from anywhere
**/
public function get_current_slides(){
return $this->slides;
}
/**
* get slide slide_id
*/
public function get_slide_id(){
return apply_filters('revslider_get_slide_id', $this->slide_id, $this);
}
/**
* set slide layers
*/
public function set_layers($layers){
$this->layers = apply_filters('revslider_set_layers', $layers, $this);
}
/**
* get slide layers
*/
public function get_layers(){
return apply_filters('revslider_get_layers', $this->layers, $this);
}
/**
* set slide layer
*/
public function set_layer($layer){
$this->layer = apply_filters('revslider_set_layer', $layer, $this);
}
/**
* get slide layer
*/
public function get_layer(){
return apply_filters('revslider_get_layer', $this->layer, $this);
}
/**
* get the HTML ID
* @before: RevSliderOutput::getSliderHtmlID
*/
public function get_html_id($raw = true){
$html_id = $this->html_id;
$html_id = (!$raw) ? preg_replace("/[^a-zA-Z0-9]/", "", $html_id) : $html_id;
return apply_filters('revslider_get_html_id', $html_id, $this, $raw);
}
/**
* set static_slide data and layers
*/
public function set_static_slide($slide){
$this->static_slide = apply_filters('revslider_set_static_slide', $slide, $this);
}
/**
* get static_slide data and layers
*/
public function get_static_slide(){
return apply_filters('revslider_get_static_slide', $this->static_slide, $this);
}
/**
* get do_static
*/
public function get_do_static(){
return apply_filters('revslider_get_do_static_layers', $this->do_static, $this);
}
/**
* set the output into ajax loaded mode
* so that i.e. fonts are pushed into footer
*/
public function set_ajax_loaded(){
$this->ajax_loaded = true;
}
/**
* get current layer depth
*/
public function ld(){
return $this->layer_depth;
}
/**
* increase current layer depth
* this is only for the HTML looks
*/
public function increase_layer_depth(){
$this->layer_depth .= ' ';
}
/**
* decrease current layer depth
* this is only for the HTML looks
*/
public function decrease_layer_depth(){
if(!empty($this->layer_depth)){
$this->layer_depth = substr($this->layer_depth, 0, -1);
}
}
/**
* set the custom settings
*/
public function set_custom_settings($settings){
$settings = ($settings !== '' && !is_array($settings)) ? json_decode(str_replace(array('({', '})', "'"), array('[', ']', '"'), $settings), true) : $settings;
$this->custom_settings = apply_filters('revslider_set_custom_settings', $settings, $this);
}
/**
* get the custom settings
*/
public function get_custom_settings(){
return apply_filters('revslider_get_custom_settings', $this->custom_settings, $this);
}
/**
* set the custom settings
*/
public function set_custom_skin($skin){
$this->custom_skin = apply_filters('revslider_set_custom_skin', $skin, $this);
}
/**
* get the custom settings
*/
public function get_custom_skin(){
return apply_filters('revslider_get_custom_skin', $this->custom_skin, $this);
}
/**
* set the current layer unique id
**/
public function set_layer_unique_id(){
$layer = $this->get_layer();
$uid = $this->get_val($layer, 'uid');
if($uid == '' && $uid !== 0 && $uid !== '0' ) $uid = $this->zIndex;
$this->uid = apply_filters('revslider_set_layer_unique_id', $uid, $layer, $this);
}
/**
* get the current layer unique id
**/
public function get_layer_unique_id(){
return apply_filters('revslider_get_layer_unique_id', $this->uid, $this);
}
/**
* get the preview
*/
public function get_preview_mode(){
return apply_filters('revslider_get_preview_mode', $this->preview_mode, $this);
}
/**
* set the preview_mode
*/
public function set_preview_mode($preview_mode){
$this->preview_mode = apply_filters('revslider_set_preview_mode', $preview_mode, $this);
}
/**
* set the markup_export variable
*/
public function set_markup_export($markup_export){
$this->markup_export = apply_filters('revslider_set_markup_export', $markup_export, $this);
}
/**
* get the markup_export variable
*/
public function get_markup_export(){
return apply_filters('revslider_get_markup_export', $this->markup_export, $this);
}
/**
* get the custom order
*/
public function get_custom_order(){
return apply_filters('revslider_get_custom_order', $this->custom_order, $this);
}
/**
* get the language
*/
public function get_language(){
return apply_filters('revslider_get_language', $this->language, $this);
}
/**
* set the language
*/
public function change_language($language){
$this->language = apply_filters('revslider_change_language', $language, $this);
}
/**
* set the custom order
*/
public function set_custom_order($order){
$order = ($order !== '' && !is_array($order)) ? explode(',', $order) : $order;
$this->custom_order = apply_filters('revslider_set_custom_settings', $order, $this);
}
/**
* set published
*/
public function set_only_published($published){
$this->only_published = apply_filters('revslider_set_published', $published, $this);
}
/**
* get published
*/
public function get_only_published(){
return apply_filters('revslider_get_published', $this->only_published);
}
/**
* set slides_num_index
*/
public function set_slides_num_index($index){
$this->slides_num_index = apply_filters('revslider_set_slides_num_index', $index, $this);
}
/**
* get slides_num_index
*/
public function get_slides_num_index(){
return apply_filters('revslider_get_slides_num_index', $this->slides_num_index, $this);
}
/**
* set the gallery ids variable
* @before: RevSliderOutput::did not exist
*/
public function set_gallery_ids($ids){
$this->gallery_ids = apply_filters('revslider_set_gallery_ids', $ids, $this);
}
/**
* get the gallery ids variable
* @before: RevSliderOutput::did not exist
*/
public function get_gallery_ids(){
return apply_filters('revslider_get_gallery_ids', $this->gallery_ids, $this);
}
/**
* set is_single_slide
*/
public function set_is_single_slide($single){
$this->is_single_slide = apply_filters('revslider_set_is_single_slide', $single, $this);
}
/**
* get is_single_slide
*/
public function get_is_single_slide(){
return apply_filters('revslider_get_is_single_slide', $this->is_single_slide, $this);
}
/**
* set hover css
*/
public function set_hover_css($css){
if(!empty($css)){
foreach($css as $id => $_css){
$this->hover_css[$id] = $_css;
}
}
}
/**
* get is_single_slide
*/
public function get_hover_css(){
return $this->hover_css;
}
/**
* set slide data and layers
*/
public function set_slide($slide){
$this->slide = apply_filters('revslider_set_slide', $slide, $this);
}
/**
* get slide data and layers
*/
public function get_slide(){
return apply_filters('revslider_get_slide', $this->slide, $this);
}
/**
* add the Slider Revolution on to the HTML stage
* @before: RevSliderOutput::putSlider();
*/
public function add_slider_to_stage($sid, $usage = '', $layout = '', $offset = '', $modal = ''){
$this->usage = $usage;
$this->sc_layout = $layout;
$this->offset = $offset;
$this->modal = $modal;
do_action('revslider_add_slider_to_stage_pre', $sid, $this);
if(!$this->check_add_to()) return false;
$this->set_slider_id($sid);
$this->add_slider_base();
do_action('revslider_add_slider_to_stage_post', $sid, $this);
$slider = $this->get_slider();
return $slider;
}
/**
* adds the Slider Basis
* @before: RevSliderOutput::putSliderBase();
*/
public function add_slider_base(){
try{
global $rs_slider_serial, $rs_wmpl;
//$wpml = new RevSliderWpml();
do_action('revslider_add_slider_base_pre', $this);
$rs_slider_serial++; //set the serial +1, so that if we have the slider two times, it has different ID's for sure
if(empty($this->slider)){
$this->slider = new RevSliderSlider();
$this->slider->init_by_mixed($this->get_slider_id());
}
/**
* as it is now needed, check if an update needs to be done
**/
if(version_compare($this->get_val($this->slider, array('settings', 'version')), get_option('revslider_update_version', '6.0.0'), '<')){
$upd = new RevSliderPluginUpdate();
$upd->upgrade_slider_to_latest($this->slider);
$this->slider = new RevSliderSlider();
$this->slider->init_by_mixed($this->get_slider_id());
}
$this->slider = apply_filters('revslider_add_slider_base', $this->slider);
//set slider language
if($this->get_preview_mode() == false){
$lang = $rs_wmpl->get_slider_language($this->slider);
$this->change_language($lang);
}
//check if we are mobile and the slider needs to be printed or not
if($this->slider->get_param(array('general', 'disableOnMobile'), false) === true && wp_is_mobile()) return false;
//the initial id can be an alias, so reset the id now
$sid = $this->slider->get_id();
$this->set_slider_id($sid);
$this->modify_settings();
if($this->get_preview_mode()) $this->modify_preview_mode_settings();
$this->set_fonts();
//add html before slider markup is written
$html_before_slider = '';
$markup_export = $this->get_markup_export();
if($this->ajax_loaded === true || $this->get_markup_export()){ //if true, then we are loaded by ajax
$html_before_slider .= ($markup_export === true) ? '' : '';
$html_before_slider .= $this->print_clean_font_import();
$html_before_slider .= ($markup_export === true) ? '' : '';
}
//check if scripts should be added to the body
if($this->slider->get_param(array('troubleshooting', 'jsInBody'), false) == true && $this->ajax_loaded === false){
$html_before_slider .= ($markup_export === true) ? '' : '';
$html_before_slider .= $this->add_javascript_to_footer();
$html_before_slider .= ($markup_export === true) ? '' : '';
}
$slider_id = $this->slider->get_param('id', '');
$html_id = (trim($slider_id) !== '') ? $slider_id : 'rev_slider_'.$sid.'_'.$rs_slider_serial;
$this->set_html_id($html_id);
echo $html_before_slider."\n";
echo $this->get_slider_wrapper_div();
echo $this->get_slider_div();
echo $this->get_slides();
//echo $this->get_timer_bar();
echo $this->close_slider_div();
$this->add_js();
$this->add_style_hover();
echo $this->add_custom_navigation_css();
echo $this->get_material_icons_css();
echo $this->close_slider_wrapper_div();
echo $this->add_unfloat_html();
$this->add_modal_font_icons();
do_action('revslider_add_slider_base_post', $this);
}catch(Exception $e){
$message = $e->getMessage();
$this->print_error_message($message);
}
}
/**
* creates the wrapping div container for Sliders
**/
public function get_slider_wrapper_div(){
$type = $this->slider->get_param('layouttype');
$position = $this->slider->get_param(array('layout', 'position', 'align'), 'center');
$bg_color = esc_attr(trim($this->slider->get_param(array('layout', 'bg', 'color'))));
$max_width = $this->slider->get_param(array('size', 'maxWidth'), '0');
$class = $this->slider->get_param('wrapperclass','');
$class .= ($this->usage === 'modal') ? ' rs-modal ' : '';
$style = '';
//add background color
$style .= (!empty($bg_color)) ? 'background:'.RSColorpicker::get($bg_color).';' : '';
$style .= 'padding:'.esc_attr($this->slider->get_param(array('layout', 'bg', 'padding'), '0')).';';
if($type != 'fullscreen'){
switch($position){
case 'center':
default:
$style .= 'margin:0px auto;';
break;
case 'left':
$style .= 'float:left;';
break;
case 'right':
$style .= 'float:right;';
break;
}
if($position != 'center'){
$ma_l = $this->slider->get_param(array('layout', 'position', 'marginLeft'), '0');
$ma_r = $this->slider->get_param(array('layout', 'position', 'marginRight'), '0');
$style .= ($ma_l !== '') ? 'margin-left:'.esc_attr($ma_l).';' : '';
$style .= ($ma_r !== '') ? 'margin-right:'.esc_attr($ma_r).';' : '';
}
$ma_t = $this->slider->get_param(array('layout', 'position', 'marginTop'), '0');
$ma_b = $this->slider->get_param(array('layout', 'position', 'marginBottom'), '0');
$style .= ($ma_t !== '') ? 'margin-top:'.esc_attr($ma_t).';' : '';
$style .= ($ma_b !== '') ? 'margin-bottom:'.esc_attr($ma_b).';' : '';
}
//add background image (banner style)
if($this->slider->get_param(array('layout', 'bg', 'useImage'), false) == true){
$bg_img_id = esc_attr($this->slider->get_param(array('layout', 'bg', 'imageId')));
$bg_img_type = esc_attr($this->slider->get_param(array('layout', 'bg', 'imageSourceType'), 'full'));
$bg_img = esc_attr($this->slider->get_param(array('layout', 'bg', 'image')));
if(empty($bg_img_id) || intval($bg_img_id) == 0){
$bg_img_id = $this->get_image_id_by_url($bg_img);
}
if($bg_img_type !== 'full' && $bg_img_id !== false && !empty($bg_img_id)){
$_bg_img = wp_get_attachment_image_src($bg_img_id, $bg_img_type);
$bg_img = ($_bg_img !== false) ? $_bg_img[0] : $bg_img;
}
$bg_img = $this->check_valid_image($bg_img);
if($bg_img !== false){
$style .= 'background-image:url('.$bg_img.');';
$style .= 'background-repeat:'.esc_attr($this->slider->get_param(array('layout', 'bg', 'repeat'), 'no-repeat')).';'; //$this->slider->get_param(array('def', 'background', 'repeat'), 'no-repeat')
$style .= 'background-size:'.esc_attr($this->slider->get_param(array('layout', 'bg', 'fit'), 'cover')).';'; //$this->slider->get_param(array('def', 'background', 'fit'), 'cover')
$style .= 'background-position:'.esc_attr($this->slider->get_param(array('layout', 'bg', 'position'), 'center center')).';'; //$this->slider->get_param(array('def', 'background', 'position'), 'center center')
}
}
if(!in_array($type, array('responsitive', 'fixed', 'auto', 'fullwidth', 'fullscreen'), true)){
$style .= 'height:'.$this->slider->get_param(array('size', 'height', 'd'), 900).';';
$style .= 'width:'.$this->slider->get_param(array('size', 'width', 'd'), 1240).';';
}
if(!in_array($max_width, array('0', 0, '0px', '0%'), true) && $type == 'auto'){
$style .= 'max-width:'. $max_width.';';
}
$fixedOnTop = array(
'v' => $this->slider->get_param(array('layout', 'position', 'fixedOnTop'), false),
'd' => false
);
if ($fixedOnTop['v']===true) {
$style .= 'position:fixed;top:0px;height:0px';
}
$r = RS_T3.'
'."\n";
$r .= RS_T3.'rs_module_wrap_open = true;
$r .= ' id="'.$this->get_html_id().'_wrapper"';
$r .= (!empty($class)) ? ' class="'.trim($class).'"' : '';
if((is_super_admin() || is_admin_bar_showing()) && current_user_can('edit_theme_options')){
$r .= ' data-alias="'.esc_attr($this->slider->get_alias()).'"';
}
$r .= ' data-source="'.$this->slider->get_param('sourcetype').'"';
$show_alternate = $this->slider->get_param(array('troubleshooting', 'alternateImageType'), 'off');
if($show_alternate !== 'off'){
$show_alternate_image = $this->slider->get_param(array('troubleshooting', 'alternateURL'), '');
$r .= ' data-aimg="'.$show_alternate_image.'" ';
$r .= ($show_alternate == 'mobile' || $show_alternate == 'mobile-ie8') ? ' data-amobile="enabled" ' : '';
$r .= ($show_alternate == 'mobile-ie8' || $show_alternate == 'ie8') ? ' data-aie8="enabled" ' : '';
}
$r .= ' style="'. $style .'">'."\n";
return apply_filters('revslider_get_slider_wrapper_div', $r, $this);
}
/**
* close the wrapping div container for Sliders
**/
public function close_slider_wrapper_div(){
$r = RS_T3.''."\n";
$r .= RS_T3.''."\n";
$this->rs_module_wrap_closed = true;
return apply_filters('revslider_close_slider_wrapper_div', $r, $this);
}
/**
* if wanted, add an unfloating HTML
* @since: 6.0
**/
public function add_unfloat_html(){
$r = '';
if($this->slider->get_param(array('layout', 'position', 'addClear'), false) === true){
$r = RS_T3.'';
}
return apply_filters('revslider_add_unfloat_html', $r, $this);
}
/**
* adds to font loading to the modal
* @since: 6.2.3
**/
public function add_modal_font_icons(){
if($this->usage === 'modal'){
RevSliderFront::load_icon_fonts();
}
}
/**
* creates the div container for Sliders
**/
public function get_slider_div(){
$style = '';
$class = $this->slider->get_param('class','');
$class .= ($this->slider->get_param(array('size', 'overflow'), true) == true) ? ' rs-ov-hidden' : '';
if(!in_array($this->slider->get_param('layouttype'), array('responsitive', 'fixed', 'auto', 'fullwidth', 'fullscreen'), true)){
$style .= 'height:'.$this->slider->get_param(array('size', 'width', 'd'), 1240).';';
$style .= 'width:'.$this->slider->get_param(array('size', 'height', 'd'), 900).';';
}
$r = RS_T4.'rs_module_open = true;
$r .= ($class !== '') ? ' class="'. $class .'"' : '';
$r .= ' style="'. $style .'"';
$r .= ' data-version="'. RS_REVISION .'"';
$r .= '>'."\n";
return apply_filters('revslider_get_slider_div', $r, $this);
}
/**
* close the div container for Sliders
**/
public function close_slider_div(){
$r = RS_T4.''."\n";
$this->rs_module_closed = true;
return apply_filters('revslider_close_slider_div', $r, $this);
}
/**
* get the Slides HTML of the Slider
**/
public function get_slides(){
$layouttype = $this->slider->get_param('type', 'standard'); //standard, carousel or hero
$order = $this->get_custom_order();
$gallery_ids = $this->get_gallery_ids();
$index = 0;
/**
* If we are Hero or there was a custom order Set
* we need to fetch all Slides, even unpublished in order find one that might be unpublished
**/
if($layouttype == 'hero' || !empty($order)) $this->set_only_published(false);
if($this->get_preview_mode() === true){
/**
* the slides are already set in preview mode (only in slide editor)
* in the overview page, get_preview_mode() needs to be false
**/
$slides = $this->get_current_slides();
}else{
/**
* fetch all slides connected to the Slider (no static slide)
**/
$published = $this->get_only_published();
$lang = $this->get_language(); //WPML functionality
$slides = $this->slider->get_slides_for_output($published, $lang, $gallery_ids);
}
/**
* check if we need to add gallery images
* check also for order
* these settings are set through shortcode manipulation
**/
if(!empty($gallery_ids) && $gallery_ids[0]){
$slides = $this->set_gallery_slides($slides);
}elseif(!empty($order)){
$slides = $this->order_slides($slides, $order);
}
/**
* set the num index for further onclick events and more
**/
$this->set_slides_num_index($this->slider->get_slide_numbers_by_id(true));
if($layouttype == 'hero' && empty($order) && empty($gallery_ids)){ //we are a hero Slider, show only one Slide!
$hero = $this->get_hero_slide($slides);
$slides = (!empty($hero)) ? array($hero) : array();
}
/**
* remove slides that are listed to be not shown on mobile
* will be done only if we are on mobile
**/
$slides = $this->remove_slide_if_mobile($slides);
/**
* enable the static layers if we have a static slide
* only set if we are not in preview mode
* as in preview mode, the static slide was already set
* also note, that this only happens in the slide editor.
* on the overview page, get_preview_mode will be false
**/
if($this->get_preview_mode() === false){
$this->enable_static_layers($slides);
}
/**
* if we are now at 0 slides, there will be no more chances to add them
* so return back with no slides markup
**/
if(empty($slides)){
$this->add_no_slides_markup();
return false;
}
/**
* removes slides before the loop check, as a loop does still not need a navigation
* and if loop will be triggered, we will have two slides, so remove it before
**/
if(count($slides) == 1) $this->remove_navigation();
/**
* slide loop will duplicate a single slide (if loop is active), so that we have a repeated in and out animation
**/
$slides = ($layouttype !== 'hero' && count($slides) == 1) ? $this->set_slide_loop($slides) : $slides;
/**
* set the slides later for static action checking
**/
$this->set_current_slides($slides);
$this->set_general_params_for_layers();
echo apply_filters('revslider_get_slides_pre', RS_T5.''."\n", $this);
foreach($slides as $slide){
$this->set_slide($slide);
$this->modify_slide_by_skin();
$this->modify_layers_by_skin();
if($this->is_in_timeframe() === false) continue; //could also be moved to earlier and remove slides instead of continue here
$this->add_slide_li_pre($index);
$this->add_slide_main_image();
$this->set_slide_params_for_layers();
$this->add_background_video();
echo $this->add_opening_comment();
$this->add_zones();
$this->add_groups();
$this->add_creative_layer();
echo $this->add_closing_comment();
do_action('revslider_add_layer_html', $this->slider, $slide);
$this->add_slide_li_post();
$this->set_material_icon_css();
$this->zIndex = 1; //reset zIndex on each slide
$index++;
}
echo apply_filters('revslider_get_slides_post', RS_T5.''."\n", $this);
$this->add_static_slide_html();
$this->set_material_icon_css(); //do again, so that we have static layers in the queue now
}
/**
* push the static slide, can also be disabled through filters
**/
public function enable_static_layers($slides){
if($this->get_do_static()){
$sid = $this->slider->get_id();
foreach($slides as $slide){
$static_id = $slide->get_static_slide_id($sid);
if($static_id !== false){
$static_slide = new RevSliderSlide();
$static_slide->init_by_static_id($static_id);
$this->set_static_slide($static_slide);
}
break;
}
}
}
/**
* creates the timer bar for Slider
**/
public function get_timer_bar(){
$layouttype = $this->slider->get_param('type'); //standard, carousel or hero
$enable_progressbar = $this->slider->get_param(array('general', 'progressbar', 'set'), true);
$timer_bar = $this->slider->get_param(array('general', 'progressbar', 'position'), 'top');
$progress_height = $this->slider->get_param(array('general', 'progressbar', 'height'), '5');
$progressbar_color = RSColorpicker::get($this->slider->get_param(array('general', 'progressbar', 'color'), '#000000'));
$timer_bar = ($enable_progressbar !== true || $layouttype == 'hero') ? 'hide' : $timer_bar;
$progress_style = ' style="height: '.esc_attr($progress_height).'px; background: '.$progressbar_color.';"';
$r = '';
switch($timer_bar){
case 'top':
$r = RS_T5.''."\n";
break;
case 'bottom':
$r = RS_T5.''."\n";
break;
case 'hide':
$r = RS_T5.''."\n";
break;
}
return $r;
}
/**
* add the opening ';
}
/**
* add the slide li with data attributes and so on
**/
public function add_slide_li_pre($index){
$slide = $this->get_slide();
//Html rev-main-
//echo RS_T6.''."\n";
echo RS_T6.'get_html_slide_key();
echo $this->get_html_slide_title();
echo $this->get_html_slide_description();
echo $this->get_thumb_url();
echo $this->get_slide_link();
echo $this->get_html_delay();
echo $this->get_html_scrollbased_slidedata();
echo $this->get_html_stop_slide();
echo $this->get_html_invisible();
echo $this->get_html_anim();
echo $this->get_html_random_animations();
echo $this->get_html_first_anim($index);
echo $this->get_html_slide_loop();
echo $this->get_html_media_filter();
echo $this->get_html_slide_class();
echo $this->get_html_slide_id();
echo $this->get_html_extra_data();
echo $this->get_html_hide_after_loop();
echo $this->get_html_hide_slide_mobile();
echo $this->get_html_extra_params();
echo $this->get_html_image_video_ratio();
do_action('revslider_add_li_data', $this->slider, $slide);
echo '>'."\n";
}
/**
* add the slide closing li
**/
public function add_slide_li_post(){
echo RS_T6.''."\n";
}
/**
* add the static slide layer HTML
**/
public function add_static_slide_html(){
$static_slide = $this->get_static_slide();
if($this->get_do_static() && !empty($static_slide)){
$this->is_static = true;
$this->set_slide_id($static_slide->get_id());
$layers = $static_slide->get_layers();
$this->set_layers($layers);
if(!empty($layers)){
$sof = $static_slide->get_param(array('static', 'overflow'), '');
$sof = (!empty($sof) && $sof == 'hidden') ? ' style="overflow:hidden;width:100%;height:100%;top:0px;left:0px;"' : '';
$slp = $static_slide->get_param(array('static', 'position'), 'front');
$slp = (!empty($slp) && $slp === 'back') ? ' class="rs-stl-back"' : '';
//check for static layers
echo RS_T5.''."\n";
}
$this->is_static = false;
}
}
/**
* add the slide li with data attributes and so on
**/
public function add_slide_main_image(){
$img = $this->get_image_data();
if(!empty($img) && is_array($img)){
//echo RS_T7.''."\n";
echo RS_T7.' $v){
echo (trim($v) !== '') ? ' '.$k.'="'.$v.'"' : '';
}
echo ' class="rev-slidebg" data-no-retina>'."\n";
}
}
/**
* get image params to be used later on the background image
**/
public function get_image_data(){
$slide = $this->get_slide();
$bg_type = $slide->get_param(array('bg', 'type'), 'trans');
$url_trans = RS_PLUGIN_URL.'public/assets/assets/transparent.png';
$img = array('id' => false, 'src' => '', 'alt' => '', 'style' => '', 'title' => '', 'parallax' => '', 'panzoom' => '', 'width' => '', 'height' => '', 'bg' => '', 'lazyload' => '');
if($bg_type != 'external'){
$img['src'] = $slide->image_url;
$img['id'] = $slide->image_id;
switch($slide->get_param(array('attributes', 'altOption'), $slide->get_param(array('attributes', 'titleOption'), 'media_library'))){
case 'media_library':
default:
$img['alt'] = get_post_meta($img['id'], '_wp_attachment_image_alt', true);
break;
case 'file_name':
$info = pathinfo($slide->image_filename);
$img['alt'] = $this->get_val($info, 'filename');
break;
case 'custom':
$img['alt'] = esc_attr($slide->get_param(array('attributes', 'alt'), ''));
break;
}
switch($slide->get_param(array('attributes', 'titleOption'), 'media_library')){
case 'media_library':
default:
$img['title'] = get_the_title($img['id']);
break;
case 'file_name':
$info = pathinfo($slide->image_filename);
$img['title'] = $this->get_val($info, 'filename');
break;
case 'custom':
$img['title'] = esc_attr($slide->get_param(array('attributes', 'title'), ''));
break;
}
if($img['id'] !== false){
$data = wp_get_attachment_metadata($img['id']);
if($data !== false && !empty($data)){
$size = $slide->get_param(array('bg', 'imageSourceType'), 'full'); //$this->slider->get_param(array('def', 'background', 'imageSourceType'), 'full')
if($size !== 'full'){
if(isset($data['sizes']) && isset($data['sizes'][$size])){
$img['width'] = (isset($data['sizes'][$size]['width'])) ? $data['sizes'][$size]['width'] : '';
$img['height'] = (isset($data['sizes'][$size]['height'])) ? $data['sizes'][$size]['height'] : '';
}
}
if($img['width'] == '' || $img['height'] == ''){
$img['width'] = (isset($data['width'])) ? $data['width'] : '';
$img['height'] = (isset($data['height'])) ? $data['height'] : '';
}
}
}
}else{
$img['src'] = esc_url($slide->get_param(array('bg', 'externalSrc'), ''));
$img['alt'] = esc_attr($slide->get_param(array('attributes', 'alt'), ''));
$img['title'] = esc_attr($slide->get_param(array('attributes', 'title'), ''));
$img['width'] = $slide->get_param(array('bg', 'width'), '1920');
$img['height'] = $slide->get_param(array('bg', 'height'), '1080');
}
switch($bg_type){
case 'trans':
case 'transparent':
case 'solid':
$img['src'] = $url_trans;
if(isset($img['alt']) && trim($img['alt']) === ''){
$img['alt'] = $this->get_html_slide_title(true);
$img['alt'] = (empty($img['alt'])) ? __('Slide Background', 'revslider') : $img['alt'];
}
break;
}
if(isset($slide->ignore_alt)) $img['alt'] = '';
$img['src'] = (trim($img['src']) == '') ? $url_trans : $img['src']; //go back to transparent if img is empty
$img['data-lazyload']= ($this->slider->get_param(array('general', 'lazyLoad'), false) != 'none') ? $this->remove_http($img['src']) : '';
$img['src'] = ($this->slider->get_param(array('general', 'lazyLoad'), false) != 'none') ? RS_PLUGIN_URL.'public/assets/assets/dummy.png' : $img['src'];
$img['src'] = $this->remove_http($img['src']);
$img['data-bg'] = $this->get_image_background_values();
$img['data-parallax']= $this->get_html_parallax();
$img['data-panzoom'] = $this->get_html_pan_zoom();
unset($img['id']);
return $img;
}
/**
* get data-bg image background values
**/
public function get_image_background_values(){
$slide = $this->get_slide();
$bg = '';
$pos = $this->get_background_position();
$f_r = $this->get_background_fit_and_repeat();
$c = ($slide->get_param(array('bg', 'type'), 'trans') == 'solid') ? RSColorpicker::get($slide->get_param(array('bg', 'color'), '#ffffff')) : '';
$c = ($c == '' && $slide->get_param(array('bg', 'type'), 'trans') == 'solid') ? '#ffffff' : $c; //force white here as we need it in frontend
$bg .= (!in_array($pos, array('', '50%', '50% 50%', 'center center', 'center'), true)) ? 'p:'.$pos.';' : '';
$bg .= ($c !== '' && $c !== 'transparent') ? 'c:'.$c.';' : '';
$bg .= ($f_r['f'] !== '' && $f_r['f'] !== 'cover') ? 'f:'.$f_r['f'].';' : '';
$bg .= ($f_r['r'] !== '' && $f_r['r'] !== 'no-repeat') ? 'r:'.$f_r['r'].';' : '';
return $bg;
}
/**
* get the parallax html
**/
public function get_html_parallax(){
$slide = $this->get_slide();
$parallax = '';
if($this->slider->get_param(array('parallax', 'set'), false) == true){
$slide_level = $slide->get_param(array('effects', 'parallax'), '-');
if($slide_level == '-') $slide_level = 'off';
$parallax = $slide_level;
}
return $parallax;
}
/**
* get ken burns html data
**/
public function get_html_pan_zoom(){
$slide = $this->get_slide();
$bg_type = $slide->get_param(array('bg', 'type'), 'trans');
$pan = '';
if($slide->get_param(array('panzoom', 'set'), false) == true && ($bg_type == 'image' || $bg_type == 'external')){
$d = $slide->get_param(array('panzoom', 'duration'), '10000');
$e = $slide->get_param(array('panzoom', 'ease'), 'none');
$this->easings[$e] = $e;
$ss = $slide->get_param(array('panzoom', 'fitStart'), '100');
$se = $slide->get_param(array('panzoom', 'fitEnd'), '100');
$rs = $slide->get_param(array('panzoom', 'rotateStart'), '0');
$re = $slide->get_param(array('panzoom', 'rotateEnd'), '0');
$bs = $slide->get_param(array('panzoom', 'blurStart'), '0');
$be = $slide->get_param(array('panzoom', 'blurEnd'), '0');
$os = $slide->get_param(array('panzoom', 'xStart'), '0').'/'.$slide->get_param(array('panzoom', 'yStart'), '0');
$oe = $slide->get_param(array('panzoom', 'xEnd'), '0').'/'.$slide->get_param(array('panzoom', 'yEnd'), '0');
$pan .= ($d !== '') ? 'd:'.$d.';' : '';
$pan .= ($e !== 'none') ? 'e:'.$e.';' : '';
$pan .= 'ss:'.$ss.';';
$pan .= 'se:'.$se.';';
$pan .= ($rs !== '0') ? 'rs:'.$rs.';' : '';
$pan .= ($re !== '0') ? 're:'.$re.';' : '';
$pan .= ($bs !== '0') ? 'bs:'.$bs.';' : '';
$pan .= ($be !== '0') ? 'be:'.$be.';' : '';
$pan .= ($os !== '0/0') ? 'os:'.$os.';' : '';
$pan .= ($oe !== '0/0') ? 'oe:'.$oe.';' : '';
}
return $pan;
}
/**
* get background position for the image
**/
public function get_background_position(){
$slide = $this->get_slide();
$pos = $slide->get_param(array('bg', 'position'), 'center center'); //$this->slider->get_param(array('def', 'background', 'position'),
$type = $slide->get_param(array('bg', 'type'), 'trans');
if($type == 'streamvimeoboth' || $type == 'streamyoutubeboth' || $type == 'streaminstagramboth' || $type == 'streamtwitterboth'){
$pos = ($this->check_if_stream_video_exists()) ? 'center center' : $pos;
}else{
$pos = ($type == 'youtube' || $type == 'vimeo' || $type == 'html5' || $type == 'streamvimeo' || $type == 'streamyoutube' || $type == 'streaminstagram' || $type == 'streamtwitter') ? 'center center' : $pos;
}
$pos = ($pos == 'percentage') ? intval($slide->get_param(array('bg', 'positionX'), '0')).'% '.intval($slide->get_param(array('bg', 'positionY'), '0')).'%' : $pos; //$this->slider->get_param(array('def', 'background', 'positionX'), '0') $this->slider->get_param(array('def', 'background', 'positionY'), '0')
return $pos;
}
/**
* get image fit and repeat params
**/
public function get_background_fit_and_repeat(){
$slide = $this->get_slide();
$bg_type = $slide->get_param(array('bg', 'type'), 'trans');
$return = array('f' => '', 'r' => '');
if(!($slide->get_param(array('panzoom', 'set'), false) == true && ($bg_type == 'image' || $bg_type == 'external'))){ //only set if kenburner is off and not a background video //$this->slider->get_param(array('def', 'panZoom', 'set'), false)
if($bg_type == 'youtube' || $bg_type == 'html5' || $bg_type == 'vimeo' || $bg_type == 'streamvimeo' || $bg_type == 'streamyoutube' || $bg_type == 'streaminstagram' || $bg_type == 'streamtwitter'){
$return['f'] = 'cover';
}else{
//additional background params
$bgFit = $slide->get_param(array('bg', 'fit'), 'cover'); //$this->slider->get_param(array('def', 'background', 'fit'), 'cover')
$return['f'] = ($bgFit == 'percentage') ? intval($slide->get_param(array('bg', 'fitX'), '100')).'% '.intval($slide->get_param(array('bg', 'fitY'), '100')).'%' : $bgFit; //$this->slider->get_param(array('def', 'background', 'fitX'), '100') $this->slider->get_param(array('def', 'background', 'fitY'), '100')
$return['r'] = $slide->get_param(array('bg', 'repeat'), 'no-repeat'); //$this->slider->get_param(array('def', 'background', 'repeat'), 'no-repeat')
}
}
return $return;
}
/**
* set slide specific values that are needed by layers
* this is needed to be called before any layer is added to the stage
**/
public function set_slide_params_for_layers(){
$slide = $this->get_slide();
$this->set_slide_id($slide->get_id());
$this->set_layers($slide->get_layers());
}
/**
* add background video if one is selected
**/
public function add_background_video(){
$slide = $this->get_slide();
$type = $slide->get_param(array('bg', 'type'), 'trans');
//check if we are youtube, vimeo or html5
if($type == 'youtube' || $type == 'html5' || $type == 'vimeo' || $type == 'streamvimeo' || $type == 'streamyoutube' || $type == 'streaminstagram' || $type == 'streamtwitter'){
$this->add_html_background_video();
}
if($type == 'streamvimeoboth' || $type == 'streamyoutubeboth' || $type == 'streaminstagramboth' || $type == 'streamtwitterboth'){
if($this->check_if_stream_video_exists()) $this->add_html_background_video();
}
}
/**
* Add Groups with columns and the layers of it
* @since: 5.3.0
* @before: RevSliderOutput::putCreativeZones()
*/
public function add_zones(){
$layers = $this->get_layers();
if(empty($layers)) return false;
$this->container_mode = '';
$zones = array('t' => 'top', 'm' => 'middle', 'b' => 'bottom');
$enabled_sizes = array('d' => true, 'n' => false, 't' => false, 'm' => false);
foreach($zones as $zs => $zone){ //go through all three zones
foreach($layers as $layer){
if($this->get_val($layer, 'type', 'text') !== 'row') continue; //we only want to handle rows here to get the zones we need to create
$this->row_zindex = 0;
$layer_zone = $this->get_val($layer, array('group', 'puid'), 'top');
if($layer_zone !== $zone) continue; //wrong zones, so continue
$this->increase_layer_depth();
//we have found a zone, now fill it with rows, columns, layers
ob_start(); //fetch the data, as we need to set the z-index on the rows
$this->add_rows($layer_zone);
$row_layers = ob_get_contents();
ob_clean();
ob_end_clean();
//get the zone z-index from the zone layer
$zi = $this->get_val($layers, array($zone, 'position', 'zIndex'), $this->row_zindex);
$this->decrease_layer_depth();
echo RS_T6. $this->add_closing_comment() .'';
echo $this->add_opening_comment()."\n";
echo $row_layers;
echo RS_T7.$this->add_closing_comment().''.$this->add_opening_comment()."\n";
break; //zone is written, go to the next one
}
}
}
/**
* Add Groups with columns and the layers of it
* @since: 5.3.0
* @before: RevSliderOutput::putCreativeGroups()
*/
public function add_groups(){
$layers = $this->get_layers();
if(empty($layers)) return false;
$enabled_sizes = array('d' => true, 'n' => false, 't' => false, 'm' => false);
foreach($layers as $layer){
if($this->get_val($layer, 'type', 'text') !== 'group') continue; //we only want to handle groups here to get the zones we need to create
$this->container_mode = '';
$uid = $this->get_val($layer, 'uid');
$this->set_layer($layer);
$this->add_layer(true, 'group'); //add the group layer
$this->container_mode = 'group';
$this->increase_layer_depth();
$this->add_group_layer($uid); //add all layers that are in the group
$this->decrease_layer_depth();
echo $this->ld().RS_T7.'-->'.$this->add_opening_comment()."\n";
}
}
/**
* put creative layer
* @before: RevSliderOutput::putCreativeLayer()
*/
private function add_creative_layer(){
$layers = $this->get_layers();
if(empty($layers)) return false;
$layers = apply_filters('revslider_putCreativeLayer', $layers, $this, $this->is_static);
$this->container_mode = '';
foreach($layers as $layer){
if((string)$this->get_val($layer, array('group', 'puid'), '-1') !== '-1') continue; //dont do group layer
$this->set_layer($layer);
$this->add_layer(false);
}
}
/**
* Add all Layers that are in the group with $u_id
* @since: 5.3.0
* @before: RevSliderOutput::putCreativeGroupLayer();
*/
public function add_group_layer($u_id){
$layers = $this->get_layers();
foreach($layers as $layer){
$p_uid = $this->get_val($layer, array('group', 'puid'));
$uid = $this->get_val($layer, array('group', 'uid'));
if((string)$u_id !== (string)$p_uid) continue;
if((string)$u_id === (string)$uid) continue;
$this->set_layer($layer);
$this->add_layer(true); //add the layer into the group
}
}
/**
* Add Groups with columns and the layers of it
* @since: 5.3.0
* @before: RevSliderOutput::putCreativeRows()
*/
public function add_rows($current_zone){
$layers = $this->get_layers();
if(empty($layers)) return false;
$enabled_sizes = array('d' => true, 'n' => false, 't' => false, 'm' => false);
$row_layer = array();
$go = 9999;
foreach($layers as $layer){
if($this->get_val($layer, 'type', 'text') !== 'row') continue; //we only want to handle rows here of the current zone and add them as a rows
if($this->get_val($layer, array('group', 'puid'), 'top') !== $current_zone) continue; //wrong zones, so continue
$order = $this->get_val($layer, array('group', 'groupOrder'));
if($order === ''){ // || isset($row_layer[$order])
$order = $go;
$go++;
}
$zi = $this->get_val($layer, array('position', 'zIndex'), false); // set the z-index so that the wrapper gains the highest one
$zi = ($zi === false) ? $this->zIndex : $zi;
if($zi > $this->row_zindex){
$this->row_zindex = $zi;
}
$row_layer[$order] = $layer;
}
if(!empty($row_layer)){
ksort($row_layer); //sort the rows
foreach($row_layer as $layer){
$uid = $this->get_val($layer, 'uid');
$this->set_layer($layer);
$this->add_layer(true, 'row');
$this->container_mode = 'row';
$this->increase_layer_depth();
$this->add_column($uid);
$this->decrease_layer_depth();
echo $this->ld().RS_T7.$this->add_closing_comment().''.$this->add_opening_comment()."\n";//as we have used 'row' in the add_layer() function, it does not print the closing > and we have to do it here
}
}
}
/**
* Add Columns with the layers
* @since: 5.3.0
* @before: RevSliderOutput::putCreativeColumn()
*/
public function add_column($uid){
$layers = $this->get_layers();
if(empty($layers)) return false;
$column_layers = array();
$go = 9999;
foreach($layers as $layer){
$this->container_mode = 'row';
if($this->get_val($layer, 'type', 'text') !== 'column') continue; //we only want to handle columns here of the current row
if((string)$this->get_val($layer, array('group', 'puid'), -1) !== (string)$uid) continue; //has the wrong row ID
$_go = $this->get_val($layer, array('group', 'groupOrder'));
if($_go === ''){ // || isset($column_layers[$_go])
$_go = $go;
$go++;
}
$column_layers[$_go] = $layer;
}
if(!empty($column_layers)){
ksort($column_layers);
foreach($column_layers as $layer){
$this->container_mode = 'row';
$this->set_layer($layer);
$this->add_layer(true, 'column');
$cuid = (string)$this->get_val($layer, 'uid', -1);
//add layers here
$group_layers = array();
$go = 9999;
foreach($layers as $nlayer){
if((string)$this->get_val($nlayer, array('group', 'puid'), -1) !== $cuid) continue;
$_go = $this->get_val($nlayer, array('group', 'groupOrder'));
if($_go === ''){ // || isset($group_layers[$_go])
$_go = $go;
$go++;
}
$group_layers[$_go] = $nlayer;
}
$this->container_mode = 'column';
//sort now the $group_layers
if(!empty($group_layers)){
ksort($group_layers);
$this->increase_layer_depth();
foreach($group_layers as $nlayer){
$this->set_layer($nlayer);
$this->add_layer(true);
}
$this->decrease_layer_depth();
}
echo $this->ld().RS_T7.$this->add_closing_comment().''.$this->add_opening_comment();
echo "\n"; //as we have used 'column' in the add_layer() function, it does not print the closing > and we have to do it here
}
}
}
/**
* returns the HTML layer type
*/
public function get_html_layer_type(){
$layer = $this->get_layer();
$type = $this->get_val($layer, 'type', 'text');
return 'data-type="'.esc_attr($type).'"';
}
/**
* return the layer Type for further needs
*/
public function get_layer_type() {
$layer = $this->get_layer();
return $this->get_val($layer, 'type', 'text');
}
/**
* Adds a Layer to the stage
* Moved most code part from putCreativeLayer into putLayer
* @since: 5.3.0
* @before: RevSliderOutput::putLayer()
*/
public function add_layer($row_group_uid = false, $special_type = false){
$layer = apply_filters('revslider_putLayer_pre', $this->get_layer(), $this, $row_group_uid, $this->is_static, $special_type);
$this->set_layer($layer);
$this->set_layer_unique_id();
/**
* top middle and bottom are placeholder layers, do not write them
**/
if(in_array($this->get_layer_unique_id(), array('top', 'middle', 'bottom'), true)) return '';
//$this->push_layer_class();
$check_continue = $this->check_layer_continue($special_type, $row_group_uid);
if(!$check_continue) return false;
$check_continue = $this->check_layer_video_continue();
if(!$check_continue) return false;
$html_type = $this->get_html_layer_type();
$class = $this->get_layer_class();
$html_simple_link = $this->get_action_link();
$html_responsive = $this->get_html_responsive();
$html_transform = $this->get_html_transform();
$html_responsive_data = $this->get_html_responsive_data();
$html_scrollbased_data = $this->get_html_scrollbased_data();
$html_resp_offset = $this->get_html_responsive_offset();
$ids = $this->get_html_layer_ids();
$html_title = $this->get_html_title();
$html_tabindex = $this->get_html_tab_index();
$html_rel = $this->get_html_rel();
$position = $this->get_html_layer_position();
$html_text = $this->get_html_text_data();
$html_float = $this->get_float_clear_data();
$html_color = $this->get_html_color_data();
$html_box_shadow = $this->get_html_box_shadow_data();
$html_text_shadow = $this->get_html_text_shadow_data();
$html_dimension = $this->get_html_dim_data();
$html_visibility = $this->get_html_layer_device_visibility();
$html_column_break = $this->get_html_column_break();
$layer_actions = $this->get_html_layer_action($html_simple_link);
$layer_tag = $this->get_layer_tag($html_simple_link, $special_type);
$html_class = $this->get_html_class($class, $layer_tag);
$html_svg = $this->get_html_svg();
$html_base_align = $this->get_html_base_align();
$html_wrapper_ids = $this->get_html_wrapper_ids();
$html_wrapper_classes = $this->get_html_wrapper_classes();
$html_static_data = $this->get_html_static_layer();
$html_static_pos_data = $this->get_html_static_position_layer();
$html_trigger = $this->get_html_trigger();
$html_clip = $this->get_html_clip();
$frames = $this->get_frames();
$html_frames = $this->get_html_frames($frames);
$html_frameorder = $this->get_html_frameorder();
$html_blendmode = $this->get_html_blendmode();
$html_hideunder = $this->get_html_hideunder();
$html_audio_data = $this->get_html_audio_data();
$html_video_data = $this->get_html_video_data();
$html_column_data = $this->get_html_column_data();
$html_margin_data = $this->get_html_margin_data($row_group_uid);
$html_padding_data = $this->get_html_padding_data();
$html_border_data = $this->get_html_border_data();
$html_inline_style = $this->get_html_inline_style();
$html_spike_data = $this->get_html_spike_data();
$html_text_stroke = $this->get_html_text_stroke();
//$html_togglehover = $this->get_html_togglehover();
$html_bg_image = $this->get_background_image();
$loop_data = $this->get_loop_data();
$toggle_data = $this->get_toggle_data();
$html_corners = $this->get_html_corners();
$html_disp = $this->get_html_disp();
$html_layer = $this->get_html_layer();
$layertype = $this->get_layer_type();
$this->create_style_hover();
echo "\n";
echo $this->ld().RS_T7.$this->add_closing_comment();
echo '<'.$layer_tag."\n";
echo ($ids != '') ? $this->ld().RS_T8.$ids." \n" : '';
echo ($html_class !== '') ? $this->ld().RS_T8.$html_class."\n" : '';
echo ($html_simple_link !== '') ? $this->ld().RS_T8.$html_simple_link."\n" : '';
echo $this->ld().RS_T8.$html_type."\n";
echo ($html_color !== '') ? $this->ld().RS_T8.$html_color."\n" : '';
echo ($html_box_shadow !== '') ? $this->ld().RS_T8.$html_box_shadow."\n" : '';
echo ($html_text_shadow !== '') ? $this->ld().RS_T8.$html_text_shadow."\n" : '';
echo ($html_responsive !== '') ? $this->ld().RS_T8.$html_responsive."\n" : '';
echo ($html_title != '') ? $this->ld().RS_T8.$html_title."\n" : '';
echo ($html_tabindex != '') ? $this->ld().RS_T8.$html_tabindex."\n" : '';
echo ($html_rel != '') ? $this->ld().RS_T8.$html_rel."\n" : '';
echo ($position != '') ? $this->ld().RS_T8.$position."\n" : '';
echo ($html_text != '') ? $this->ld().RS_T8.$html_text."\n" : '';
echo ($html_float != '') ? $this->ld().RS_T8.$html_float."\n" : '';
echo ($html_dimension != '') ? $this->ld().RS_T8.$html_dimension."\n" : '';
echo ($html_spike_data != '') ? $this->ld().RS_T8.$html_spike_data."\n" : '';
echo ($html_text_stroke != '') ? $this->ld().RS_T8.$html_text_stroke."\n" : '';
echo ($html_visibility != '') ? $this->ld().RS_T8.$html_visibility."\n" : '';
echo ($html_column_break != '') ? $this->ld().RS_T8.$html_column_break."\n" : '';
echo ($layer_actions != '') ? $this->ld().RS_T8.$layer_actions."\n" : '';
echo ($html_svg != '') ? $this->ld().RS_T8.$html_svg : '';
echo ($html_base_align != '') ? $this->ld().RS_T8.$html_base_align."\n" : '';
echo ($html_resp_offset != '') ? $this->ld().RS_T8.$html_resp_offset."\n" : '';
echo ($html_wrapper_ids != '') ? $this->ld().RS_T8.$html_wrapper_ids."\n" : '';
echo ($html_wrapper_classes != '') ? $this->ld().RS_T8.$html_wrapper_classes."\n" : '';
echo ($html_responsive_data != '') ? $this->ld().RS_T8.$html_responsive_data."\n" : '';
echo ($html_transform != '') ? $this->ld().RS_T8.$html_transform."\n" : '';
echo ($html_scrollbased_data != '') ? $this->ld().RS_T8.$html_scrollbased_data."\n" : '';
echo ($html_static_data != '') ? $this->ld().RS_T8.$html_static_data."\n" : '';
echo ($html_static_pos_data != '') ? $this->ld().RS_T8.$html_static_pos_data."\n" : '';
echo ($html_trigger != '') ? $this->ld().RS_T8.$html_trigger."\n" : '';
echo ($html_blendmode != '') ? $this->ld().RS_T8.$html_blendmode."\n" : '';
//echo ($html_togglehover != '') ? $this->ld().RS_T8.$html_togglehover."\n" : '';
echo ($html_hideunder != '') ? $this->ld().RS_T8.$html_hideunder."\n" : '';
echo ($html_corners != '') ? $this->ld().RS_T8.$html_corners."\n" : '';
echo ($html_disp != '') ? $this->ld().RS_T8.$html_disp."\n" : '';
echo ($html_audio_data != '') ? $html_audio_data : '';
echo ($html_video_data != '') ? $html_video_data : ''; //$this->ld().RS_T8. ."\n"
echo ($html_column_data != '') ? $this->ld().RS_T8.$html_column_data."\n" : '';
echo ($html_margin_data != '') ? $this->ld().RS_T8.$html_margin_data."\n" : '';
echo ($html_padding_data != '') ? $this->ld().RS_T8.$html_padding_data."\n" : '';
echo ($html_border_data != '') ? $this->ld().RS_T8.$html_border_data."\n" : '';
echo ($html_frameorder != '') ? $this->ld().RS_T8.$html_frameorder."\n" : '';
echo ($html_clip != '') ? $this->ld().RS_T8.$html_clip."\n" : '';
echo ($html_frames != '') ? $this->ld().RS_T8.$html_frames : '';
if(!empty($loop_data)){
foreach($loop_data as $ldk => $ld){
echo ($ld !== '') ? $this->ld().RS_T8.'data-'.$ldk.'="'.$ld.'"'."\n" : '';
}
}
do_action('revslider_add_layer_attributes', $layer, $this->slide, $this->slider, $this);
echo $this->ld().RS_T8.'style="';
echo $html_inline_style;
//echo $html_idle_style;
echo '"'."\n";
echo $this->ld().RS_T7.'>';//."\n";
echo ($html_bg_image !== '') ? $html_bg_image."\n" : '';
if($special_type !== false){
echo $this->add_opening_comment();
}
if($toggle_data['allow'] === true){
echo "\n".$this->ld().RS_T8.'';
}
echo ($special_type === false && $layertype !== 'video') ? apply_filters('revslider_layer_content', stripslashes($html_layer), $html_layer, $this->slider->get_id(), $this->slide, $layer).' ' : '';
if($toggle_data['allow'] === true){
echo '
';
echo "\n".$this->ld().RS_T8.''.stripslashes($toggle_data['html']).'
';
}
if($special_type === false){
echo "\n".$this->ld().RS_T7.''.$layer_tag.'>'.$this->add_opening_comment()."\n";
} //the closing will be written later, after all layers/columns are added //
$this->zIndex++;
}
/**
* check if the layer is okay to be added or if we should move to the next layer
**/
public function check_layer_continue($special_type, $row_group_uid){
$layer = $this->get_layer();
$type = $this->get_val($layer, 'type', 'text');
//if($this->get_val($layer, array('visibility', 'visible'), true); == false) return false;
switch($type){
case 'row':
if($special_type !== 'row') return false;
break;
case 'group':
if($special_type !== 'group') return false;
break;
case 'column':
if($special_type !== 'column') return false;
break;
}
if($row_group_uid == false && $this->is_in_group_or_row()){
return false; //if we are not in a row or group and the layer is in one, return false
}
return true;
}
/**
* check if the layer is okay to be added or if we should move to the next layer
**/
public function check_layer_video_continue(){
$layer = $this->get_layer();
if($this->get_val($layer, 'type', 'text') !== 'video') return true;
$video_type = trim($this->get_val($layer, array('media', 'mediaType')));
$video_type = ($video_type === '') ? 'html5' : $video_type;
if(!in_array($video_type, array('streamyoutube', 'streamyoutubeboth', 'youtube', 'streamvimeo', 'streamvimeoboth', 'vimeo', 'streaminstagram', 'streaminstagramboth', 'html5'), true)) return true;
$vid = trim($this->get_val($layer, array('media', 'id')));
switch($video_type){
case 'streaminstagram':
case 'streaminstagramboth':
case 'html5':
$ogv = trim($this->get_val($layer, array('media', 'ogvUrl'), ''));
$webm = trim($this->get_val($layer, array('media', 'webmUrl'), ''));
$mp4 = trim($this->remove_http($this->get_val($layer, array('media', 'mp4Url'), '')));
if(empty($ogv) && empty($webm) && empty($mp4)){
$vid = trim($this->get_val($layer, array('media', 'id')));
$vid = ($this->get_val($layer, array('media', 'videoFromStream'), false) === true) ? $this->slide->get_param(array('bg', 'mpeg'), '') : $vid;
return (empty($vid)) ? false : true;
}
return true;
break;
case 'youtube':
case 'streamyoutube':
case 'streamyoutubeboth':
$vid = (in_array($video_type, array('streamyoutube', 'streamyoutubeboth'), true)) ? $this->slide->get_param(array('bg', 'youtube'), '') : $vid; //change $vid to the stream!
$vid = ($this->get_val($layer, array('media', 'videoFromStream'), false) === true) ? $this->slide->get_param(array('bg', 'youtube'), '') : $vid;
return (empty($vid)) ? false : true;
break;
case 'vimeo':
case 'streamvimeo':
case 'streamvimeoboth':
$vid = (in_array($video_type, array('streamvimeo', 'streamvimeoboth'), true)) ? $this->slide->get_param(array('bg', 'vimeo'), '') : $vid;
$vid = ($this->get_val($layer, array('media', 'videoFromStream'), false) === true) ? $this->slide->get_param(array('bg', 'vimeo'), '') : $vid;
return (empty($vid)) ? false : true;
break;
}
return (empty($vid)) ? false : true;
}
/**
* push the current layer class into the class usage array
**/
/*public function push_layer_class(){
$layer = $this->get_layer();
$class = trim($this->get_val($layer, array('idle', 'style')));
if($class !== ''){
$this->classes['.'.$class] = true; //add classname for style inclusion
if(!isset($this->in_class_usage[$class])) $this->in_class_usage[$class] = $this->get_captions_content($class);
}
}*/
/**
* get the simple link that can be inside the actions of a layer
**/
public function get_action_link(){
$link = '';
$layer = $this->get_layer();
$action = $this->get_val($layer, array('actions', 'action'), array());
if(!empty($action)){
foreach($action as $act){
// these are needed for the Social Share AddOn
$action_type = apply_filters('rs_action_type', $this->get_val($act, 'action'));
$link_type = apply_filters('rs_action_link_type', $this->get_val($act, 'link_type', ''));
if($action_type === 'menu'){
$http = $this->get_val($act, 'link_help_in', 'keep');
$menu_link = $this->remove_http($this->get_val($act, 'menu_link', ''), $http);
$menu_link = do_shortcode($menu_link);
$link_open_in = $this->get_val($act, 'link_open_in', '');
$link_follow = $this->get_val($act, 'link_follow', '');
$link = 'href="'.$menu_link.'"';
$link .= ($link_open_in !== '') ? ' target="'.$link_open_in.'"' : '';
if($link_follow === 'nofollow'){
$link .= ' rel="nofollow';
$link .= ($link_open_in === '_blank') ? ' noopener' : '';
$link .= '"';
}else{
$link .= ($link_open_in === '_blank') ? ' rel="noopener"' : '';
}
break;
}
if($action_type === 'link'){
if($link_type !== 'jquery'){
$http = $this->get_val($act, 'link_help_in', 'keep');
$image_link = $this->remove_http($this->get_val($act, 'image_link', ''), $http);
$image_link = do_shortcode($image_link);
$link_open_in = $this->get_val($act, 'link_open_in', '');
$link_follow = $this->get_val($act, 'link_follow', '');
$link = 'href="'.$image_link.'"';
$link .= ($link_open_in !== '') ? ' target="'.$link_open_in.'"' : '';
if($link_follow === 'nofollow'){
$link .= ' rel="nofollow';
$link .= ($link_open_in === '_blank') ? ' noopener' : '';
$link .= '"';
}else{
$link .= ($link_open_in === '_blank') ? ' rel="noopener"' : '';
}
}
break;
}
}
}
return $link;
}
/**
* get the layer tag as it can change through settings and others
**/
public function get_layer_tag($html_simple_link, $special_type = false){
$layer = $this->get_layer();
$tag = $this->get_val($layer, 'htmltag', 'rs-layer');
if($html_simple_link !== '') $tag = 'a';
if($special_type !== false) $tag = 'rs-'.$special_type; //if we are special type, only allow div to be the structure, as we will close with a div outside of this function
return ($tag !== 'div') ? $tag : 'rs-layer';
}
/**
* get the layer classes
**/
public function get_layer_class(){
$layer = $this->get_layer();
$type = $this->get_val($layer, 'type', 'text');
$class = array();
$acs = $this->get_val($layer, array('attributes', 'classes'), '');
if(strpos($acs, ' ') !== false){
$acs = explode(' ', $acs);
foreach($acs as $ac){
$class[] = $ac;
}
}else{
$class[] = $acs;
}
$idle_class = $this->get_val($layer, array('idle', 'style'), '');
$internal_class = $this->get_val($layer, array('runtime', 'internalClass'), '');
$selectable = $this->get_val($layer, array('idle', 'selectable'), 'default');
$svg = $this->get_val($layer, 'svg', false);
if($idle_class !== '') $class[] = $idle_class;
if($internal_class !== '') $class[] = $internal_class;
if($selectable !== 'default'){
if($this->_truefalse($selectable) == true) $class[] = 'rs-selectable';
}else{
if($this->slider->get_param(array('general', 'layerSelection'), false) == true) $class[] = 'rs-selectable';
}
if($this->get_val($layer, array('hover', 'pointerEvents'), 'auto') == 'none') $class[] = 'rs-noevents';
//make some modifications for the full screen video
if($this->is_full_width_video() == true) $class[] = 'rs-fsv';
if($this->get_val($layer, array('idle', 'overflow')) === 'hidden') $class[] = 'rs-ov-hidden';
if(!empty($svg)) $class[] = 'rs-svg';
if($type == 'video'){
switch(trim($this->get_val($layer, array('media', 'mediaType')))){
case 'streaminstagram':
case 'streaminstagramboth':
case 'html5':
if($this->get_val($layer, array('media', 'largeControls'), true) === false) $class[] = 'rs-nolc';
break;
}
}
if($this->slider->get_param(array('parallax', 'set', false)) == true){
$level = $this->get_val($layer, array('effects', 'parallax'), '-');
$level = ($this->slider->get_param(array('parallax', 'setDDD'), false) == true && $level == '-' && $this->get_val($layer, array('effects', 'attachToBg'), '') === true) ? 'tobggroup' : $level;
if($level !== '-') $class[] = 'rs-pxl-'.$level;
}
if($this->is_static) $class[] = 'rs-layer-static';
if($type == 'video') $class[] = 'rs-layer-video';
if($type == 'audio'){
$class[] = 'rs-layer-audio';
$visible = $this->get_val($layer, array('media', 'controls'), false);
if($visible === false) $class[] = 'rs-layer-hidden';
}
if($this->get_val($layer, array('visibility', 'onlyOnSlideHover'), false) === true){
$class[] = 'rs-on-sh';
}
if($this->slider->get_param('type', 'standard') === 'carousel'){
if($this->get_val($layer, array('visibility', 'alwaysOnCarousel'), false) === true){
$class[] = 'rs-on-car';
}
}
$add_intrinsic = false;
$text = strtolower($this->get_val($layer, 'text', ''));
$text_toggle = $this->get_val($layer, array('toggle', 'text'), '');
$tag = $this->get_val($layer, 'htmltag', 'rs-layer');
if($type == 'video') $add_intrinsic = true;
if(strpos($text, '