* @author PrestaShop SA * @copyright 2022-2023 PhenixSuite * @copyright 2007-2017 PrestaShop SA * @license https://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) * PrestaShop is an internationally registered trademark & property of PrestaShop SA */ if(!defined('_PS_VERSION_')) { exit; } include_once(_PS_MODULE_DIR_.'homeslider/HomeSlide.php'); class HomeSlider extends Module { protected $_html = ''; protected $default_width = 779; protected $default_speed = 500; protected $default_pause = 3000; protected $default_loop = 1; public function __construct() { $this->name = 'homeslider'; $this->tab = 'front_office_features'; $this->version = 13;//'1.6.1'; $this->author = 'PrestaShop Modified by Eolia'; $this->need_instance = 0; $this->bootstrap = true; parent::__construct(); $this->displayName = $this->l('Image slider for your homepage'); $this->description = $this->l('Adds an image slider to your homepage.'); $this->ps_versions_compliancy = array('min' => '1.6.0.4', 'max' => '1.6.99.99'); } /** * @see Module::install() */ public function install() { if(parent::install() && $this->registerHook('displayHeader') && $this->registerHook('displayTopColumn') && $this->registerHook('actionShopDataDuplication') ) { $shops = Shop::getContextListShopID(); $shop_groups_list = array(); // Setup each shop foreach($shops as $shop_id) { $shop_group_id = (int)Shop::getGroupFromShop($shop_id, true); if(!in_array($shop_group_id, $shop_groups_list)) { $shop_groups_list[] = $shop_group_id; } // Sets up configuration $res = Configuration::updateValue('HOMESLIDER_WIDTH', $this->default_width, false, $shop_group_id, $shop_id); $res &= Configuration::updateValue('HOMESLIDER_SPEED', $this->default_speed, false, $shop_group_id, $shop_id); $res &= Configuration::updateValue('HOMESLIDER_PAUSE', $this->default_pause, false, $shop_group_id, $shop_id); $res &= Configuration::updateValue('HOMESLIDER_LOOP', $this->default_loop, false, $shop_group_id, $shop_id); } // Sets up Shop Group configuration if(count($shop_groups_list)) { foreach($shop_groups_list as $shop_group_id) { $res = Configuration::updateValue('HOMESLIDER_WIDTH', $this->default_width, false, $shop_group_id); $res &= Configuration::updateValue('HOMESLIDER_SPEED', $this->default_speed, false, $shop_group_id); $res &= Configuration::updateValue('HOMESLIDER_PAUSE', $this->default_pause, false, $shop_group_id); $res &= Configuration::updateValue('HOMESLIDER_LOOP', $this->default_loop, false, $shop_group_id); } } // Sets up Global configuration $res = Configuration::updateValue('HOMESLIDER_WIDTH', $this->default_width); $res &= Configuration::updateValue('HOMESLIDER_SPEED', $this->default_speed); $res &= Configuration::updateValue('HOMESLIDER_PAUSE', $this->default_pause); $res &= Configuration::updateValue('HOMESLIDER_LOOP', $this->default_loop); // Creates tables $res &= $this->createTables(); // Adds samples if($res) { $this->installSamples(); } // Disable on mobiles and tablets $this->disableDevice(Context::DEVICE_MOBILE); return (bool)$res; } return false; } /** * Adds samples */ protected function installSamples() { $languages = Language::getLanguages(false); for ($i = 1; $i <= 3; ++$i) { $slide = new HomeSlide(); $slide->position = $i; $slide->active = 1; foreach($languages as $language) { $slide->title[$language['id_lang']] = 'Sample '.$i; $slide->description[$language['id_lang']] = '

EXCEPTEUR
OCCAECAT

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Proin tristique in tortor et dignissim. Quisque non tempor leo. Maecenas egestas sem elit

'; $slide->legend[$language['id_lang']] = 'sample-'.$i; $slide->url[$language['id_lang']] = 'http://www.henixsuite.com/?utm_source=back-office&utm_medium=v16_homeslider' .'&utm_campaign=back-office-'.Tools::strtoupper($this->context->language->iso_code) .'&utm_content='.(defined('_PS_HOST_MODE_') ? 'ondemand' : 'download'); $slide->image[$language['id_lang']] = 'sample-'.$i.'.jpg'; } $slide->add(); } } /** * @see Module::uninstall() */ public function uninstall() { if(parent::uninstall()) { $res = $this->deleteTables(); $res &= Configuration::deleteByName('HOMESLIDER_WIDTH'); $res &= Configuration::deleteByName('HOMESLIDER_SPEED'); $res &= Configuration::deleteByName('HOMESLIDER_PAUSE'); $res &= Configuration::deleteByName('HOMESLIDER_LOOP'); return (bool)$res; } return false; } /** * Creates tables */ protected function createTables() { $res = (bool)Db::getInstance()->execute(' CREATE TABLE IF NOT EXISTS `'._DB_PREFIX_.'homeslider` ( `id_homeslider_slides` int(10) unsigned NOT NULL AUTO_INCREMENT, `id_shop` int(10) unsigned NOT NULL, PRIMARY KEY (`id_homeslider_slides`, `id_shop`) ) ENGINE='._MYSQL_ENGINE_.' DEFAULT CHARSET=UTF8; '); $res &= Db::getInstance()->execute(' CREATE TABLE IF NOT EXISTS `'._DB_PREFIX_.'homeslider_slides` ( `id_homeslider_slides` int(10) unsigned NOT NULL AUTO_INCREMENT, `position` int(10) unsigned NOT NULL DEFAULT \'0\', `active` tinyint(1) unsigned NOT NULL DEFAULT \'0\', PRIMARY KEY (`id_homeslider_slides`) ) ENGINE='._MYSQL_ENGINE_.' DEFAULT CHARSET=UTF8; '); $res &= Db::getInstance()->execute(' CREATE TABLE IF NOT EXISTS `'._DB_PREFIX_.'homeslider_slides_lang` ( `id_homeslider_slides` int(10) unsigned NOT NULL, `id_lang` int(10) unsigned NOT NULL, `title` varchar(255) NOT NULL, `description` text NOT NULL, `legend` varchar(255) NOT NULL, `url` varchar(255) NOT NULL, `image` varchar(255) NOT NULL, PRIMARY KEY (`id_homeslider_slides`,`id_lang`) ) ENGINE='._MYSQL_ENGINE_.' DEFAULT CHARSET=UTF8; '); return $res; } /** * Deletes tables */ protected function deleteTables() { $slides = $this->getSlides(); foreach($slides as $slide) { $to_del = new HomeSlide($slide['id_slide']); $to_del->delete(); } return Db::getInstance()->execute(' DROP TABLE IF EXISTS `'._DB_PREFIX_.'homeslider`, `'._DB_PREFIX_.'homeslider_slides`, `'._DB_PREFIX_.'homeslider_slides_lang`; '); } public function getContent() { // Validate & process if(Tools::isSubmit('submitSlide') || Tools::isSubmit('delete_id_slide') || Tools::isSubmit('submitSlider') || Tools::isSubmit('changeStatus') ) { if($this->_postValidation()) { $this->_postProcess(); $this->_html .= $this->renderForm(); $this->_html .= $this->headerHTML(); $this->_html .= $this->renderList(); } else { $this->_html .= $this->renderAddForm(); } $this->clearCache(); } elseif(Tools::isSubmit('addSlide') || (Tools::isSubmit('id_slide') && $this->slideExists((int)Tools::getValue('id_slide'))) ) { if(Tools::isSubmit('addSlide')) { $mode = 'add'; } else { $mode = 'edit'; } if($mode == 'add') { if(Shop::getContext() != Shop::CONTEXT_GROUP && Shop::getContext() != Shop::CONTEXT_ALL ) { $this->_html .= $this->renderAddForm(); } else { $this->_html .= $this->getShopContextError(null, $mode); } } else { $associated_shop_ids = HomeSlide::getAssociatedIdsShop((int)Tools::getValue('id_slide')); $context_shop_id = (int)Shop::getContextShopID(); if($associated_shop_ids === false) { $this->_html .= $this->getShopAssociationError((int)Tools::getValue('id_slide')); } else if(Shop::getContext() != Shop::CONTEXT_GROUP && Shop::getContext() != Shop::CONTEXT_ALL && in_array($context_shop_id, $associated_shop_ids) ) { if(count($associated_shop_ids) > 1) { $this->_html = $this->getSharedSlideWarning(); } $this->_html .= $this->renderAddForm(); } else { $shops_name_list = array(); foreach($associated_shop_ids as $shop_id) { $associated_shop = new Shop((int)$shop_id); $shops_name_list[] = $associated_shop->name; } $this->_html .= $this->getShopContextError($shops_name_list, $mode); } } } else { $this->_html .= $this->getWarningMultishopHtml().$this->getCurrentShopInfoMsg().$this->renderForm(); if(Shop::getContext() != Shop::CONTEXT_GROUP && Shop::getContext() != Shop::CONTEXT_ALL ) { $this->_html .= $this->headerHTML(); $this->_html .= $this->renderList(); } } return $this->_html; } protected function _postValidation() { $errors = array(); // Validation for Slider configuration if(Tools::isSubmit('submitSlider')) { if(!Validate::isInt(Tools::getValue('HOMESLIDER_SPEED')) || !Validate::isInt(Tools::getValue('HOMESLIDER_PAUSE')) || !Validate::isInt(Tools::getValue('HOMESLIDER_WIDTH')) ) { $errors[] = $this->l('Invalid values'); } } // Validation for status elseif(Tools::isSubmit('changeStatus')) { if(!Validate::isInt(Tools::getValue('id_slide'))) { $errors[] = $this->l('Invalid slide'); } } // Validation for Slide elseif(Tools::isSubmit('submitSlide')) { // Checks state (active) if(!Validate::isInt(Tools::getValue('active_slide')) || (Tools::getValue('active_slide') != 0 && Tools::getValue('active_slide') != 1) ) { $errors[] = $this->l('Invalid slide state.'); } // Checks position if(!Validate::isInt(Tools::getValue('position')) || (Tools::getValue('position') < 0) ) { $errors[] = $this->l('Invalid slide position.'); } // If edit : checks id_slide if(Tools::isSubmit('id_slide')) { if(!Validate::isInt(Tools::getValue('id_slide')) && !$this->slideExists(Tools::getValue('id_slide')) ) { $errors[] = $this->l('Invalid slide ID'); } } // Checks title/url/legend/description/image $languages = Language::getLanguages(false); foreach($languages as $language) { if(Tools::strlen(Tools::getValue('title_'.$language['id_lang'])) > 255) { $errors[] = $this->l('The title is too long.'); } if(Tools::strlen(Tools::getValue('legend_'.$language['id_lang'])) > 255) { $errors[] = $this->l('The caption is too long.'); } if(Tools::strlen(Tools::getValue('url_'.$language['id_lang'])) > 255) { $errors[] = $this->l('The URL is too long.'); } if(Tools::strlen(Tools::getValue('description_'.$language['id_lang'])) > 4000) { $errors[] = $this->l('The description is too long.'); } if(Tools::strlen(Tools::getValue('url_'.$language['id_lang'])) > 0 && !Validate::isUrl(Tools::getValue('url_'.$language['id_lang'])) ) { $errors[] = $this->l('The URL format is not correct.'); } if(Tools::getValue('image_'.$language['id_lang']) != null && !Validate::isFileName(Tools::getValue('image_'.$language['id_lang'])) ) { $errors[] = $this->l('Invalid filename.'); } if(Tools::getValue('image_old_'.$language['id_lang']) != null && !Validate::isFileName(Tools::getValue('image_old_'.$language['id_lang'])) ) { $errors[] = $this->l('Invalid filename.'); } } // Checks title/url/legend/description for default lang $id_lang_default = (int)Configuration::get('PS_LANG_DEFAULT'); if(Tools::strlen(Tools::getValue('title_'.$id_lang_default)) == 0) { $errors[] = $this->l('The title is not set.'); } if(Tools::strlen(Tools::getValue('legend_'.$id_lang_default)) == 0) { $errors[] = $this->l('The caption is not set.'); } if(Tools::strlen(Tools::getValue('url_'.$id_lang_default)) == 0) { $errors[] = $this->l('The URL is not set.'); } if(!Tools::isSubmit('has_picture') && (!isset($_FILES['image_'.$id_lang_default]) || empty($_FILES['image_'.$id_lang_default]['tmp_name'])) ) { $errors[] = $this->l('The image is not set.'); } if(Tools::getValue('image_old_'.$id_lang_default) && !Validate::isFileName(Tools::getValue('image_old_'.$id_lang_default)) ) { $errors[] = $this->l('The image is not set.'); } } // Validation for deletion elseif(Tools::isSubmit('delete_id_slide') && (!Validate::isInt(Tools::getValue('delete_id_slide')) || !$this->slideExists((int)Tools::getValue('delete_id_slide'))) ) { $errors[] = $this->l('Invalid slide ID'); } // Display errors if needed if(count($errors)) { $this->_html .= $this->displayError(implode('
', $errors)); return false; } return true; } protected function _postProcess() { $errors = array(); $shop_context = Shop::getContext(); // Processes Slider if(Tools::isSubmit('submitSlider')) { $shop_groups_list = array(); $shops = Shop::getContextListShopID(); foreach($shops as $shop_id) { $shop_group_id = (int)Shop::getGroupFromShop($shop_id, true); if(!in_array($shop_group_id, $shop_groups_list)) { $shop_groups_list[] = $shop_group_id; } $res = Configuration::updateValue('HOMESLIDER_WIDTH', (int)Tools::getValue('HOMESLIDER_WIDTH'), false, $shop_group_id, $shop_id); $res &= Configuration::updateValue('HOMESLIDER_SPEED', (int)Tools::getValue('HOMESLIDER_SPEED'), false, $shop_group_id, $shop_id); $res &= Configuration::updateValue('HOMESLIDER_PAUSE', (int)Tools::getValue('HOMESLIDER_PAUSE'), false, $shop_group_id, $shop_id); $res &= Configuration::updateValue('HOMESLIDER_LOOP', (int)Tools::getValue('HOMESLIDER_LOOP'), false, $shop_group_id, $shop_id); } // Update global shop context if needed switch($shop_context) { case Shop::CONTEXT_ALL: $res = Configuration::updateValue('HOMESLIDER_WIDTH', (int)Tools::getValue('HOMESLIDER_WIDTH')); $res &= Configuration::updateValue('HOMESLIDER_SPEED', (int)Tools::getValue('HOMESLIDER_SPEED')); $res &= Configuration::updateValue('HOMESLIDER_PAUSE', (int)Tools::getValue('HOMESLIDER_PAUSE')); $res &= Configuration::updateValue('HOMESLIDER_LOOP', (int)Tools::getValue('HOMESLIDER_LOOP')); if(count($shop_groups_list)) { foreach($shop_groups_list as $shop_group_id) { $res = Configuration::updateValue('HOMESLIDER_WIDTH', (int)Tools::getValue('HOMESLIDER_WIDTH'), false, $shop_group_id); $res &= Configuration::updateValue('HOMESLIDER_SPEED', (int)Tools::getValue('HOMESLIDER_SPEED'), false, $shop_group_id); $res &= Configuration::updateValue('HOMESLIDER_PAUSE', (int)Tools::getValue('HOMESLIDER_PAUSE'), false, $shop_group_id); $res &= Configuration::updateValue('HOMESLIDER_LOOP', (int)Tools::getValue('HOMESLIDER_LOOP'), false, $shop_group_id); } } break; case Shop::CONTEXT_GROUP: if(count($shop_groups_list)) { foreach($shop_groups_list as $shop_group_id) { $res = Configuration::updateValue('HOMESLIDER_WIDTH', (int)Tools::getValue('HOMESLIDER_WIDTH'), false, $shop_group_id); $res &= Configuration::updateValue('HOMESLIDER_SPEED', (int)Tools::getValue('HOMESLIDER_SPEED'), false, $shop_group_id); $res &= Configuration::updateValue('HOMESLIDER_PAUSE', (int)Tools::getValue('HOMESLIDER_PAUSE'), false, $shop_group_id); $res &= Configuration::updateValue('HOMESLIDER_LOOP', (int)Tools::getValue('HOMESLIDER_LOOP'), false, $shop_group_id); } } break; } $this->clearCache(); if($res) { Tools::redirectAdmin($this->context->link->getAdminLink('AdminModules', true) .'&conf=6&configure='.$this->name.'&tab_module='.$this->tab.'&module_name='.$this->name); } $errors[] = $this->displayError($this->l('The configuration could not be updated.')); } // Process Slide status elseif(Tools::isSubmit('changeStatus') && Tools::isSubmit('id_slide')) { $slide = new HomeSlide((int)Tools::getValue('id_slide')); if($slide->active == 0) { $slide->active = 1; } else { $slide->active = 0; } $res = $slide->update(); $this->clearCache(); if($res) { Tools::redirectAdmin($this->context->link->getAdminLink('AdminModules', true) .'&conf=6&configure='.$this->name.'&tab_module='.$this->tab.'&module_name='.$this->name); } $this->_html .= $this->displayError($this->l('The configuration could not be updated.')); } // Processes Slide elseif(Tools::isSubmit('submitSlide')) { // Sets ID if needed if(Tools::getValue('id_slide')) { $slide = new HomeSlide((int)Tools::getValue('id_slide')); if(!Validate::isLoadedObject($slide)) { $this->_html .= $this->displayError($this->l('Invalid slide ID')); return false; } } else { $slide = new HomeSlide(); } // Sets position $slide->position = (int)Tools::getValue('position'); // Sets active $slide->active = (int)Tools::getValue('active_slide'); // Sets each langue fields $languages = Language::getLanguages(false); foreach($languages as $language) { $slide->title[$language['id_lang']] = Tools::getValue('title_'.$language['id_lang']); $slide->url[$language['id_lang']] = Tools::getValue('url_'.$language['id_lang']); $slide->legend[$language['id_lang']] = Tools::getValue('legend_'.$language['id_lang']); $slide->description[$language['id_lang']] = Tools::getValue('description_'.$language['id_lang']); // Uploads image and sets slide if(!empty($_FILES['image_'.$language['id_lang']]['tmp_name'])) { $type = Tools::strtolower(Tools::substr(strrchr($_FILES['image_'.$language['id_lang']]['name'], '.'), 1)); $imagesize = @getimagesize($_FILES['image_'.$language['id_lang']]['tmp_name']); } if(isset($type) && !empty($imagesize) && in_array( Tools::strtolower(Tools::substr(strrchr($imagesize['mime'], '/'), 1)), array( 'jpg', 'gif', 'jpeg', 'png' ) ) && in_array($type, array('jpg', 'gif', 'jpeg', 'png')) ) { $temp_name = tempnam(_PS_TMP_IMG_DIR_, 'PS'); $salt = sha1(microtime()); if($error = ImageManager::validateUpload($_FILES['image_'.$language['id_lang']])) { $errors[] = $error; } elseif(!$temp_name || !move_uploaded_file($_FILES['image_'.$language['id_lang']]['tmp_name'], $temp_name) ) { return false; } elseif(!ImageManager::resize( $temp_name, dirname(__FILE__).'/images/'.$salt.'_'.$_FILES['image_'.$language['id_lang']]['name'], null, null, $type) ) { $errors[] = $this->displayError($this->l('An error occurred during the image upload process.')); } if(isset($temp_name)) { @unlink($temp_name); } $slide->image[$language['id_lang']] = $salt.'_'.$_FILES['image_'.$language['id_lang']]['name']; } elseif(Tools::getValue('image_old_'.$language['id_lang']) != '') { $slide->image[$language['id_lang']] = Tools::getValue('image_old_'.$language['id_lang']); } } // Processes if no errors if(!$errors) { /* Adds */ if(!Tools::getValue('id_slide')) { if(!$slide->add()) { $errors[] = $this->displayError($this->l('The slide could not be added.')); } } // Update elseif(!$slide->update()) { $errors[] = $this->displayError($this->l('The slide could not be updated.')); } $this->clearCache(); } } // Deletes elseif(Tools::isSubmit('delete_id_slide')) { $slide = new HomeSlide((int)Tools::getValue('delete_id_slide')); $res = $slide->delete(); $this->clearCache(); if(!$res) { $this->_html .= $this->displayError('Could not delete.'); } else { Tools::redirectAdmin($this->context->link->getAdminLink('AdminModules', true) .'&conf=1&configure='.$this->name.'&tab_module='.$this->tab.'&module_name='.$this->name); } } // Display errors if needed if(count($errors)) { $this->_html .= $this->displayError(implode('
', $errors)); } elseif(Tools::isSubmit('submitSlide') && Tools::getValue('id_slide')) { Tools::redirectAdmin($this->context->link->getAdminLink('AdminModules', true) .'&conf=4&configure='.$this->name.'&tab_module='.$this->tab.'&module_name='.$this->name); } elseif(Tools::isSubmit('submitSlide')) { Tools::redirectAdmin($this->context->link->getAdminLink('AdminModules', true) .'&conf=3&configure='.$this->name.'&tab_module='.$this->tab.'&module_name='.$this->name); } } protected function _prepareHook() { if(!$this->isCached('homeslider.tpl', $this->getCacheId())) { $slides = $this->getSlides(true); if(is_array($slides)) foreach($slides as &$slide) { $slide['sizes'] = @getimagesize( dirname(__FILE__).DIRECTORY_SEPARATOR.'images'.DIRECTORY_SEPARATOR.$slide['image'] ); if(isset($slide['sizes'][3]) && $slide['sizes'][3]) $slide['size'] = $slide['sizes'][3]; } if(!$slides) { return false; } $this->smarty->assign(array('homeslider_slides' => $slides)); } return true; } public function hookdisplayHeader($params) { if(!isset($this->context->controller->php_self) || $this->context->controller->php_self != 'index' ) { return; } $this->context->controller->addCSS($this->_path.'homeslider.css'); $this->context->controller->addJS($this->_path.'js/homeslider.js'); $this->context->controller->addJqueryPlugin(array('bxslider')); $config = $this->getConfigFieldsValues(); $slider = array( 'width' => $config['HOMESLIDER_WIDTH'], 'speed' => $config['HOMESLIDER_SPEED'], 'pause' => $config['HOMESLIDER_PAUSE'], 'loop' => (bool)$config['HOMESLIDER_LOOP'], ); $this->smarty->assign('homeslider', $slider); return $this->display(__FILE__, 'header.tpl'); } public function hookdisplayTop($params) { return $this->hookdisplayTopColumn($params); } public function hookdisplayTopColumn($params) { if(!isset($this->context->controller->php_self) || $this->context->controller->php_self != 'index') { return; } if(!$this->_prepareHook()) { return false; } return $this->display(__FILE__, 'homeslider.tpl', $this->getCacheId()); } public function hookDisplayHome() { if(!$this->_prepareHook()) { return false; } return $this->display(__FILE__, 'homeslider.tpl', $this->getCacheId()); } public function clearCache() { $this->_clearCache('*'); } public function hookActionShopDataDuplication($params) { Db::getInstance()->execute(' INSERT IGNORE INTO '._DB_PREFIX_.'homeslider (id_homeslider_slides, id_shop) SELECT id_homeslider_slides, '.(int)$params['new_id_shop'].' FROM '._DB_PREFIX_.'homeslider WHERE id_shop = '.(int)$params['old_id_shop'] ); $this->clearCache(); } public function headerHTML() { if(Tools::getValue('id_slide') || Tools::getValue('controller') != 'AdminModules' && Tools::getValue('configure') != $this->name ) { return; } $this->context->controller->addJS(_PS_JS_DIR_.'vendor/Sortable.min.js'); /* Style & js for fieldset 'slides configuration' */ $html = ''; return $html; } public function getNextPosition() { $row = Db::getInstance(_PS_USE_SQL_SLAVE_)->getRow(' SELECT MAX(hss.`position`) AS `next_position` FROM `'._DB_PREFIX_.'homeslider_slides` hss, `'._DB_PREFIX_.'homeslider` hs WHERE hss.`id_homeslider_slides` = hs.`id_homeslider_slides` AND hs.`id_shop` = '.(int)$this->context->shop->id ); return (++$row['next_position']); } public function getSlides($active = null) { $this->context = Context::getContext(); $id_shop = $this->context->shop->id; $id_lang = $this->context->language->id; return Db::getInstance(_PS_USE_SQL_SLAVE_)->executeS(' SELECT hs.`id_homeslider_slides` as id_slide, hss.`position`, hss.`active`, hssl.`title`, hssl.`url`, hssl.`legend`, hssl.`description`, hssl.`image` FROM '._DB_PREFIX_.'homeslider hs LEFT JOIN '._DB_PREFIX_.'homeslider_slides hss ON(hs.id_homeslider_slides = hss.id_homeslider_slides) LEFT JOIN '._DB_PREFIX_.'homeslider_slides_lang hssl ON(hss.id_homeslider_slides = hssl.id_homeslider_slides) WHERE id_shop = '.(int)$id_shop.' AND hssl.id_lang = '.(int)$id_lang. ($active ? ' AND hss.`active` = 1' : ' ').' ORDER BY hss.position' ); } public function getAllImagesBySlidesId($id_slides, $active = null, $id_shop = null) { $this->context = Context::getContext(); $images = array(); if(!isset($id_shop)) { $id_shop = $this->context->shop->id; } $results = Db::getInstance(_PS_USE_SQL_SLAVE_)->executeS(' SELECT hssl.`image`, hssl.`id_lang` FROM '._DB_PREFIX_.'homeslider hs LEFT JOIN '._DB_PREFIX_.'homeslider_slides hss ON(hs.id_homeslider_slides = hss.id_homeslider_slides) LEFT JOIN '._DB_PREFIX_.'homeslider_slides_lang hssl ON(hss.id_homeslider_slides = hssl.id_homeslider_slides) WHERE hs.`id_homeslider_slides` = '.(int)$id_slides.' AND hs.`id_shop` = '.(int)$id_shop. ($active ? ' AND hss.`active` = 1' : ' ') ); foreach($results as $result) { $images[$result['id_lang']] = $result['image']; } return $images; } public function displayStatus($id_slide, $active) { $title = ((int)$active == 0 ? $this->l('Disabled') : $this->l('Enabled')); $icon = ((int)$active == 0 ? 'icon-remove' : 'icon-check'); $class = ((int)$active == 0 ? 'btn-danger' : 'btn-success'); $html = ' '.$title.''; return $html; } public function slideExists($id_slide) { return Db::getInstance(_PS_USE_SQL_SLAVE_)->getRow(' SELECT hs.`id_homeslider_slides` as id_slide FROM `'._DB_PREFIX_.'homeslider` hs WHERE hs.`id_homeslider_slides` = '.(int)$id_slide ); } public function renderList() { $slides = $this->getSlides(); foreach($slides as $key => $slide) { $slides[$key]['status'] = $this->displayStatus($slide['id_slide'], $slide['active']); $associated_shop_ids = HomeSlide::getAssociatedIdsShop((int)$slide['id_slide']); if($associated_shop_ids && count($associated_shop_ids) > 1) { $slides[$key]['is_shared'] = true; } else { $slides[$key]['is_shared'] = false; } } $this->context->smarty->assign( array( 'link' => $this->context->link, 'slides' => $slides, 'image_baseurl' => $this->_path.'images/' ) ); return $this->display(__FILE__, 'list.tpl'); } public function renderAddForm() { $fields_form = array( 'form' => array( 'legend' => array( 'title' => $this->l('Slide information'), 'icon' => 'icon-cogs' ), 'input' => array( array( 'type' => 'file_lang', 'label' => $this->l('Select a file'), 'name' => 'image', 'required' => true, 'lang' => true, 'desc' => sprintf($this->l('Maximum image size: %s.'), ini_get('upload_max_filesize')) ), array( 'type' => 'text', 'label' => $this->l('Slide title'), 'name' => 'title', 'required' => true, 'lang' => true, ), array( 'type' => 'text', 'label' => $this->l('Target URL'), 'name' => 'url', 'required' => true, 'lang' => true, ), array( 'type' => 'text', 'label' => $this->l('Caption'), 'name' => 'legend', 'required' => true, 'lang' => true, ), array( 'type' => 'textarea', 'label' => $this->l('Description'), 'name' => 'description', 'autoload_rte' => true, 'lang' => true, ), array( 'type' => 'switch', 'label' => $this->l('Enabled'), 'name' => 'active_slide', 'is_bool' => true, 'values' => array( array( 'id' => 'active_on', 'value' => 1, 'label' => $this->l('Yes') ), array( 'id' => 'active_off', 'value' => 0, 'label' => $this->l('No') ) ), ), ), 'submit' => array( 'title' => $this->l('Save'), ) ), ); if(Tools::isSubmit('id_slide') && $this->slideExists((int)Tools::getValue('id_slide')) ) { $slide = new HomeSlide((int)Tools::getValue('id_slide')); $fields_form['form']['input'][] = array('type' => 'hidden', 'name' => 'id_slide'); $fields_form['form']['images'] = $slide->image; $has_picture = true; foreach(Language::getLanguages(false) as $lang) { if(!isset($slide->image[$lang['id_lang']])) { $has_picture &= false; } } if($has_picture) { $fields_form['form']['input'][] = array('type' => 'hidden', 'name' => 'has_picture'); } } $helper = new HelperForm(); $helper->show_toolbar = false; $helper->table = $this->table; $lang = new Language((int)Configuration::get('PS_LANG_DEFAULT')); $helper->default_form_language = $lang->id; $helper->allow_employee_form_lang = Configuration::get('PS_BO_ALLOW_EMPLOYEE_FORM_LANG') ? Configuration::get('PS_BO_ALLOW_EMPLOYEE_FORM_LANG') : 0; $this->fields_form = array(); $helper->module = $this; $helper->identifier = $this->identifier; $helper->submit_action = 'submitSlide'; $helper->currentIndex = $this->context->link->getAdminLink('AdminModules', false).'&configure='.$this->name.'&tab_module='.$this->tab.'&module_name='.$this->name; $helper->token = Tools::getAdminTokenLite('AdminModules'); $language = new Language((int)Configuration::get('PS_LANG_DEFAULT')); $helper->tpl_vars = array( 'base_url' => $this->context->shop->getBaseURL(), 'language' => array( 'id_lang' => $language->id, 'iso_code' => $language->iso_code ), 'fields_value' => $this->getAddFieldsValues(), 'languages' => $this->context->controller->getLanguages(), 'id_language' => $this->context->language->id, 'image_baseurl' => $this->_path.'images/' ); $helper->override_folder = '/'; $languages = Language::getLanguages(false); if(count($languages) > 1) { return $this->getMultiLanguageInfoMsg().$helper->generateForm(array($fields_form)); } else { return $helper->generateForm(array($fields_form)); } } public function renderForm() { $fields_form = array( 'form' => array( 'legend' => array( 'title' => $this->l('Settings'), 'icon' => 'icon-cogs' ), 'input' => array( array( 'type' => 'text', 'label' => $this->l('Maximum image width'), 'name' => 'HOMESLIDER_WIDTH', 'suffix' => 'pixels' ), array( 'type' => 'text', 'label' => $this->l('Speed'), 'name' => 'HOMESLIDER_SPEED', 'suffix' => 'milliseconds', 'desc' => $this->l('The duration of the transition between two slides.') ), array( 'type' => 'text', 'label' => $this->l('Pause'), 'name' => 'HOMESLIDER_PAUSE', 'suffix' => 'milliseconds', 'desc' => $this->l('The delay between two slides.') ), array( 'type' => 'switch', 'label' => $this->l('Auto play'), 'name' => 'HOMESLIDER_LOOP', 'values' => array( array( 'id' => 'active_on', 'value' => 1, 'label' => $this->l('Enabled') ), array( 'id' => 'active_off', 'value' => 0, 'label' => $this->l('Disabled') ) ), ) ), 'submit' => array( 'title' => $this->l('Save'), ) ), ); $helper = new HelperForm(); $helper->show_toolbar = false; $helper->table = $this->table; $lang = new Language((int)Configuration::get('PS_LANG_DEFAULT')); $helper->default_form_language = $lang->id; $helper->allow_employee_form_lang = Configuration::get('PS_BO_ALLOW_EMPLOYEE_FORM_LANG') ? Configuration::get('PS_BO_ALLOW_EMPLOYEE_FORM_LANG') : 0; $this->fields_form = array(); $helper->identifier = $this->identifier; $helper->submit_action = 'submitSlider'; $helper->currentIndex = $this->context->link->getAdminLink('AdminModules', false).'&configure='.$this->name.'&tab_module='.$this->tab.'&module_name='.$this->name; $helper->token = Tools::getAdminTokenLite('AdminModules'); $helper->tpl_vars = array( 'fields_value' => $this->getConfigFieldsValues(), 'languages' => $this->context->controller->getLanguages(), 'id_language' => $this->context->language->id ); return $helper->generateForm(array($fields_form)); } public function getConfigFieldsValues() { $id_shop_group = Shop::getContextShopGroupID(); $id_shop = Shop::getContextShopID(); return array( 'HOMESLIDER_WIDTH' => Tools::getValue('HOMESLIDER_WIDTH', Configuration::get('HOMESLIDER_WIDTH', null, $id_shop_group, $id_shop)), 'HOMESLIDER_SPEED' => Tools::getValue('HOMESLIDER_SPEED', Configuration::get('HOMESLIDER_SPEED', null, $id_shop_group, $id_shop)), 'HOMESLIDER_PAUSE' => Tools::getValue('HOMESLIDER_PAUSE', Configuration::get('HOMESLIDER_PAUSE', null, $id_shop_group, $id_shop)), 'HOMESLIDER_LOOP' => Tools::getValue('HOMESLIDER_LOOP', Configuration::get('HOMESLIDER_LOOP', null, $id_shop_group, $id_shop)), ); } public function getAddFieldsValues() { $fields = array(); if(Tools::isSubmit('id_slide') && $this->slideExists((int)Tools::getValue('id_slide')) ) { $slide = new HomeSlide((int)Tools::getValue('id_slide')); $fields['id_slide'] = (int)Tools::getValue('id_slide', $slide->id); } else { $slide = new HomeSlide(); } $fields['active_slide'] = Tools::getValue('active_slide', $slide->active); $fields['has_picture'] = true; $languages = Language::getLanguages(false); foreach($languages as $lang) { $fields['image'][$lang['id_lang']] = Tools::getValue('image_'.(int)$lang['id_lang']); $fields['title'][$lang['id_lang']] = Tools::getValue('title_'.(int)$lang['id_lang'], $slide->title[$lang['id_lang']]); $fields['url'][$lang['id_lang']] = Tools::getValue('url_'.(int)$lang['id_lang'], $slide->url[$lang['id_lang']]); $fields['legend'][$lang['id_lang']] = Tools::getValue('legend_'.(int)$lang['id_lang'], $slide->legend[$lang['id_lang']]); $fields['description'][$lang['id_lang']] = Tools::getValue('description_'.(int)$lang['id_lang'], $slide->description[$lang['id_lang']]); } return $fields; } protected function getMultiLanguageInfoMsg() { return '

'. $this->l('Since multiple languages are activated on your shop, please mind to upload your image for each one of them'). '

'; } protected function getWarningMultishopHtml() { if(Shop::getContext() == Shop::CONTEXT_GROUP || Shop::getContext() == Shop::CONTEXT_ALL) { return '

'. $this->l('You cannot manage slides items from a "All Shops" or a "Group Shop" context, select directly the shop you want to edit'). '

'; } else { return ''; } } protected function getShopContextError($shop_contextualized_name, $mode) { if(is_array($shop_contextualized_name)) { $shop_contextualized_name = implode('
', $shop_contextualized_name); } if($mode == 'edit') { return '

'. sprintf($this->l('You can only edit this slide from the shop(s) context: %s'), $shop_contextualized_name). '

'; } else { return '

'. sprintf($this->l('You cannot add slides from a "All Shops" or a "Group Shop" context')). '

'; } } protected function getShopAssociationError($id_slide) { return '

'. sprintf($this->l('Unable to get slide shop association information (id_slide: %d)'), (int)$id_slide). '

'; } protected function getCurrentShopInfoMsg() { $shop_info = null; if(Shop::isFeatureActive()) { if(Shop::getContext() == Shop::CONTEXT_SHOP) { $shop_info = sprintf($this->l('The modifications will be applied to shop: %s'), $this->context->shop->name); } elseif(Shop::getContext() == Shop::CONTEXT_GROUP) { $shop_info = sprintf($this->l('The modifications will be applied to this group: %s'), Shop::getContextShopGroup()->name); } else { $shop_info = $this->l('The modifications will be applied to all shops and shop groups'); } return '
'. $shop_info. '
'; } else { return ''; } } protected function getSharedSlideWarning() { return '

'. $this->l('This slide is shared with other shops! All shops associated to this slide will apply modifications made here'). '

'; } }