* @copyright 2007-2017 ETS-Soft * @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) * @version Release: $Revision$ * International Registered Trademark & Property of ETS-Soft */ if (!defined('_PS_VERSION_')) exit; if(!class_exists('ybc_themeconfig') && @file_exists(dirname(__FILE__).'/../ybc_themeconfig/ybc_themeconfig.php')) require_once(dirname(__FILE__).'/../ybc_themeconfig/ybc_themeconfig.php'); require_once(dirname(__FILE__).'/classes/MLS_Obj.php'); require_once(dirname(__FILE__).'/classes/MLS_Slide.php'); require_once(dirname(__FILE__).'/classes/MLS_Layer.php'); require_once(dirname(__FILE__).'/classes/MLS_Config.php'); class Ets_multilayerslider extends Module { private $_html; public $alerts; public static $slides; public static $layers; public static $blocks; public static $trans; public static $configs; public $is17 = false; public $googlefonts = array(); public function __construct() { $this->name = 'ets_multilayerslider'; $this->tab = 'front_office_features'; $this->version = '1.0.1'; $this->author = 'YBC-Theme'; $this->need_instance = 0; $this->module_key = '8e65fd095f1c6401c164005e976f7675'; $this->secure_key = Tools::encrypt($this->name); $this->bootstrap = true; parent::__construct(); $this->displayName = $this->l('Multi-layer slider PRO'); $this->description = $this->l('Visual drag and drop home page slideshow builder'); $this->ps_versions_compliancy = array('min' => '1.6.0.0', 'max' => _PS_VERSION_); $this->translates(); $this->registerHook('displayMLSConfigs'); if(version_compare(_PS_VERSION_, '1.7', '>=')) $this->is17 = true; $this->googlefonts[] = array( 'id_option' => '', 'name' => $this->l('THEME DEFAULT FONT'), ); if($fonts = Tools::jsonDecode(Tools::file_get_contents(dirname(__FILE__).'/data/google-font-list.json'),true)) { foreach($fonts as $font) { $temp = array( 'id_option' => $font['family'], 'name' => $font['family'], ); $this->googlefonts[] = $temp; } } $this->googlefonts = Tools::jsonDecode(Tools::file_get_contents(dirname(__FILE__).'/data/google-fonts.json'),true); if(!$this->googlefonts) { $this->googlefonts = array( array( 'id_option' => '', 'name' => $this->l('THEME DEFAULT FONT'), ), array( 'id_option' => 'Arial', 'name' => 'Arial', ), array( 'id_option' => 'Times new roman', 'name' => 'Times new roman', ), ); } $animation_in= array( array( 'id_option' => 'bounce', 'name' => $this->l('Bounce') ), array( 'id_option' => 'flash', 'name' => $this->l('Flash') ), array( 'id_option' => 'pulse', 'name' => $this->l('Pulse') ), array( 'id_option' => 'rubberBand', 'name' => $this->l('RubberBand') ), array( 'id_option' => 'shake', 'name' => $this->l('Shake') ), array( 'id_option' => 'swing', 'name' => $this->l('Swing') ), array( 'id_option' => 'tada', 'name' => $this->l('Tada') ), array( 'id_option' => 'wobble', 'name' => $this->l('Wobble') ), array( 'id_option' => 'jello', 'name' => $this->l('Jello') ), array( 'id_option' => 'bounceIn', 'name' => $this->l('Bounce in') ), array( 'id_option' => 'bounceInDown', 'name' => $this->l('Bounce in down') ), array( 'id_option' => 'bounceInLeft', 'name' => $this->l('Bounce in left') ), array( 'id_option' => 'bounceInRight', 'name' => $this->l('Bounce in right') ), array( 'id_option' => 'bounceInUp', 'name' => $this->l('Bounce in up') ), array( 'id_option' => 'fadeIn', 'name' => $this->l('Fade in') ), array( 'id_option' => 'fadeInDown', 'name' => $this->l('Fade in Down') ), array( 'id_option' => 'fadeInDownBig', 'name' => $this->l('Fade in down big') ), array( 'id_option' => 'fadeInLeft', 'name' => $this->l('Fade in left') ), array( 'id_option' => 'fadeInLeftBig', 'name' => $this->l('Fade in left big') ), array( 'id_option' => 'fadeInRight', 'name' => $this->l('Fade in right') ), array( 'id_option' => 'fadeInRightBig', 'name' => $this->l('Fade in right big') ), array( 'id_option' => 'fadeInUp', 'name' => $this->l('Fade in up') ), array( 'id_option' => 'fadeInUpBig', 'name' => $this->l('Fade in up big') ), array( 'id_option' => 'flip', 'name' => $this->l('Flip') ), array( 'id_option' => 'flipInX', 'name' => $this->l('Flip in X') ), array( 'id_option' => 'flipInY', 'name' => $this->l('Flip in Y') ), array( 'id_option' => 'lightSpeedIn', 'name' => $this->l('Light speed in') ), array( 'id_option' => 'rotateIn', 'name' => $this->l('Rotate in') ), array( 'id_option' => 'rotateInDownLeft', 'name' => $this->l('Rotate in down left') ), array( 'id_option' => 'rotateInDownRight', 'name' => $this->l('Rotate in down right') ), array( 'id_option' => 'rotateInUpLeft', 'name' => $this->l('Rotate in up left') ), array( 'id_option' => 'rotateInUpRight', 'name' => $this->l('Rotate in up right') ), array( 'id_option' => 'rotateZoomIn', 'name' => $this->l('Rotate Zoom In') ), array( 'id_option' => 'rotateYInLeft', 'name' => $this->l('Rotate In Left') ), array( 'id_option' => 'rotateXInRight', 'name' => $this->l('Rotate In Right') ), array( 'id_option' => 'rotateXInTop', 'name' => $this->l('Rotate X In top') ), array( 'id_option' => 'rotateZInLeft', 'name' => $this->l('Rotate Z In Left') ), array( 'id_option' => 'rotateZInRight', 'name' => $this->l('Rotate Z In right') ), array( 'id_option' => 'zoomInFlipVert', 'name' => $this->l('Zoom In Flip Vert') ), array( 'id_option' => 'zoomInFlipHoriz', 'name' => $this->l('Zoom In Flip Horiz') ), array( 'id_option' => 'slideInUp', 'name' => $this->l('Slide in up') ), array( 'id_option' => 'slideInDown', 'name' => $this->l('Slide in down') ), array( 'id_option' => 'slideInLeft', 'name' => $this->l('Slide in left') ), array( 'id_option' => 'slideInRight', 'name' => $this->l('Slide in right') ), array( 'id_option' => 'slideInCrossRightBottom', 'name' => $this->l('Slide in cross right bottom') ), array( 'id_option' => 'slideInCrossRightTop', 'name' => $this->l('Slide in cross right top') ), array( 'id_option' => 'slideInCrossLeftBottom', 'name' => $this->l('Slide in cross left bottom') ), array( 'id_option' => 'slideInCrossLeftTop', 'name' => $this->l('Slide in cross left top') ), array( 'id_option' => 'zoomIn', 'name' => $this->l('Zoom in') ), array( 'id_option' => 'zoomInDown', 'name' => $this->l('Zoom in down') ), array( 'id_option' => 'zoomInLeft', 'name' => $this->l('Zoom in left') ), array( 'id_option' => 'zoomInRight', 'name' => $this->l('Zoom in right') ), array( 'id_option' => 'zoomInUp', 'name' => $this->l('Zoom in up') ), array( 'id_option' => 'hinge', 'name' => $this->l('Hinge') ), array( 'id_option' => 'rollIn', 'name' => $this->l('RollIn') ), ); $animation_out= array( array( 'id_option' => 'bounce', 'name' => $this->l('Bounce') ), array( 'id_option' => 'flash', 'name' => $this->l('Flash') ), array( 'id_option' => 'pulse', 'name' => $this->l('Pulse') ), array( 'id_option' => 'rubberBand', 'name' => $this->l('RubberBand') ), array( 'id_option' => 'shake', 'name' => $this->l('Shake') ), array( 'id_option' => 'swing', 'name' => $this->l('Swing') ), array( 'id_option' => 'tada', 'name' => $this->l('Tada') ), array( 'id_option' => 'wobble', 'name' => $this->l('Wobble') ), array( 'id_option' => 'jello', 'name' => $this->l('Jello') ), array( 'id_option' => 'bounceOut', 'name' => $this->l('Bounce out') ), array( 'id_option' => 'bounceOutDown', 'name' => $this->l('Bounce out down') ), array( 'id_option' => 'bounceOutLeft', 'name' => $this->l('Bounce out left') ), array( 'id_option' => 'bounceOutRight', 'name' => $this->l('Bounce out right') ), array( 'id_option' => 'bounceOutUp', 'name' => $this->l('Bounce out up') ), array( 'id_option' => 'fadeOut', 'name' => $this->l('Fade out') ), array( 'id_option' => 'fadeOutDown', 'name' => $this->l('Fade out Down') ), array( 'id_option' => 'fadeOutDownBig', 'name' => $this->l('Fade out down big') ), array( 'id_option' => 'fadeOutLeft', 'name' => $this->l('Fade out left') ), array( 'id_option' => 'fadeOutLeftBig', 'name' => $this->l('Fade out left big') ), array( 'id_option' => 'fadeOutRight', 'name' => $this->l('Fade out right') ), array( 'id_option' => 'fadeOutRightBig', 'name' => $this->l('Fade out right big') ), array( 'id_option' => 'fadeOutUp', 'name' => $this->l('Fade out up') ), array( 'id_option' => 'fadeOutUpBig', 'name' => $this->l('Fade out up big') ), array( 'id_option' => 'flip', 'name' => $this->l('Flip') ), array( 'id_option' => 'flipOutX', 'name' => $this->l('Flip out X') ), array( 'id_option' => 'flipOutY', 'name' => $this->l('Flip out Y') ), array( 'id_option' => 'lightSpeedOut', 'name' => $this->l('Light speed out') ), array( 'id_option' => 'rotateOut', 'name' => $this->l('Rotate out') ), array( 'id_option' => 'rotateOutDownLeft', 'name' => $this->l('Rotate out down left') ), array( 'id_option' => 'rotateOutDownRight', 'name' => $this->l('Rotate out down right') ), array( 'id_option' => 'rotateOutUpLeft', 'name' => $this->l('Rotate out up left') ), array( 'id_option' => 'rotateOutUpRight', 'name' => $this->l('Rotate out up right') ), array( 'id_option' => 'rotateZoomOut', 'name' => $this->l('Rotate Zoom Out') ), array( 'id_option' => 'rotateYOutLeft', 'name' => $this->l('Rotate OutLeft') ), array( 'id_option' => 'rotateXOutRight', 'name' => $this->l('Rotate Out Right') ), array( 'id_option' => 'rotateXOutTop', 'name' => $this->l('Rotate X Out top') ), array( 'id_option' => 'rotateXOutBottom', 'name' => $this->l('Rotate X Out Bottom') ), array( 'id_option' => 'rotateZOutLeft', 'name' => $this->l('Rotate Z Out Left') ), array( 'id_option' => 'rotateZOutRight', 'name' => $this->l('Rotate Z Out right') ), array( 'id_option' => 'zoomOutFlipVert', 'name' => $this->l('Zoom Out Flip Vert') ), array( 'id_option' => 'zoomOutFlipHoriz', 'name' => $this->l('Zoom Out Flip Horiz') ), array( 'id_option' => 'slideOutUp', 'name' => $this->l('Slide out up') ), array( 'id_option' => 'slideOutDown', 'name' => $this->l('Slide out down') ), array( 'id_option' => 'slideOutLeft', 'name' => $this->l('Slide out left') ), array( 'id_option' => 'slideOutRight', 'name' => $this->l('Slide out right') ), array( 'id_option' => 'slideOutCrossRightBottom', 'name' => $this->l('Slide out cross right bottom') ), array( 'id_option' => 'slideOutCrossRightTop', 'name' => $this->l('Slide out cross right top') ), array( 'id_option' => 'slideOutCrossLeftBottom', 'name' => $this->l('Slide out cross left bottom') ), array( 'id_option' => 'slideOutCrossLeftTop', 'name' => $this->l('Slide out cross left top') ), array( 'id_option' => 'zoomOut', 'name' => $this->l('Zoom out') ), array( 'id_option' => 'zoomOutDown', 'name' => $this->l('Zoom out down') ), array( 'id_option' => 'zoomOutLeft', 'name' => $this->l('Zoom out left') ), array( 'id_option' => 'zoomOutRight', 'name' => $this->l('Zoom out right') ), array( 'id_option' => 'zoomOutUp', 'name' => $this->l('Zoom out up') ), array( 'id_option' => 'hinge', 'name' => $this->l('Hinge') ), array( 'id_option' => 'rollOut', 'name' => $this->l('Roll out') ), ); $slide_animation_in = array( array( 'id_option' => 'fadeIn', 'name' => $this->l('Fade in') ), array( 'id_option' => 'fadeInDown', 'name' => $this->l('Fade in Down') ), array( 'id_option' => 'fadeInDownBig', 'name' => $this->l('Fade in down big') ), array( 'id_option' => 'fadeInLeft', 'name' => $this->l('Fade in left') ), array( 'id_option' => 'fadeInLeftBig', 'name' => $this->l('Fade in left big') ), array( 'id_option' => 'fadeInRight', 'name' => $this->l('Fade in right') ), array( 'id_option' => 'fadeInRightBig', 'name' => $this->l('Fade in right big') ), array( 'id_option' => 'fadeInUp', 'name' => $this->l('Fade in up') ), array( 'id_option' => 'fadeInUpBig', 'name' => $this->l('Fade in up big') ), array( 'id_option' => 'flipInX', 'name' => $this->l('Flip in X') ), array( 'id_option' => 'flipInY', 'name' => $this->l('Flip in Y') ), array( 'id_option' => 'lightSpeedIn', 'name' => $this->l('Light speed in') ), array( 'id_option' => 'rotateIn', 'name' => $this->l('Rotate in') ), array( 'id_option' => 'rotateInDownLeft', 'name' => $this->l('Rotate in down left') ), array( 'id_option' => 'rotateInDownRight', 'name' => $this->l('Rotate in down right') ), array( 'id_option' => 'rotateInUpLeft', 'name' => $this->l('Rotate in up left') ), array( 'id_option' => 'rotateInUpRight', 'name' => $this->l('Rotate in up right') ), array( 'id_option' => 'rotateZoomIn', 'name' => $this->l('Rotate Zoom In') ), array( 'id_option' => 'rotateYInLeft', 'name' => $this->l('Rotate In Left') ), array( 'id_option' => 'rotateXInRight', 'name' => $this->l('Rotate In Right') ), array( 'id_option' => 'rotateXInTop', 'name' => $this->l('Rotate X In top') ), array( 'id_option' => 'rotateZInLeft', 'name' => $this->l('Rotate Z In Left') ), array( 'id_option' => 'rotateZInRight', 'name' => $this->l('Rotate Z In right') ), array( 'id_option' => 'zoomInFlipVert', 'name' => $this->l('Zoom In Flip Vert') ), array( 'id_option' => 'zoomInFlipHoriz', 'name' => $this->l('Zoom In Flip Horiz') ), array( 'id_option' => 'slideInUp', 'name' => $this->l('Slide in up') ), array( 'id_option' => 'slideInDown', 'name' => $this->l('Slide in down') ), array( 'id_option' => 'slideInLeft', 'name' => $this->l('Slide in left') ), array( 'id_option' => 'slideInRight', 'name' => $this->l('Slide in right') ), array( 'id_option' => 'slideInCrossRightBottom', 'name' => $this->l('Slide in cross right bottom') ), array( 'id_option' => 'slideInCrossRightTop', 'name' => $this->l('Slide in cross right top') ), array( 'id_option' => 'slideInCrossLeftBottom', 'name' => $this->l('Slide in cross left bottom') ), array( 'id_option' => 'slideInCrossLeftTop', 'name' => $this->l('Slide in cross left top') ), array( 'id_option' => 'zoomIn', 'name' => $this->l('Zoom in') ), array( 'id_option' => 'zoomInDown', 'name' => $this->l('Zoom in down') ), array( 'id_option' => 'zoomInLeft', 'name' => $this->l('Zoom in left') ), array( 'id_option' => 'zoomInRight', 'name' => $this->l('Zoom in right') ), array( 'id_option' => 'zoomInUp', 'name' => $this->l('Zoom in up') ), array( 'id_option' => 'rollIn', 'name' => $this->l('Roll in') ), ); $slide_animation_out = array( array( 'id_option' => 'fadeOut', 'name' => $this->l('Fade out') ), array( 'id_option' => 'fadeOutDown', 'name' => $this->l('Fade out Down') ), array( 'id_option' => 'fadeOutDownBig', 'name' => $this->l('Fade out down big') ), array( 'id_option' => 'fadeOutLeft', 'name' => $this->l('Fade out left') ), array( 'id_option' => 'fadeOutLeftBig', 'name' => $this->l('Fade out left big') ), array( 'id_option' => 'fadeOutRight', 'name' => $this->l('Fade out right') ), array( 'id_option' => 'fadeOutRightBig', 'name' => $this->l('Fade out right big') ), array( 'id_option' => 'fadeOutUp', 'name' => $this->l('Fade out up') ), array( 'id_option' => 'fadeOutUpBig', 'name' => $this->l('Fade out up big') ), array( 'id_option' => 'flipOutX', 'name' => $this->l('Flip out X') ), array( 'id_option' => 'flipOutY', 'name' => $this->l('Flip out Y') ), array( 'id_option' => 'lightSpeedOut', 'name' => $this->l('Light speed out') ), array( 'id_option' => 'rotateOut', 'name' => $this->l('Rotate out') ), array( 'id_option' => 'rotateOutDownLeft', 'name' => $this->l('Rotate out down left') ), array( 'id_option' => 'rotateOutDownRight', 'name' => $this->l('Rotate out down right') ), array( 'id_option' => 'rotateOutUpLeft', 'name' => $this->l('Rotate out up left') ), array( 'id_option' => 'rotateOutUpRight', 'name' => $this->l('Rotate out up right') ), array( 'id_option' => 'rotateZoomOut', 'name' => $this->l('Rotate Zoom Out') ), array( 'id_option' => 'rotateYOutLeft', 'name' => $this->l('Rotate OutLeft') ), array( 'id_option' => 'rotateXOutRight', 'name' => $this->l('Rotate Out Right') ), array( 'id_option' => 'rotateXOutTop', 'name' => $this->l('Rotate X Out top') ), array( 'id_option' => 'rotateXOutBottom', 'name' => $this->l('Rotate X Out Bottom') ), array( 'id_option' => 'rotateZOutLeft', 'name' => $this->l('Rotate Z Out Left') ), array( 'id_option' => 'rotateZOutRight', 'name' => $this->l('Rotate Z Out right') ), array( 'id_option' => 'zoomOutFlipVert', 'name' => $this->l('Zoom Out Flip Vert') ), array( 'id_option' => 'zoomOutFlipHoriz', 'name' => $this->l('Zoom Out Flip Horiz') ), array( 'id_option' => 'slideOutUp', 'name' => $this->l('Slide out up') ), array( 'id_option' => 'slideOutDown', 'name' => $this->l('Slide out down') ), array( 'id_option' => 'slideOutLeft', 'name' => $this->l('Slide out left') ), array( 'id_option' => 'slideOutRight', 'name' => $this->l('Slide out right') ), array( 'id_option' => 'slideOutCrossRightBottom', 'name' => $this->l('Slide out cross right bottom') ), array( 'id_option' => 'slideOutCrossRightTop', 'name' => $this->l('Slide out cross right top') ), array( 'id_option' => 'slideOutCrossLeftBottom', 'name' => $this->l('Slide out cross left bottom') ), array( 'id_option' => 'slideOutCrossLeftTop', 'name' => $this->l('Slide out cross left top') ), array( 'id_option' => 'zoomOut', 'name' => $this->l('Zoom out') ), array( 'id_option' => 'zoomOutDown', 'name' => $this->l('Zoom out down') ), array( 'id_option' => 'zoomOutLeft', 'name' => $this->l('Zoom out left') ), array( 'id_option' => 'zoomOutRight', 'name' => $this->l('Zoom out right') ), array( 'id_option' => 'zoomOutUp', 'name' => $this->l('Zoom out up') ), array( 'id_option' => 'rollOut', 'name' => $this->l('Roll out') ), ); self::$slides = array( 'form' => array( 'legend' => array( 'title' => (int)Tools::getValue('itemId') ? $this->l('Edit slide') : $this->l('Add slide'), ), 'input' => array(), 'submit' => array( 'title' => $this->l('Save'), ), 'name' => 'slide', 'connect_to' => 'layer', ), 'configs' => array( 'title' => array( 'label' => $this->l('Title'), 'type' => 'text', 'required' => true, 'lang' => true, ), 'image' => array( 'label' => $this->l('Background image'), 'type' => 'file', ), 'repeat_x' => array( 'label' => $this->l('Repeat X'), 'type' => 'radio', 'default' => 0, 'values' => array( array( 'label' => $this->l('Yes'), 'id' => 'repeat_x_1', 'value' => 1, ), array( 'label' => $this->l('No'), 'id' => 'repeat_x_0', 'value' => 0, ) ), ), 'repeat_y' => array( 'label' => $this->l('Repeat Y'), 'type' => 'radio', 'default' => 0, 'values' => array( array( 'label' => $this->l('Yes'), 'id' => 'repeat_y_1', 'value' => 1, ), array( 'label' => $this->l('No'), 'id' => 'repeat_y_0', 'value' => 0, ) ), ), 'backgroud_color' => array( 'label' => $this->l('Backgroud color'), 'type' => 'color', 'validate' => 'isColor', 'default' => '#222222', ), 'animation_in' => array( 'label' => $this->l('Animation in'), 'type' => 'select', 'class' => 'ybc_slide_animation', 'options' => array( 'query' => $slide_animation_in, 'id' => 'id_option', 'name' => 'name' ), 'desc' => $this->l('Transition effect when the slide move into the slider area'), 'default' => 'fadeIn', ), 'animation_out' => array( 'label' => $this->l('Animation out'), 'type' => 'select', 'class' => 'ybc_slide_animation', 'options' => array( 'query' => $slide_animation_out, 'id' => 'id_option', 'name' => 'name' ), 'desc' => $this->l('Transition effect when the slide move out of the slider area'), 'default' => 'fadeOut', ), 'custom_class' => array( 'label' => $this->l('Custom CSS class'), 'type' => 'text', ), 'sort_order' => array( 'label' => $this->l('Sort order'), 'type' => 'sort_order', 'required' => true, 'default' => 1, 'order_group' => false, ), 'enabled' => array( 'label' => $this->l('Enabled'), 'type' => 'switch', 'default' => 1, 'values' => array( array( 'label' => $this->l('Yes'), 'id' => 'slide_enabled_1', 'value' => 1, ), array( 'label' => $this->l('No'), 'id' => 'slide_enabled_0', 'value' => 0, ) ), ), ), ); self::$layers = array( 'form' => array( 'legend' => array( 'title' => (int)Tools::getValue('itemId') ? $this->l('Edit layer') : $this->l('Add layer'), ), 'input' => array(), 'submit' => array( 'title' => $this->l('Save'), ), 'name' => 'layer', 'parent' => 'slide', ), 'configs' => array( 'layer_type' => array( 'type' => 'select', 'label' => $this->l('Layer type'), 'name' => 'layer_type', 'options' => array( 'query' => array( array( 'id_option' =>'text', 'name'=>$this->l('Text/HTML'), ), array( 'id_option' =>'text_background', 'name'=>$this->l('Text with background'), ), array( 'id_option' =>'button', 'name'=>$this->l('Button'), ), array( 'id_option' =>'link', 'name'=>$this->l('Link'), ), array( 'id_option' =>'image', 'name'=>$this->l('Image'), ), ), 'id' => 'id_option', 'name' => 'name' ), 'default' => 'text', ), 'image' =>array( 'type' => 'file', 'label' => $this->l('Image'), 'hide_delete' => true, ), 'content_layer'=>array( 'type'=>'textarea', 'label'=>$this->l('Text content'), 'lang'=>true ), 'width' => array( 'label' => $this->l('Image width'), 'type' => 'text', 'suffix' => 'px', 'validate' => 'isUnsignedInt', 'desc' => $this->l('Leave blank to use default image width'), ), 'height' => array( 'label' => $this->l('Image height'), 'type' => 'text', 'suffix' => 'px', 'validate' => 'isUnsignedInt', 'desc' => $this->l('Leave blank to use default image height'), ), 'link'=>array( 'type'=>'text', 'label'=>$this->l('Link'), 'lang'=>true, ), 'font_family' => array( 'label' => $this->l('Font family'), 'type' => 'select', 'options' => array( 'query' => $this->googlefonts, 'id' => 'id_option', 'name' => 'name' ), 'desc' => $this->l('Use default font of your theme or select a Google font from the list'), ), 'font_size' => array( 'label' => $this->l('Font size'), 'type' => 'text', 'default' => 30, 'suffix' => 'px', 'validate' => 'isFloat', ), 'font_weight' => array( 'label' => $this->l('Font weight'), 'type' => 'radio', 'default' => 'normal', 'values' => array( array( 'label' => $this->l('Normal'), 'id' => 'font_weight_1', 'value' => 'normal', ), array( 'label' => $this->l('Bold'), 'id' => 'font_weight_0', 'value' => 'bold', ) ), ), 'text_transform' => array( 'label' => $this->l('Text transform'), 'type' => 'radio', 'default' => 'none', 'values' => array( array( 'label' => $this->l('None'), 'id' => 'text_transform_1', 'value' => 'none', ), array( 'label' => $this->l('Uppercase'), 'id' => 'text_transform_0', 'value' => 'uppercase', ), array( 'label' => $this->l('Lowercase'), 'id' => 'text_transform_2', 'value' => 'lowercase', ), ), ), 'text_decoration' => array( 'label' => $this->l('Text decoration'), 'type' => 'radio', 'default' => 'none', 'values' => array( array( 'label' => $this->l('None'), 'id' => 'text_decoration_1', 'value' => 'none', ), array( 'label' => $this->l('Underline'), 'id' => 'text_decoration_2', 'value' => 'underline', ), array( 'label' => $this->l('Overline'), 'id' => 'text_decoration_3', 'value' => 'overline', ), array( 'label' => $this->l('Line-through'), 'id' => 'text_decoration_4', 'value' => 'line-through', ), ), ), 'custom_class' => array( 'label' => $this->l('Custom CSS class'), 'type' => 'text', ), 'text_color' => array( 'label' => $this->l('Text color'), 'type' => 'color', 'validate' => 'isColor', 'default' => '#222222', ), 'background_color' => array( 'label' => $this->l('Background color'), 'type' => 'color', 'validate' => 'isColor', 'default' => '#F3F3F3', ), 'padding' => array( 'label' => $this->l('Padding'), 'type' => 'text', 'default' => '5px 10px', 'desc' => $this->l('Standard CSS padding value format. Eg: 5px 10px 15px 20px,10px 5px, 5px...'), ), 'box_radius' => array( 'label' => $this->l('Box radius'), 'type' => 'text', 'default' => 20, 'suffix' => 'px', 'validate' => 'isUnsignedInt', ), 'background_opacity' => array( 'label' => $this->l('Background opacity'), 'type' => 'text', 'validate' => 'isUnsignedFloat', 'default' => 1, 'desc' => $this->l('From 0-1, Eg: 0.5, 0.8, 1...'), ), 'id_slide' => array( 'label' => $this->l('Slide'), 'type' => 'hidden', 'default' => ($id_slide = (int)Tools::isSubmit('id_slide')) && $id_slide > 0 ? $id_slide : '', 'required' => true, 'validate' => 'isUnsignedInt', ), 'top' => array( 'label' => $this->l('Top').($this->multiLayoutExist() ? ' ('.$this->l('LTR').')' : ''), 'type' => 'text', 'suffix' => 'px', 'default' => 50, 'required' => true, 'validate' => 'isFloat', 'desc' => $this->multiLayoutExist() ? $this->l('The distance to slide top edge on LTR layout') : $this->l('The distance to slide top edge'), ), 'left' => array( 'label' => $this->l('Left').($this->multiLayoutExist() ? ' ('.$this->l('LTR').')' : ''), 'type' => 'text', 'suffix' => 'px', 'default' => 50, 'required' => true, 'validate' => 'isFloat', 'desc' => $this->multiLayoutExist() ? $this->l('The distance to slide left edge on LTR layout') : $this->l('The distance to slide left edge'), ), 'top_right' =>array( 'label'=>$this->l('Top (RTL)'), 'type' => 'text', 'suffix' => 'px', 'default' => 50, 'required' => true, 'validate' => 'isFloat', 'desc' => $this->l('The distance to slide top edge on RTL layout'), ), 'right' =>array( 'label'=>$this->l('Right (RTL)'), 'type' => 'text', 'suffix' => 'px', 'validate' => 'isFloat', 'default' => 50, 'required' => true, 'desc' => $this->l('The distance to slide right edge on RTL layout'), ), 'animation_in' => array( 'label' => $this->l('Animation in'), 'type' => 'select', 'class' => 'ybc_slide_animation', 'options' => array( 'query' => $animation_in, 'id' => 'id_option', 'name' => 'name' ), 'desc' => $this->l('Transition effect when the layer moves in its slide'), 'default' => 'fadeIn', ), 'start_delay' => array( 'label' => $this->l('Delay in'), 'type' => 'text', 'suffix' => 'ms', 'validate' => 'isUnsignedInt', 'required' => true, 'default' => 0, 'desc' => $this->l('The delay time for the layer to start moving in its slide'), ), 'move_in' => array( 'label' => $this->l('Move in'), 'type' => 'text', 'suffix' => 'ms', 'validate' => 'isUnsignedInt', 'required' => true, 'default' => 1000, 'desc' => $this->l('The duration for the layer to move in its slide'), ), 'animation_out' => array( 'label' => $this->l('Animation out'), 'type' => 'select', 'class' => 'ybc_slide_animation', 'options' => array( 'query' => $animation_out, 'id' => 'id_option', 'name' => 'name' ), 'desc' => $this->l('Transition effect when the layer moves out of its slide'), 'default' => 'fadeOut', ), 'stand_duration' => array( 'label' => $this->l('Delay out'), 'type' => 'text', 'suffix' => 'ms', 'validate' => 'isUnsignedInt', 'required' => true, 'default' => 0, 'desc' => $this->l('The delay time for the layer to start moving out of its slide'), ), 'move_out' => array( 'label' => $this->l('Move out'), 'type' => 'text', 'suffix' => 'ms', 'validate' => 'isUnsignedInt', 'required' => true, 'default' => 500, 'desc' => $this->l('The duration for the layer to move out of its slide'), ), 'sort_order' => array( 'label' => $this->l('Sort order'), 'type' => 'sort_order', 'required' => true, 'default' => 1, 'order_group' => 'id_slide', ), ), ); self::$configs = array( 'form' => array( 'legend' => array( 'title' => $this->l('Configuration'), 'icon' => 'icon-AdminAdmin' ), 'input' => array(), 'submit' => array( 'title' => $this->l('Save'), ), 'name' => 'config' ), 'configs' => array( 'ETS_MLS_SLIDER_TYPE' => array( 'type' => 'select', 'label' => $this->l('Slider type'), 'name' => 'ETS_MLS_HOOK_TO', 'options' => array( 'query' => array( array( 'id_option' =>'auto', 'name'=>$this->l('Auto size'), ), array( 'id_option' =>'boxed', 'name'=>$this->l('Boxed'), ), array( 'id_option' =>'full', 'name'=>$this->l('Full width'), ), ), 'id' => 'id_option', 'name' => 'name' ), 'default' => 'auto', ), 'ETS_MLS_HOOK_TO' => array( 'type' => 'select', 'label' => $this->l('Hook to'), 'name' => 'ETS_MLS_HOOK_TO', 'options' => array( 'query' => array( array( 'id_option' =>'default', 'name'=>$this->l('Default hook'), ), array( 'id_option' =>'customhook', 'name'=>$this->l('Custom hook'), ), ), 'id' => 'id_option', 'name' => 'name' ), 'default' => 'default', 'desc' => $this->l('Put {hook h=\'displayMLS\'} on your template tpl file where you want the slider displays'), ), 'ETS_MLS_SLIDER_BACKGROUND' => array( 'type' => 'color', 'label' => $this->l('Slider background color'), 'default'=> '#ffffff', 'validate' => 'isColor', ), 'ETS_MLS_SLIDER_BUTTON_COLOR' => array( 'type' => 'color', 'label' => $this->l('Slider buttons color'), 'default'=> '#ec4249', 'validate' => 'isColor', ), 'ETS_MLS_WIDTH_SLIDE' => array( 'type' => 'text', 'label' => $this->l('Slide width'), 'default'=> 1170, 'suffix' => 'px', 'required' => true, 'validate' => 'isUnsignedInt', ), 'ETS_MLS_HEIGHT_SLIDE' => array( 'type' => 'text', 'label' => $this->l('Slide height'), 'default'=> 450, 'suffix' => 'px', 'required' => true, 'validate' => 'isUnsignedInt', ), 'ETS_MLS_MOVE_IN' => array( 'type' => 'text', 'label' => $this->l('Move in'), 'default'=> 1000, 'suffix' => 'ms', 'required' => true, 'validate' => 'isUnsignedInt', 'desc' => $this->l('Time for a slide to move in the slider'), ), 'ETS_MLS_MOVE_OUT' => array( 'type' => 'text', 'label' => $this->l('Move out'), 'default'=> 500, 'suffix' => 'ms', 'required' => true, 'validate' => 'isUnsignedInt', 'desc' => $this->l('Time for a slide to move out of the slider'), ), 'ETS_MLS_STAND_DURATION' => array( 'type' => 'text', 'label' => $this->l('Stand duration'), 'default'=> 5000, 'suffix' => 'ms', 'validate' => 'isUnsignedInt', 'required' => true, 'desc' => $this->l('Stand duration of a slide on the slider.'), ), 'ETS_MLS_AUTO_PLAY' => array( 'label' => $this->l('Auto play'), 'type' => 'switch', 'default' => 1, 'values' => array( array( 'label' => $this->l('Yes'), 'id' => 'slide_enabled_1', 'value' => 1, ), array( 'label' => $this->l('No'), 'id' => 'slide_enabled_0', 'value' => 0, ) ), ), 'ETS_MLS_ENABLE_RUNNING_BAR' => array( 'label' => $this->l('Enable running status bar'), 'type' => 'switch', 'default' => 1, 'values' => array( array( 'label' => $this->l('Yes'), 'id' => 'slide_enabled_1', 'value' => 1, ), array( 'label' => $this->l('No'), 'id' => 'slide_enabled_0', 'value' => 0, ) ), ), 'ETS_MLS_PAUSE_ON_HOVER' => array( 'label' => $this->l('Pause when hover'), 'type' => 'switch', 'default' => 1, 'values' => array( array( 'label' => $this->l('Yes'), 'id' => 'slide_enabled_1', 'value' => 1, ), array( 'label' => $this->l('No'), 'id' => 'slide_enabled_0', 'value' => 0, ) ), ), 'ETS_MLS_LOOP' => array( 'label' => $this->l('Loop'), 'type' => 'switch', 'default' => 1, 'values' => array( array( 'label' => $this->l('Yes'), 'id' => 'slide_enabled_1', 'value' => 1, ), array( 'label' => $this->l('No'), 'id' => 'slide_enabled_0', 'value' => 0, ) ), ), 'ETS_MLS_ENABLE_LOADING_ICON' => array( 'label' => $this->l('Display loading icon'), 'type' => 'switch', 'default' => 1, 'values' => array( array( 'label' => $this->l('Yes'), 'id' => 'slide_enabled_1', 'value' => 1, ), array( 'label' => $this->l('No'), 'id' => 'slide_enabled_0', 'value' => 0, ) ), ), 'ETS_MLS_ENABLE_NEXT_PREV' => array( 'label' => $this->l('Enable "Next"/"Prev" button'), 'type' => 'switch', 'default' => 1, 'values' => array( array( 'label' => $this->l('Yes'), 'id' => 'slide_enabled_1', 'value' => 1, ), array( 'label' => $this->l('No'), 'id' => 'slide_enabled_0', 'value' => 0, ) ), ), 'ETS_MLS_ENABLE_PAGINATION' => array( 'label' => $this->l('Enable slider pagination buttons'), 'type' => 'switch', 'default' => 1, 'values' => array( array( 'label' => $this->l('Yes'), 'id' => 'slide_enabled_1', 'value' => 1, ), array( 'label' => $this->l('No'), 'id' => 'slide_enabled_0', 'value' => 0, ) ), ), 'ETS_MLS_CUSTOM_CSS' => array( 'type' => 'textarea', 'label' => $this->l('Custom CSS'), 'desc' => $this->l('Custom color codes available').': [bg_color], [button_color]', ), ), ); if(!$this->multiLayoutExist()) { unset(self::$layers['configs']['top_right']); unset(self::$layers['configs']['right']); } } public function installDb() { $dbExecuted = Db::getInstance()->execute(" CREATE TABLE IF NOT EXISTS `"._DB_PREFIX_."ets_mls_slide` ( `id_slide` INT(11) NOT NULL AUTO_INCREMENT , `image` TEXT NOT NULL , `repeat_x` INT(1) NOT NULL , `repeat_y` INT(1) NOT NULL , `sort_order` INT(11) NOT NULL , `backgroud_color` VARCHAR(222) NOT NULL , `custom_class` VARCHAR(100) DEFAULT NULL, `enabled` INT(1) NOT NULL , `animation_in` VARCHAR(222) NOT NULL , `animation_out` VARCHAR(222) NOT NULL , PRIMARY KEY (`id_slide`)) ENGINE = InnoDB ") &&Db::getInstance()->execute(" CREATE TABLE IF NOT EXISTS `"._DB_PREFIX_."ets_mls_slide_lang` ( `id_slide` int(11) NOT NULL, `id_lang` int(11) NOT NULL, `title` varchar(500) NOT NULL ) ") &&Db::getInstance()->execute(" CREATE TABLE IF NOT EXISTS `"._DB_PREFIX_."ets_mls_layer` ( `id_layer` INT(11) NOT NULL AUTO_INCREMENT , `id_slide` INT(11) NOT NULL , `layer_type` VARCHAR(40) NOT NULL , `font_size` FLOAT(10,2) NOT NULL , `text_color` VARCHAR(40) NOT NULL, `custom_class` VARCHAR(150) NOT NULL, `background_color` VARCHAR(40) NOT NULL, `background_opacity` FLOAT(10,2) NOT NULL , `font_family` VARCHAR(100) NOT NULL, `font_weight` VARCHAR(100) NOT NULL, `text_decoration` VARCHAR(100) NOT NULL, `text_transform` VARCHAR(100) NOT NULL, `padding` VARCHAR(100) NOT NULL, `box_radius` INT(11) DEFAULT NULL, `top` FLOAT(10,2) NOT NULL , `left` FLOAT(10,2) NOT NULL , `right` FLOAT(10,2) NOT NULL, `top_right` FLOAT(10,2) NOT NULL, `animation_in` VARCHAR(100) NOT NULL, `animation_out` VARCHAR(100) NOT NULL, `width` VARCHAR(100) DEFAULT NULL, `height` VARCHAR(100) DEFAULT NULL, `sort_order` INT(11), `move_in` INT(11) NOT NULL , `move_out` INT(11) NOT NULL , `stand_duration` INT(11) NOT NULL , `start_delay` INT(11) NOT NULL , `image` varchar(222) not null, PRIMARY KEY (`id_layer`)) ENGINE = InnoDB ") &&Db::getInstance()->execute(" CREATE TABLE IF NOT EXISTS `"._DB_PREFIX_."ets_mls_layer_lang` ( `id_layer` int(11) NOT NULL, `id_lang` int(11) NOT NULL, `content_layer` text NOT NULL, `link` text ) "); if($dbExecuted && @file_exists(dirname(__FILE__).'/data/init.data.zip') && is_readable(dirname(__FILE__).'/data/init.data.zip')) { $this->processImport(dirname(__FILE__).'/data/init.data.zip',true,false,true); } return $dbExecuted; } /** * @see Module::install() */ public function install() { self::clearAllCache(); self::clearUploadedImages(); $config = new MLS_Config(); $config->installConfigs(); if($css = Configuration::get('ETS_MLS_CUSTOM_CSS')) { @file_put_contents(dirname(__FILE__).'/views/css/custom.cache.css',$css); } elseif(@file_exists(dirname(__FILE__).'/views/css/custom.cache.css')) @unlink(dirname(__FILE__).'/views/css/custom.cache.css'); return parent::install() && $this->registerHook('displayHeader') && $this->registerHook('displayTopColumn') && $this->registerHook('displayMultiLayerSlide') && $this->registerHook('displayHome') && $this->registerHook('displayBackOfficeHeader') && $this->registerHook('displayMLSSlider') && $this->registerHook('displayMLSSlide') && $this->registerHook('displayMLSLayer') && $this->registerHook('displayMLSLayerSort') && $this->registerHook('displayMLSSlideInner') && $this->registerHook('displayMLSConfigs') && $this->registerHook('displayMLS') && $this->installDb(); } /** * @see Module::uninstall() */ public function uninstall() { self::clearAllCache(); self::clearUploadedImages(); return parent::uninstall() && $this->uninstallDb(); } public function getContent() { $this->proccessPost(); $this->requestForm(); $this->context->controller->addJqueryUI('ui.sortable'); $this->context->controller->addJqueryUI('ui.draggable'); $this->_html .= $this->displayAdminJs(); $this->_html .= $this->renderForm(); $this->_html .= $this->displayIframe(); return $this->_html; } public function displayIframe() { switch($this->context->language->iso_code) { case 'en': $url = 'https://cdn.prestahero.com/prestahero-product-feed?utm_source=feed_'.$this->name.'&utm_medium=iframe'; break; case 'it': $url = 'https://cdn.prestahero.com/it/prestahero-product-feed?utm_source=feed_'.$this->name.'&utm_medium=iframe'; break; case 'fr': $url = 'https://cdn.prestahero.com/fr/prestahero-product-feed?utm_source=feed_'.$this->name.'&utm_medium=iframe'; break; case 'es': $url = 'https://cdn.prestahero.com/es/prestahero-product-feed?utm_source=feed_'.$this->name.'&utm_medium=iframe'; break; default: $url = 'https://cdn.prestahero.com/prestahero-product-feed?utm_source=feed_'.$this->name.'&utm_medium=iframe'; } $this->smarty->assign( array( 'url_iframe' => $url ) ); return $this->display(__FILE__,'iframe.tpl'); } public function renderForm() { $slide = new MLS_Slide(); $layer = new MLS_Layer(); $config = new MLS_Config(); $this->smarty->assign(array( 'slideForm' =>$slide->renderForm(), 'layerForm'=> $layer->renderForm(), 'configForm' => $config->renderForm(), 'url_base_img' => $this->_path.'views/img/upload/', 'mmBaseAdminUrl' => $this->context->link->getAdminLink('AdminModules', true).'&configure='.$this->name, 'layoutDirection' => $this->layoutDirection(), 'mls_layout' => $this->context->language->is_rtl ? 'rtl' : 'ltr', 'id_lang' => $this->context->language->id, 'multiLayoutExist' => $this->multiLayoutExist()?true:false, 'mls_configs' => $this->getSliderConfigs(), 'width_slider' => Configuration::get('ETS_MLS_WIDTH_SLIDE') ? Configuration::get('ETS_MLS_WIDTH_SLIDE'): 1170, 'height_slider' => Configuration::get('ETS_MLS_HEIGHT_SLIDE') ? Configuration::get('ETS_MLS_HEIGHT_SLIDE'):500, )); return $this->display(__FILE__,'admin-form.tpl'); } public function baseAdminUrl() { return $this->context->link->getAdminLink('AdminModules', true).'&configure='.$this->name; } public function proccessPost() { $this->alerts = array(); $time = time(); if(Tools::isSubmit('mls_form_submitted') && ($mmObj = Tools::getValue('mls_object')) && in_array($mmObj,array('MLS_Slide','MLS_Layer'))) { $obj = ($itemId = (int)Tools::getValue('itemId')) && $itemId > 0 ? new $mmObj($itemId) : new $mmObj(); $this->alerts = $obj->saveData(); $vals = $obj->getFieldVals(); $processResult = array( 'alert' => $this->displayAlerts($time), 'itemId' => (int)$obj->id, 'title' => property_exists($obj,'title') && isset($obj->title[(int)$this->context->language->id]) ? $obj->title[(int)$this->context->language->id] : false, 'images' => $obj->id && property_exists($obj,'image') && $obj->image ? array(array( 'name' => 'image', 'url' => $this->_path.'views/img/upload/'.$obj->image, )) : false, 'itemKey' => 'id_'.$obj->fields['form']['name'], 'time' => $time, 'mls_object' => $mmObj, 'vals' => $vals, 'success' => isset($this->alerts['success']) && $this->alerts['success'], ); if($mmObj == 'MLS_Layer' && (int)$obj->id) { $layer = $this->getLayers(false,(int)$obj->id); $processResult['sortLayerHtml'] = $this->hookDisplayMLSLayerSort(array('layer' => $layer)); $processResult['layerHtmlLTR'] = $this->hookDisplayMLSLayer(array('layer' => $layer,'layout' => 'ltr')); $processResult['layerHtmlRTL'] = $this->hookDisplayMLSLayer(array('layer' => $layer,'layout' => 'rtl')); $processResult['font'] = $layer['font_family'] && $layer['font_family']!='Times new roman' && $layer['font_family']!='Arial' ? 'https://fonts.googleapis.com/css?family='.urlencode($layer['font_family']) : false; } if($mmObj == 'MLS_Slide' && (int)$obj->id) { $slide = $this->getSlides(false,$obj->id); $processResult['slideHtml'] = $this->hookDisplayMLSSlide(array('slide' => $slide)); $processResult['slideHtmlLTR'] = $this->hookDisplayMLSSlide(array('slide' => $slide,'layout' => 'ltr')); $processResult['slideHtmlRTL'] = $this->hookDisplayMLSSlide(array('slide' => $slide,'layout' => 'rtl')); } die(Tools::jsonEncode($processResult)); } if(($image = Tools::getValue('deleteimage')) && ($mmObj = Tools::getValue('mls_object')) && in_array($mmObj,array('MLS_Slide','MLS_Layer')) && ($itemId = (int)Tools::getValue('itemId')) && $itemId > 0) { $obj = new $mmObj($itemId); $this->alerts = $obj->clearImage('image'); unset($image); die(Tools::jsonEncode(array( 'alert' => $this->displayAlerts($time), 'itemId' => (int)$obj->id, 'itemKey' => 'image', 'time' => $time, 'mls_object' => $mmObj, 'success' => isset($this->alerts['success']) && $this->alerts['success'], ))); } if(($image = Tools::getValue('deleteobject')) && ($mmObj = Tools::getValue('mls_object')) && in_array($mmObj,array('MLS_Slide','MLS_Layer')) && ($itemId = (int)Tools::getValue('itemId')) && $itemId > 0) { $obj = new $mmObj($itemId); $this->alerts = $obj->deleteObj(); die(Tools::jsonEncode(array( 'alert' => $this->displayAlerts($time), 'time' => $time, 'itemId' => $itemId, 'success' => isset($this->alerts['success']) && $this->alerts['success'], 'successMsg' => isset($this->alerts['success']) && $this->alerts['success'] ? $this->l('Item deleted') : false, 'mls_object' => $mmObj, ))); } if(Tools::isSubmit('duplicatedbject') && ($mmObj = Tools::getValue('mls_object')) && in_array($mmObj,array('MLS_Slide','MLS_Layer')) && ($itemId = (int)Tools::getValue('itemId')) && $itemId > 0) { $obj = new $mmObj($itemId); $newObj = $obj->duplicateItem(); $result = array( 'alert' => $this->displayAlerts($time), 'time' => $time, 'itemId' => $itemId, 'newItemId' => $newObj->id ? $newObj->id : 0, 'success' => $newObj ? $this->l('Item duplicated') : false, ); if($mmObj=='MLS_Slide') { $result['html'] = $newObj->id ? $this->hookDisplayMLSSlide(array('slide' => $this->getSlides(false,$newObj->id),'layout'=>in_array(Tools::getValue('layout'),array('rtl','ltr')) ? Tools::getValue('layout') : 'ltr')) : ''; } if($mmObj=='MLS_Layer') { $result['layerHtml'] = $newObj->id ? $this->hookDisplayMLSLayer(array('layer' => $this->getLayers(false,$newObj->id),'layout'=>in_array(Tools::getValue('layout'),array('rtl','ltr')) ? Tools::getValue('layout') : 'ltr')) : ''; $result['layerSortHtml'] = $newObj->id ? $this->hookDisplayMLSLayerSort(array('layer' => $this->getLayers(false,$newObj->id))) : ''; $result['id_slide'] = $newObj->id_slide; } die(Tools::jsonEncode($result)); } if(Tools::isSubmit('mls_config_submitted')) { $config = new MLS_Config(); $this->alerts = $config->saveData(); if(isset($this->alerts['success'])) { if(trim(Tools::getValue('ETS_MLS_CUSTOM_CSS'))) { @file_put_contents(dirname(__FILE__).'/views/css/custom.cache.css',str_replace(array('[bg_color]','[button_color]'),array(Configuration::get('ETS_MLS_SLIDER_BACKGROUND'),Configuration::get('ETS_MLS_SLIDER_BUTTON_COLOR')),trim(Tools::getValue('ETS_MLS_CUSTOM_CSS')))); } elseif(@file_exists(dirname(__FILE__).'/views/css/custom.cache.css')) @unlink(dirname(__FILE__).'/views/css/custom.cache.css'); } die(Tools::jsonEncode(array( 'alert' => $this->displayAlerts($time), 'time' => $time, 'layout_direction' => $this->layoutDirection(), 'success' => isset($this->alerts['success']) && $this->alerts['success'], 'configs' => $this->getSliderConfigs(true), 'slider_width' => Configuration::get('ETS_MLS_WIDTH_SLIDE'), 'slider_height' => Configuration::get('ETS_MLS_HEIGHT_SLIDE'), 'slider_type' => Tools::strtolower(Configuration::get('ETS_MLS_SLIDER_TYPE')), ))); } if(Tools::isSubmit('updateOrder')) { $itemId = (int)Tools::getValue('itemId'); $objName = 'MLS_'.Tools::ucfirst(Tools::strtolower(trim(Tools::getValue('obj')))); $parentId = (int)Tools::getValue('parentId'); $parentObjName = 'MLS_'.Tools::ucfirst(Tools::strtolower(trim(Tools::getValue('parentObj')))); $previousId = (int)Tools::getValue('previousId'); $layout = Tools::getValue('layout') =='rtl' ? 'rtl' : 'ltr'; $processResult = array(); if(in_array($objName,array('MLS_Slide','MLS_Layer')) && $itemId > 0) { $obj = new $objName($itemId); $orderUpdated = $obj->updateOrder($previousId,$parentId); if($objName == 'MLS_Layer' && $parentId && $parentObjName=='MLS_Slide') { $processResult['slideHtml'] = $this->hookDisplayMLSSlideInner(array('slide' => $this->getSlides(false,$parentId),'layout' => $layout)); $processResult['id_slide'] = $parentId; } } $processResult['success'] = isset($orderUpdated) && $orderUpdated; die(Tools::jsonEncode($processResult)); } if(Tools::isSubmit('updatePositionLayer')) { $itemId = (int)Tools::getValue('itemId'); $objName = trim(Tools::getValue('obj')); if($objName=='MLS_Layer' && $itemId > 0) { if(Tools::getValue('layout')=='ltr') $sql = 'UPDATE '._DB_PREFIX_.'ets_mls_layer SET `top`='.(float)Tools::getValue('data_top').', `left`='.(float)Tools::getValue('data_left').' WHERE id_layer='.(int)$itemId; else $sql = 'UPDATE '._DB_PREFIX_.'ets_mls_layer SET `top_right`='.(float)Tools::getValue('data_top').', `right`='.(float)Tools::getValue('data_right').' WHERE id_layer='.(int)$itemId; die(Tools::jsonEncode(array( 'success' => Db::getInstance()->execute($sql), ))); } } if(Tools::getValue('updateLayout')) { $layout = Tools::getValue('layout') == 'rtl' ? 'rtl' : 'ltr'; die(Tools::jsonEncode(array( 'html' => $this->hookDisplayMLSSlider(array('layout' => $layout)), 'currentSlideId' => (int)Tools::getValue('currentSlideId'), 'success' => true, 'layout' => $layout, ))); } if(Tools::getValue('loadSlider')) { die(Tools::jsonEncode(array( 'html' => $this->displaySlideFrontend(array('layout' => Tools::getValue('layout') == 'rtl' ? 'rtl' : 'ltr','backend_load' => true)), 'success' => true, ))); } if(Tools::getValue('exportSlider')) { $this->generateArchive(); die; } if(Tools::getValue('importslider')) { $errors = $this->processImport(); die(Tools::jsonEncode(array( 'success' => !$errors ? $this->l('Slider was successfully imported. This page will be reloaded in 3 seconds') : false, 'error' => $errors ? implode('; ',$errors) : false, ))); } } public function processImport($zipfile = false,$clearData = false,$theme_default_items = array(),$initData = false) { $errors = array(); if(!$zipfile) { $savePath = dirname(__FILE__).'/cache/'; if(@file_exists($savePath.'mls_slider.data.zip')) @unlink($savePath.'mls_slider.data.zip'); $uploader = new Uploader('sliderdata'); $uploader->setCheckFileSize(false); $uploader->setAcceptTypes(array('zip')); $uploader->setSavePath($savePath); $file = $uploader->process('mls_slider.data.zip'); if ($file[0]['error'] === 0) { if (!Tools::ZipTest($savePath.'mls_slider.data.zip')) $errors[] = $this->l('Zip file seems to be broken'); } else { $errors[] = $file[0]['error']; } $extractUrl = $savePath.'mls_slider.data.zip'; } else $extractUrl = $zipfile; if(!@file_exists($extractUrl)) $errors[] = $this->l('Zip file doesn\'t exist'); if(!$errors) { $zip = new ZipArchive(); if($zip->open($extractUrl) === true) { if ($zip->locateName('Slider-Info.xml') === false) { $errors[] = $this->l('Slider-Info.xml doesn\'t exist'); if($extractUrl && !$zipfile) { @unlink($extractUrl); } } } else $errors[] = $this->l('Cannot open zip file. It might be broken or damaged'); } if(!$errors) { if((Tools::isSubmit('importoverride') || $clearData) && $zip->locateName('Data.xml') !== false) { Db::getInstance()->execute("DELETE FROM "._DB_PREFIX_."ets_mls_layer_lang"); Db::getInstance()->execute("DELETE FROM "._DB_PREFIX_."ets_mls_layer"); Db::getInstance()->execute("DELETE FROM "._DB_PREFIX_."ets_mls_slide_lang"); Db::getInstance()->execute("DELETE FROM "._DB_PREFIX_."ets_mls_slide"); self::clearUploadedImages(); } if(!Tools::ZipExtract($extractUrl, dirname(__FILE__).'/views/')) $errors[] = $this->l('Cannot extract zip data'); if(!@file_exists(dirname(__FILE__).'/views/Data.xml') && !@file_exists(dirname(__FILE__).'/views/Config.xml')) $errors[] = $this->l('Neither Data.xml nor Config.xml exist'); } if(!@file_exists(dirname(__FILE__).'/views/Slider-Info.xml')) $errors[] = $this->l('Slider-Info.xml doesn\'t exist in "views/" folder'); if(!$errors) { if(@file_exists(dirname(__FILE__).'/views/Data.xml')) { if($theme_default_items) { $this->importXmlTbl(@simplexml_load_file(dirname(__FILE__).'/views/Data.xml'),$theme_default_items); } elseif($initData) { $info = @simplexml_load_file(dirname(__FILE__).'/views/Slider-Info.xml'); $this->importXmlTbl(@simplexml_load_file(dirname(__FILE__).'/views/Data.xml'),$info && isset($info['theme_default_items']) && $info['theme_default_items'] ? explode(',',(string)$info['theme_default_items']) : false); } else $this->importXmlTbl(@simplexml_load_file(dirname(__FILE__).'/views/Data.xml')); @unlink(dirname(__FILE__).'/views/Data.xml'); } if(@file_exists(dirname(__FILE__).'/views/Config.xml')) { $this->importXmlConfig(@simplexml_load_file(dirname(__FILE__).'/views/Config.xml')); @unlink(dirname(__FILE__).'/views/Config.xml'); } if(@file_exists(dirname(__FILE__).'/views/Slider-Info.xml')) @unlink(dirname(__FILE__).'/views/Slider-Info.xml'); } return $errors; } private function importXmlConfig($xml) { if(!$xml) return false; $languages = Language::getLanguages(false); foreach(self::$configs['configs'] as $key => $config) { if(property_exists($xml,$key)) { if(isset($config['lang']) && $config['lang']) { $temp = array(); foreach($languages as $lang) { $node = $xml->$key; $temp[$lang['id_lang']] = isset($node['configValue']) ? (string)$node['configValue'] : (isset($config['default']) ? $config['default'] : ''); } Configuration::updateValue($key,$temp); } else { $node = $xml->$key; Configuration::updateValue($key,isset($node['configValue']) ? (string)$node['configValue'] : (isset($config['default']) ? $config['default'] : '')); } } } if(isset($xml->ETS_MLS_CUSTOM_CSS) && ($node = $xml->ETS_MLS_CUSTOM_CSS) && isset($node['configValue']) && trim((string)$node['configValue'])) @file_put_contents(dirname(__FILE__).'/views/css/custom.cache.css',str_replace(array('[bg_color]','[button_color]'),array(Configuration::get('ETS_MLS_SLIDER_BACKGROUND'),Configuration::get('ETS_MLS_SLIDER_BUTTON_COLOR')),trim((string)$node['configValue']))); elseif(@file_exists(dirname(__FILE__).'/views/css/custom.cache.css')) @unlink(dirname(__FILE__).'/views/css/custom.cache.css'); } private function importXmlTbl($xml,$activeIds = array()) { if(!$xml) return false; $id_slide = 0; if($xml && property_exists($xml,'slide') && $xml->slide) { foreach($xml->children() as $slide) { if(($attr = $slide->attributes()) && ($id_slide = $this->addObj('slide',$attr,$activeIds))) { if($slide->layers->children()) { foreach($slide->layers->children() as $layer) { if($attr2 = $layer->attributes()) { $attr2->id_slide = $id_slide; $this->addObj('layer',$attr2); } } } } } } } private function addObj($obj, $data,$activeIds = array()) { $realOjbect = ($obj == 'slide' ? new MLS_Slide() : new MLS_Layer()); $languages = Language::getLanguages(false); $attrs = ($obj == 'slide' ? self::$slides : self::$layers); foreach($attrs['configs'] as $key => $val) { if(isset($val['lang']) && $val['lang']) { $temp = array(); foreach($languages as $lang) { $temp[$lang['id_lang']] = isset($data[$key]) ? (string)$data[$key] : (isset($val['default']) ? $val['default'] : ''); } $realOjbect->$key = $temp; } else { if($data[$key]) $realOjbect->$key = (string)$data[$key]; elseif(isset($val['default'])) $realOjbect->$key = $val['default']; else $realOjbect->$key = ''; } } if($activeIds && isset($data['id_slide']) && !in_array($data['id_slide'],$activeIds)) $realOjbect->enabled = 0; if($realOjbect->add()) return $realOjbect->id; return false; } private function archiveThisFile($obj, $file, $server_path, $archive_path, $greyOutImage = false) { if (is_dir($server_path.$file)) { $dir = scandir($server_path.$file); foreach ($dir as $row) { if ($row[0] != '.') { $this->archiveThisFile($obj, $row, $server_path.$file.'/', $archive_path.$file.'/', $greyOutImage); } } } elseif($greyOutImage && is_file($server_path.$file) && ($extension = pathinfo($server_path.$file, PATHINFO_EXTENSION)) && ($extension=='png' || $extension=='jpg')) { $tempDir = dirname(__FILE__).'/data/temp/'; $greyImage = $tempDir.$file; $this->greyOutImage($server_path.$file,$tempDir); if(file_exists($greyImage)) { $obj->addFile($greyImage, $archive_path.$file); } } else $obj->addFile($server_path.$file, $archive_path.$file); } public function greyOutImage($src,$descDir) { if(!file_exists($src) || !is_dir($descDir)) return; $name = basename($src); $extension = pathinfo($src, PATHINFO_EXTENSION); if(file_exists($descDir.$name)) @unlink($descDir.$name); if($extension == 'png' || $extension=='jpg') { $img = ($extension=='jpg' ? imagecreatefromjpeg($src) : imagecreatefrompng($src)); $grey = imagecolorallocate($img, 235, 235, 235); $width = imagesx($img); $height = imagesy($img); imagefilledrectangle($img, 0, 0, $width, $height, $grey); //Add sizing text $font = dirname(__FILE__).'/views/fonts/Montserrat-Bold.ttf'; $font_size = 30; $angle = 45; $text = $width.' X '.$height; $text_box = imagettfbbox($font_size,$angle,$font,$text); $text_width = $text_box[2]-$text_box[0]; $text_height = $text_box[7]-$text_box[1]; $grey = imagecolorallocate($img, 160, 160, 160); // Calculate coordinates of the text $x = ($width/2) - ($text_width/2)-30; $y = ($height/2) - ($text_height/2); // Add some shadow to the text imagettftext($img, $font_size, 0, $x, $y, $grey, $font, $text); if($extension=='jpg') imagejpeg($img, $descDir.$name); else imagepng($img, $descDir.$name); } else @copy($src,$descDir.$name); } public function renderConfigXml() { $xml = new SimpleXMLElement(''); if($configs = $this->getSliderConfigs()) { foreach($configs as $key => $val) { $config = $xml->addChild($key); $config->addAttribute('configValue',Configuration::get($key, isset($val['lang']) && $val['lang'] ? (int)Configuration::get('PS_LANG_DEFAULT') : null)); } } return $xml->asXML(); } public function renderSliderDataXml() { $xml = new SimpleXMLElement(''); if($slides = $this->getSlides(false,false,(int)Configuration::get('PS_LANG_DEFAULT'))) { foreach($slides as $slide) { $slideNode = $xml->addChild('slide'); $slideNode->addAttribute('obj','MLS_Slide'); $layersNode = $slideNode->addChild('layers'); if(isset($slide['layers']) && $slide['layers']) { foreach($slide['layers'] as $layer) { $layerNode = $layersNode->addChild('layer'); $layerNode->addAttribute('obj','MLS_Layer'); foreach($layer as $key=>$val) { if($key!='id_layer') $layerNode->addAttribute($key,$val); } } } foreach($slide as $field => $val) { $slideNode->addAttribute($field,$val); } } } return $xml->asXML(); } public function renderInfoXml() { $xml = new SimpleXMLElement(''); $xml->addAttribute('export_time',date('l jS \of F Y h:i:s A')); $xml->addAttribute('export_source',$this->context->link->getPageLink('index', Configuration::get('PS_SSL_ENABLED'))); $xml->addAttribute('module_version',$this->version); if(class_exists('ybc_themeconfig') && ($tc = new Ybc_themeconfig()) && $tc->devMode) { $defaultLayout = isset($tc->configs['YBC_TC_LAYOUT']['default']) ? $tc->configs['YBC_TC_LAYOUT']['default'] : false; $xml->addAttribute('theme_default_items',$defaultLayout ? implode(',',$tc->getLayoutConfiguredField('slides',$defaultLayout)) : ''); } return $xml->asXML(); } public function generateArchive($savePath = false,$greyOutImage = false) { $zip = new ZipArchive(); $cacheDir = dirname(__FILE__).'/cache/'; $zip_file_name = 'mls_slider_'.date('dmYHis').'.zip'; if ($zip->open($cacheDir.$zip_file_name, ZipArchive::OVERWRITE | ZipArchive::CREATE) === true) { if (!$zip->addFromString('Slider-Info.xml', $this->renderInfoXml())) { $this->errors[] = $this->l('Cannot create Menu-Info.xml'); } if (!$zip->addFromString('Config.xml', $this->renderConfigXml())) { $this->errors[] = $this->l('Cannot create config xml file.'); } if (!$zip->addFromString('Data.xml', $this->renderSliderDataXml())) { $this->errors[] = $this->l('Cannot create data xml file.'); } $this->archiveThisFile($zip,'upload', dirname(__FILE__).'/views/img/', 'img/',$greyOutImage); $zip->close(); if (!is_file($cacheDir.$zip_file_name)) { $this->errors[] = $this->l(sprintf('Could not create %1s', _PS_CACHE_DIR_.$zip_file_name)); } if($greyOutImage && ($files = glob(dirname(__FILE__).'/data/temp/*'))) { foreach($files as $file) if(@file_exists($file) && strpos($file,'index.php')===false) @unlink($file); } if (!$this->errors) { if($savePath) { if(@file_exists($savePath) && is_file($savePath)) @unlink($savePath); $copied = @copy($cacheDir.$zip_file_name,$savePath); @unlink($cacheDir.$zip_file_name); return $copied; } if (ob_get_length() > 0) { ob_end_clean(); } ob_start(); header('Pragma: public'); header('Expires: 0'); header('Cache-Control: must-revalidate, post-check=0, pre-check=0'); header('Cache-Control: public'); header('Content-Description: File Transfer'); header('Content-type: application/octet-stream'); header('Content-Disposition: attachment; filename="'.$zip_file_name.'"'); header('Content-Transfer-Encoding: binary'); ob_end_flush(); readfile($cacheDir.$zip_file_name); @unlink($cacheDir.$zip_file_name); exit; } } { if($savePath) return false; echo $this->l('An error occurred during the archive generation'); die; } } public function requestForm() { if(Tools::isSubmit('request_form') && ($mmObj = Tools::getValue('mls_object')) && in_array($mmObj,array('MLS_Slide','MLS_Layer'))) { $obj = ($itemId = (int)Tools::getValue('itemId')) && $itemId > 0 ? new $mmObj($itemId) : new $mmObj(); die(Tools::jsonEncode(array( 'form' => $obj->renderForm(), 'itemId' => $itemId, ))); } } public function displayAdminJs() { $this->smarty->assign(array( 'js_dir_path' => $this->_path.'views/js/', )); return $this->display(__FILE__,'admin-js.tpl'); } public function displayAlerts($time) { $this->smarty->assign(array( 'alerts' => $this->alerts, 'time' => $time, )); return $this->display(__FILE__,'admin-alerts.tpl'); } private function renderOrderString($ids) { $argIds = explode(',',$ids); $str = ''; if($argIds) { foreach($argIds as $id) { $str .= ' p.id_product='.(int)$id.' DESC,'; } } return trim($str,','); } public function hookDisplayHeader() { $this->addGoogleFonts(true); $this->context->controller->addCSS($this->_path.'views/css/multilayerslider.css'); if(@file_exists(dirname(__FILE__).'/views/css/custom.cache.css')) $this->context->controller->addCSS($this->_path.'views/css/custom.cache.css'); $this->context->controller->addCSS($this->_path.'views/css/animate.css'); if($this->is17){ $this->context->controller->addCSS($this->_path.'views/css/fix17.css'); } $this->context->controller->addJS($this->_path.'views/js/mls_slider.pack.js'); $this->context->controller->addJS($this->_path.'views/js/multilayerslider.js'); } public function hookDisplayBackOfficeHeader() { $configure = Tools::getValue('configure'); $controller = Tools::getValue('controller'); if(!($controller =='AdminModules' && $configure == $this->name)) return ''; $this->addGoogleFonts(); $this->context->controller->addCSS($this->_path.'views/css/multilayerslider-admin.css'); $this->context->controller->addCSS($this->_path.'views/css/animate.css'); $this->context->controller->addCSS($this->_path.'views/css/mlsslider.pack.backend.css'); if($this->is17){ $this->context->controller->addCSS($this->_path.'views/css/fix17_bo.css'); } } public function addGoogleFonts($frontend = false) { if($fonts = Db::getInstance()->executeS("SELECT DISTINCT font_family FROM "._DB_PREFIX_."ets_mls_layer")) { $ik = 0; foreach($fonts as $font) { if($font['font_family'] && $font['font_family']!='Times new roman' && $font['font_family']!='Arial') { $ik++; if($this->is17 && $frontend) $this->addCss17('https://fonts.googleapis.com/css?family='.urlencode($font['font_family']),'mls_gfont_'.$ik,false); else $this->context->controller->addCSS('https://fonts.googleapis.com/css?family='.urlencode($font['font_family'])); } } } } public function addCss17($cssFile,$id = false,$local = true) { $this->context->controller->registerStylesheet($id ? $id : '', $cssFile, array('media' => 'all', 'priority' => 150,'server' => $local ? 'local' : 'remote')); } public function strToIds($str) { $ids = array(); if($str && ($arg = explode(',',$str))) { foreach($arg as $id) if(!in_array((int)$id, $ids)) $ids[] = (int)$id; } return $ids; } public static function clearAllCache() { if(@file_exists(dirname(__FILE__).'/views/css/custom.cache.css')) @unlink(dirname(__FILE__).'/views/css/custom.cache.css'); if($files = glob(dirname(__FILE__).'/cache/*')) { foreach($files as $file) if(@file_exists($file) && strpos($file,'index.php')===false) @unlink($file); } } public static function clearUploadedImages() { if(@file_exists(dirname(__FILE__).'/views/img/upload/') && ($files = glob(dirname(__FILE__).'/views/img/upload/*'))) { foreach($files as $file) if(@file_exists($file) && strpos($file,'index.php')===false) @unlink($file); } } public function translates() { self::$trans = array( 'required_text' => $this->l('is required'), 'data_saved' => $this->l('Saved'), 'unkown_error' => $this->l('Unknown error happens'), 'object_empty' => $this->l('Object is empty'), 'field_not_valid' => $this->l('Field is not valid'), 'file_too_large' => $this->l('Upload file cannot be large than 100MB'), 'file_existed' => $this->l('File name already exists. Try to rename the file and upload again'), 'can_not_upload' => $this->l('Cannot upload file'), 'upload_error_occurred' => $this->l('An error occurred during the image upload process.'), 'image_deleted' => $this->l('Image deleted'), 'item_deleted' => $this->l('Item deleted'), 'cannot_delete' => $this->l('Cannot delete the item due to an unknown technical problem'), 'invalid_text' => $this->l('is invalid'), 'content_required_text' => $this->l('Text content is required'), 'link_required_text' => $this->l('Link is required'), 'image_required_text' => $this->l('Image is required'), 'layer_type_not_valid' => $this->l('Layer type is not valid'), ); } public function modulePath() { return $this->_path; } public function layoutDirection() { return $this->context->language->is_rtl ? 'ets-dir-rtl' : 'ets-dir-ltr'; } public function uninstallDb() { return Db::getInstance()->execute("DROP TABLE IF EXISTS "._DB_PREFIX_."ets_mls_slide") &&Db::getInstance()->execute("DROP TABLE IF EXISTS "._DB_PREFIX_."ets_mls_slide_lang") && Db::getInstance()->execute("DROP TABLE IF EXISTS "._DB_PREFIX_."ets_mls_layer") && Db::getInstance()->execute("DROP TABLE IF EXISTS "._DB_PREFIX_."ets_mls_layer_lang"); } public function getSlides($active=false,$id_slide = false,$id_lang = false) { $where = ''; if(class_exists('ybc_themeconfig') && isset($this->context->controller->controller_type) && $this->context->controller->controller_type=='front') { $tc = new Ybc_themeconfig(); if($tc->devMode && ($ids = $tc->getLayoutConfiguredField('slides'))) { $where = ' AND s.id_slide IN('.implode(',',$ids).') '; } } $slides = Db::getInstance()->executeS(' select s.*,sl.title FROM '._DB_PREFIX_.'ets_mls_slide s LEFT JOIN '._DB_PREFIX_.'ets_mls_slide_lang sl on (s.id_slide =sl.id_slide and sl.id_lang='.($id_lang ? (int)$id_lang : (int)$this->context->language->id).') WHERE 1 '.($active ? ' AND s.enabled=1' : '').($id_slide ? ' AND s.id_slide='.(int)$id_slide : '').$where.' ORDER BY s.sort_order'); if($slides) foreach($slides as &$slide) { if($slide['image']) $slide['link_img'] =$this->_path.'views/img/upload/'.$slide['image']; else $slide['link_img']=''; $slide['layers'] = $this->getLayers($slide['id_slide']); $slide['max_layer_in'] = $this->maxLayerIn($slide['id_slide']); $slide['max_layer_out'] = $this->maxLayerOut($slide['id_slide']); } if($id_slide && $slides) return $slides[0]; return $slides; } public function maxLayerIn($id_slide) { return (int)Db::getInstance()->getValue("SELECT max(move_in+start_delay) FROM "._DB_PREFIX_."ets_mls_layer WHERE id_slide=".(int)$id_slide); } public function maxLayerOut($id_slide) { return (int)Db::getInstance()->getValue("SELECT max(move_out+stand_duration) FROM "._DB_PREFIX_."ets_mls_layer WHERE id_slide=".(int)$id_slide); } public function maxSlideTime() { return (int)Db::getInstance()->getValue("SELECT max(l.move_in+l.start_delay) FROM "._DB_PREFIX_."ets_mls_layer l JOIN "._DB_PREFIX_."ets_mls_slide s ON l.id_slide=s.id_slide WHERE s.enabled=1") + (int)Db::getInstance()->getValue("SELECT max(l.move_out+l.stand_duration) FROM "._DB_PREFIX_."ets_mls_layer l JOIN "._DB_PREFIX_."ets_mls_slide s ON l.id_slide=s.id_slide WHERE s.enabled=1"); } public function getLayers($id_slide = false, $id_layer = false) { $layers = Db::getInstance()->executeS(' SELECT l.*,ll.content_layer,ll.link FROM '._DB_PREFIX_.'ets_mls_layer l LEFT JOIN '._DB_PREFIX_.'ets_mls_layer_lang ll ON (l.id_layer=ll.id_layer and ll.id_lang='.(int)$this->context->language->id.') WHERE 1 '.($id_slide ? ' AND l.id_slide='.(int)$id_slide : '').($id_layer ? ' AND l.id_layer='.(int)$id_layer : '').' ORDER BY l.sort_order' ); if($layers) foreach($layers as &$layer) { $layer['link_image'] = $this->_path.'views/img/upload/'.$layer['image']; } if($id_layer && $layers) return $layers[0]; return $layers; } public function multiLayoutExist() { return Db::getInstance()->getRow("SELECT id_lang FROM "._DB_PREFIX_."lang WHERE is_rtl=0 AND active=1") && Db::getInstance()->getRow("SELECT id_lang FROM "._DB_PREFIX_."lang WHERE is_rtl=1 AND active=1"); } public function hex2rgb($hex,$opacity = false) { if(!Validate::isColor($hex)) return $hex; $hex = str_replace("#", "", $hex); if(Tools::strlen($hex) == 3) { $r = hexdec(Tools::substr($hex,0,1).Tools::substr($hex,0,1)); $g = hexdec(Tools::substr($hex,1,1).Tools::substr($hex,1,1)); $b = hexdec(Tools::substr($hex,2,1).Tools::substr($hex,2,1)); } else { $r = hexdec(Tools::substr($hex,0,2)); $g = hexdec(Tools::substr($hex,2,2)); $b = hexdec(Tools::substr($hex,4,2)); } return 'rgba('.$r.','.$g.','.$b.($opacity ? ','.$opacity : '').')'; } public function getPositionLayer(){ $layers = Db::getInstance()->executeS('SELECT * FROM '._DB_PREFIX_.'ets_mls_layer'); die(Tools::jsonEncode($layers)); } public function getSliderConfigs($forJs = false) { $configs = array(); foreach(self::$configs['configs'] as $key => $val) { if($forJs) $configKey = 'data-'.Tools::strtolower(str_replace('_','-',str_replace('ETS_MLS_','',$key))); else $configKey = $key; $configs[$configKey] = Tools::strtolower(Configuration::get($key,isset($val['lang']) && $val['lang'] ? $this->context->language->id : null)); } return $configs; } public function displaySlideFrontend($params) { if (!isset($params['backend_load']) && (!isset($this->context->controller->php_self) || $this->context->controller->php_self != 'index')) return; $this->smarty->assign( array( 'mls_slides' => $this->getSlides(true), 'mls_img_base_dir' => $this->_path.'views/img/', 'mls_layout' => isset($params['layout']) && in_array($params['layout'],array('rtl','ltr')) ? $params['layout'] : ($this->context->language->is_rtl && $this->multiLayoutExist() ? 'rtl' : 'ltr'), 'mls_multilayout' => $this->multiLayoutExist() ? true : false, 'mls_width' => Configuration::get('ETS_MLS_WIDTH_SLIDE') ? Configuration::get('ETS_MLS_WIDTH_SLIDE') : 1170, 'mls_height' => Configuration::get('ETS_MLS_HEIGHT_SLIDE') ? Configuration::get('ETS_MLS_HEIGHT_SLIDE') : 500, 'mls_configs' => $this->getSliderConfigs(), 'mls_max_slide_time' => $this->maxSlideTime()+(int)Configuration::get('ETS_MLS_MOVE_IN')+(int)Configuration::get('ETS_MLS_MOVE_OUT'), 'mls_backend_load' => isset($params['backend_load']), ) ); return $this->display(__FILE__, 'multilayerslider.tpl'); } public function hookDisplayTopColumn($params) { if(!$this->is17 && Configuration::get('ETS_MLS_HOOK_TO')!='customhook') return $this->displaySlideFrontend($params); } public function hookDisplayHome($params) { if($this->is17 && Configuration::get('ETS_MLS_HOOK_TO')!='customhook') return $this->displaySlideFrontend($params); } public function hookDisplayMLS($params) { if(Configuration::get('ETS_MLS_HOOK_TO')=='customhook') return $this->displaySlideFrontend($params); } public function hookDisplayMLSSlider($params) { $this->smarty->assign(array( 'slides' => $this->getSlides(), 'mls_layout' => isset($params['layout']) ? $params['layout'] : 'ltr', )); return $this->display(__FILE__,'item-slider.tpl'); } public function hookDisplayMLSSlide($params) { $this->smarty->assign(array( 'slide' => isset($params['slide']) ? $params['slide'] : false, 'mls_layout' => isset($params['layout']) ? $params['layout'] : 'ltr', )); return $this->display(__FILE__,'item-slide.tpl'); } public function hookDisplayMLSSlideInner($params) { $this->smarty->assign(array( 'slide' => isset($params['slide']) ? $params['slide'] : false, 'mls_layout' => isset($params['layout']) ? $params['layout'] : 'ltr', 'sliderWidth' => Configuration::get('ETS_MLS_WIDTH_SLIDE') ? Configuration::get('ETS_MLS_WIDTH_SLIDE'): 1170, 'sliderHeight' => Configuration::get('ETS_MLS_HEIGHT_SLIDE') ? Configuration::get('ETS_MLS_HEIGHT_SLIDE'):500, )); return $this->display(__FILE__,'item-slide-inner.tpl'); } public function hookDisplayMLSLayer($params) { if(isset($params['layer']['layer_type']) && $params['layer']['layer_type']=='text_background' && isset($params['layer']['background_opacity']) && (float)$params['layer']['background_opacity']<1) { $params['layer']['background_color'] = $this->hex2rgb($params['layer']['background_color'],$params['layer']['background_opacity']); } $this->smarty->assign(array( 'layer' => isset($params['layer']) ? $params['layer'] : false, 'mls_layout' => isset($params['layout']) ? $params['layout'] : 'ltr', 'mls_multilayout' => $this->multiLayoutExist() ? true : false, )); return $this->display(__FILE__,'item-layer.tpl'); } public function hookDisplayMLSLayerSort($params) { $this->smarty->assign(array( 'layer' => isset($params['layer']) ? $params['layer'] : false, )); return $this->display(__FILE__,'item-layer-sort.tpl'); } public function hookDisplayMLSConfigs() { $configStr = ''; if($configs = $this->getSliderConfigs()) { foreach($configs as $key => $val) { if($key!='ETS_MLS_CUSTOM_CSS') { $configStr .= 'data-'.Tools::strtolower(str_replace('_','-',str_replace('ETS_MLS_','',$key))).'="'.Tools::strtolower($val).'" '; } } } return $configStr; } }