* @copyright Since 2007 PrestaShop SA and Contributors * @license https://opensource.org/licenses/AFL-3.0 Academic Free License 3.0 (AFL-3.0) */ if (!defined('_PS_VERSION_')) { exit; } use PrestaShop\PrestaShop\Core\Module\WidgetInterface; class Ps_Banner extends Module implements WidgetInterface { /** * @var string Name of the module running on PS 1.6.x. Used for data migration. */ const PS_16_EQUIVALENT_MODULE = 'blockbanner'; private $templateFile; public function __construct() { $this->name = 'ps_banner'; $this->tab = 'front_office_features'; $this->version = '2.1.2'; $this->author = 'PrestaShop'; $this->need_instance = 0; $this->bootstrap = true; parent::__construct(); $this->displayName = $this->trans('Banner', [], 'Modules.Banner.Admin'); $this->description = $this->trans('Add a banner to the homepage of your store to highlight your sales and new products in a visual and friendly way.', [], 'Modules.Banner.Admin'); $this->ps_versions_compliancy = ['min' => '1.7.1.0', 'max' => _PS_VERSION_]; $this->templateFile = 'module:ps_banner/ps_banner.tpl'; } public function install() { return parent::install() && $this->registerHook('displayHome') && $this->registerHook('actionObjectLanguageAddAfter') && $this->installFixtures() && $this->uninstallPrestaShop16Module() && $this->disableDevice(Context::DEVICE_MOBILE); } /** * Migrate data from 1.6 equivalent module (if applicable), then uninstall */ public function uninstallPrestaShop16Module() { if (!Module::isInstalled(self::PS_16_EQUIVALENT_MODULE)) { return true; } // Data migration Configuration::updateValue('BANNER_IMG', Configuration::getInt('BLOCKBANNER_IMG')); Configuration::updateValue('BANNER_LINK', Configuration::getInt('BLOCKBANNER_LINK')); Configuration::updateValue('BANNER_DESC', Configuration::getInt('BLOCKBANNER_DESC')); $oldModule = Module::getInstanceByName(self::PS_16_EQUIVALENT_MODULE); if ($oldModule) { $oldModule->uninstall(); } return true; } public function hookActionObjectLanguageAddAfter($params) { return $this->installFixture((int) $params['object']->id, Configuration::get('BANNER_IMG', (int) Configuration::get('PS_LANG_DEFAULT'))); } protected function installFixtures() { $languages = Language::getLanguages(false); foreach ($languages as $lang) { $this->installFixture((int) $lang['id_lang'], 'sale70.png'); } return true; } protected function installFixture($id_lang, $image = null) { $values['BANNER_IMG'][(int) $id_lang] = $image; $values['BANNER_LINK'][(int) $id_lang] = ''; $values['BANNER_DESC'][(int) $id_lang] = ''; Configuration::updateValue('BANNER_IMG', $values['BANNER_IMG']); Configuration::updateValue('BANNER_LINK', $values['BANNER_LINK']); Configuration::updateValue('BANNER_DESC', $values['BANNER_DESC']); } public function uninstall() { Configuration::deleteByName('BANNER_IMG'); Configuration::deleteByName('BANNER_LINK'); Configuration::deleteByName('BANNER_DESC'); return parent::uninstall(); } public function postProcess() { if (Tools::isSubmit('submitStoreConf')) { $languages = Language::getLanguages(false); $values = []; $update_images_values = false; foreach ($languages as $lang) { if (isset($_FILES['BANNER_IMG_' . $lang['id_lang']]) && isset($_FILES['BANNER_IMG_' . $lang['id_lang']]['tmp_name']) && !empty($_FILES['BANNER_IMG_' . $lang['id_lang']]['tmp_name'])) { if ($error = ImageManager::validateUpload($_FILES['BANNER_IMG_' . $lang['id_lang']], 4000000)) { return $this->displayError($error); } else { $ext = substr($_FILES['BANNER_IMG_' . $lang['id_lang']]['name'], strrpos($_FILES['BANNER_IMG_' . $lang['id_lang']]['name'], '.') + 1); $file_name = md5($_FILES['BANNER_IMG_' . $lang['id_lang']]['name']) . '.' . $ext; if (!move_uploaded_file($_FILES['BANNER_IMG_' . $lang['id_lang']]['tmp_name'], dirname(__FILE__) . DIRECTORY_SEPARATOR . 'img' . DIRECTORY_SEPARATOR . $file_name)) { return $this->displayError($this->trans('An error occurred while attempting to upload the file.', [], 'Admin.Notifications.Error')); } else { if (Configuration::hasContext('BANNER_IMG', $lang['id_lang'], Shop::getContext()) && Configuration::get('BANNER_IMG', $lang['id_lang']) != $file_name) { @unlink(dirname(__FILE__) . DIRECTORY_SEPARATOR . 'img' . DIRECTORY_SEPARATOR . Configuration::get('BANNER_IMG', $lang['id_lang'])); } $values['BANNER_IMG'][$lang['id_lang']] = $file_name; } } $update_images_values = true; } $values['BANNER_LINK'][$lang['id_lang']] = Tools::getValue('BANNER_LINK_' . $lang['id_lang']); $values['BANNER_DESC'][$lang['id_lang']] = Tools::getValue('BANNER_DESC_' . $lang['id_lang']); } if ($update_images_values && isset($values['BANNER_IMG'])) { Configuration::updateValue('BANNER_IMG', $values['BANNER_IMG']); } Configuration::updateValue('BANNER_LINK', $values['BANNER_LINK']); Configuration::updateValue('BANNER_DESC', $values['BANNER_DESC']); $this->_clearCache($this->templateFile); return $this->displayConfirmation($this->trans('The settings have been updated.', [], 'Admin.Notifications.Success')); } return ''; } public function getContent() { return $this->postProcess() . $this->renderForm(); } public function renderForm() { $fields_form = [ 'form' => [ 'legend' => [ 'title' => $this->trans('Settings', [], 'Admin.Global'), 'icon' => 'icon-cogs', ], 'input' => [ [ 'type' => 'file_lang', 'label' => $this->trans('Banner image', [], 'Modules.Banner.Admin'), 'name' => 'BANNER_IMG', 'desc' => $this->trans('Upload an image for your top banner. The recommended dimensions are 1110 x 214px if you are using the default theme.', [], 'Modules.Banner.Admin'), 'lang' => true, ], [ 'type' => 'text', 'lang' => true, 'label' => $this->trans('Banner Link', [], 'Modules.Banner.Admin'), 'name' => 'BANNER_LINK', 'desc' => $this->trans('Enter the link associated to your banner. When clicking on the banner, the link opens in the same window. If no link is entered, it redirects to the homepage.', [], 'Modules.Banner.Admin'), ], [ 'type' => 'text', 'lang' => true, 'label' => $this->trans('Banner description', [], 'Modules.Banner.Admin'), 'name' => 'BANNER_DESC', 'desc' => $this->trans('Please enter a short but meaningful description for the banner.', [], 'Modules.Banner.Admin'), ], ], 'submit' => [ 'title' => $this->trans('Save', [], 'Admin.Actions'), ], ], ]; $lang = new Language((int) Configuration::get('PS_LANG_DEFAULT')); $helper = new HelperForm(); $helper->show_toolbar = false; $helper->table = $this->table; $helper->default_form_language = $lang->id; $helper->module = $this; $helper->allow_employee_form_lang = Configuration::get('PS_BO_ALLOW_EMPLOYEE_FORM_LANG') ? Configuration::get('PS_BO_ALLOW_EMPLOYEE_FORM_LANG') : 0; $helper->identifier = $this->identifier; $helper->submit_action = 'submitStoreConf'; $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 = [ 'uri' => $this->getPathUri(), 'fields_value' => $this->getConfigFieldsValues(), 'languages' => $this->context->controller->getLanguages(), 'id_language' => $this->context->language->id, ]; return $helper->generateForm([$fields_form]); } public function getConfigFieldsValues() { $languages = Language::getLanguages(false); $fields = []; foreach ($languages as $lang) { $fields['BANNER_IMG'][$lang['id_lang']] = Tools::getValue('BANNER_IMG_' . $lang['id_lang'], Configuration::get('BANNER_IMG', $lang['id_lang'])); $fields['BANNER_LINK'][$lang['id_lang']] = Tools::getValue('BANNER_LINK_' . $lang['id_lang'], Configuration::get('BANNER_LINK', $lang['id_lang'])); $fields['BANNER_DESC'][$lang['id_lang']] = Tools::getValue('BANNER_DESC_' . $lang['id_lang'], Configuration::get('BANNER_DESC', $lang['id_lang'])); } return $fields; } public function renderWidget($hookName, array $params) { if (!$this->isCached($this->templateFile, $this->getCacheId('ps_banner'))) { $this->smarty->assign($this->getWidgetVariables($hookName, $params)); } return $this->fetch($this->templateFile, $this->getCacheId('ps_banner')); } public function getWidgetVariables($hookName, array $params) { $imgname = Configuration::get('BANNER_IMG', $this->context->language->id); $imgDir = _PS_MODULE_DIR_ . $this->name . DIRECTORY_SEPARATOR . 'img' . DIRECTORY_SEPARATOR . $imgname; if ($imgname && file_exists($imgDir)) { $sizes = getimagesize($imgDir); $this->smarty->assign([ 'banner_img' => $this->context->link->protocol_content . Tools::getMediaServer($imgname) . $this->_path . 'img/' . $imgname, 'banner_width' => $sizes[0], 'banner_height' => $sizes[1], ]); } $banner_link = Configuration::get('BANNER_LINK', $this->context->language->id); if (!$banner_link) { $banner_link = $this->context->link->getPageLink('index'); } return [ 'banner_link' => $this->updateUrl($banner_link), 'banner_desc' => Configuration::get('BANNER_DESC', $this->context->language->id), ]; } private function updateUrl($link) { if (substr($link, 0, 7) !== 'http://' && substr($link, 0, 8) !== 'https://') { $link = 'http://' . $link; } return $link; } }