* @copyright 2011-2017 PresTeamShop * @license see file: LICENSE.txt * @category PrestaShop * @category Module */ class OnePageCheckoutPSCore extends Module { public $config_vars = array(); public $prefix_module = ''; protected $configure_vars = array(); protected $errors = array(); protected $warnings = array(); protected $html = ''; protected $smarty; protected $cookie; protected $success; protected $params_back; public $globals; const CODE_SUCCESS = 0; const CODE_ERROR = -1; public function __construct($name = null, $context = null) { $this->errors = array(); $this->warnings = array(); $this->params_back = array(); $this->globals = new stdClass(); $this->fillGlobalVars(); parent::__construct($name, $context); $this->smarty = $this->context->smarty; $this->cookie = $this->context->cookie; $this->fillConfigVars(); } public function install() { foreach ($this->configure_vars as $config) { if (!Configuration::updateValue($config['name'], $config['default_value'], $config['is_html'])) { return false; } } $this->installTab(); if (!parent::install() || !$this->executeFileSQL('install')) { return false; } return true; } public function uninstall() { foreach ($this->configure_vars as $config) { Configuration::deleteByName($config['name']); } if ($id_tab = Tab::getIdFromClassName('AdminActions'.$this->prefix_module)) { $tab = new Tab((int)$id_tab); $tab->delete(); } if (!parent::uninstall() || !$this->executeFileSQL('uninstall')) { return false; } if (isset($this->context->smarty->registered_plugins['modifier']['escape'])) { $this->context->smarty->unregisterPlugin('modifier', 'escape'); } //clear compile templates $this->context->smarty->clearCompiledTemplate(); return true; } public function installTab() { $id_tab = Tab::getIdFromClassName('AdminActions'.$this->prefix_module); if (!empty($id_tab)) { $tab = new Tab((int)$id_tab); $tab->delete(); } if (!Tab::getIdFromClassName('AdminActions'.$this->prefix_module)) { $name_tab = array(); $languages = Language::getLanguages(false); foreach ($languages as $lang) { $name_tab[$lang['id_lang']] = $this->displayName; } $tab = new Tab(); $tab->id_parent = (int)Tab::getIdFromClassName('AdminParentModulesSf'); $tab->class_name = 'AdminActions'.$this->prefix_module; $tab->module = $this->name; $tab->name = $name_tab; $tab->save(); } } private function fillGlobalVars() { $this->globals->type_control = (object) array( 'select' => 'select', 'textbox' => 'textbox', 'textarea' => 'textarea', 'radio' => 'radio', 'checkbox' => 'checkbox' ); $this->globals->lang = new stdClass(); $this->globals->lang->type_control = array( 'select' => $this->l('List'), 'textbox' => $this->l('Textbox'), 'textarea' => $this->l('Textarea'), 'radio' => $this->l('Radio button'), 'checkbox' => $this->l('Checkbox') ); } protected function displayForm() { if (!array_key_exists('JS_FILES', $this->params_back)) { $this->params_back['JS_FILES'] = array(); } if (!array_key_exists('CSS_FILES', $this->params_back)) { $this->params_back['CSS_FILES'] = array(); } //add anothers scripts if (version_compare(_PS_VERSION_, '1.6') < 0) { array_unshift( $this->params_back['JS_FILES'], $this->_path.'views/js/lib/bootstrap/pts/bootstrap.min.js' ); if (version_compare(_PS_VERSION_, '1.5') < 0) { //add jquery in lower version than 1.5 array_unshift( $this->params_back['JS_FILES'], $this->_path.'views/js/lib/jquery/jquery.min/jquery.min.js' ); } //add bootstrap files if issen't 1.6 } array_push($this->params_back['CSS_FILES'], $this->_path.'views/css/lib/jquery/plugins/growl/jquery.growl.css'); array_push($this->params_back['JS_FILES'], $this->_path.'views/js/lib/jquery/plugins/growl/jquery.growl.js'); //own bootstrap array_push($this->params_back['CSS_FILES'], $this->_path.'views/css/lib/bootstrap/pts/pts-bootstrap.css'); //switch array_push($this->params_back['CSS_FILES'], $this->_path.'views/css/lib/simple-switch/simple-switch.css'); //back array_push($this->params_back['JS_FILES'], $this->_path.'views/js/admin/configure.js'); array_push($this->params_back['JS_FILES'], $this->_path.'views/js/lib/pts/tools.js'); array_push($this->params_back['CSS_FILES'], $this->_path.'views/css/admin/configure.css'); array_push($this->params_back['CSS_FILES'], $this->_path.'views/css/lib/pts/tools.css'); array_push($this->params_back['CSS_FILES'], $this->_path.'views/css/lib/pts/pts-menu.css'); //icons array_push( $this->params_back['CSS_FILES'], $this->_path.'views/css/lib/font-awesome/font-awesome.css' ); $iso = Language::getIsoById((int) Configuration::get('PS_LANG_DEFAULT')); $server_name = Tools::strtolower($_SERVER['SERVER_NAME']); $server_name = str_ireplace('www.', '', $server_name); $url_store = $this->getUrlStore().$this->context->shop->getBaseURI().'modules/'.$this->name; $query_string = str_replace('&conf=12', '', $_SERVER['QUERY_STRING']); $action_url = Tools::safeOutput($_SERVER['PHP_SELF']).'?'.$query_string; $this->params_back = array_merge(array( 'ACTIONS_CONTROLLER_URL' => $this->context->link->getAdminLink('AdminActions'.$this->prefix_module), 'MODULE_DIR' => $this->_path, 'MODULE_IMG' => $this->_path.'views/img/', 'MODULE_NAME' => $this->name, 'MODULE_VERSION' => $this->version, 'MODULE_TPL' => _PS_ROOT_DIR_.'/modules/'.$this->name.'/', 'CONFIGS' => $this->config_vars, 'ISO_LANG' => $iso, 'GLOBALS' => $this->globals, 'VERSION' => $this->version, 'SUCCESS_CODE' => self::CODE_SUCCESS, 'ERROR_CODE' => self::CODE_ERROR, 'SERVER_NAME' => $server_name, 'MODULE_PATH_ABSOLUTE' => realpath(dirname(__FILE__).'/../'), 'URL_STORE' => $url_store, 'ACTION_URL' => $action_url, 'WARNINGS' => $this->warnings, $this->prefix_module.'_STATIC_TOKEN' => Tools::encrypt($this->name.'/index'), ), $this->params_back); $this->smarty->assign('paramsBack', $this->params_back); } private function executeFileSQL($file_name) { if (!file_exists(dirname(__FILE__).'/../sql/'.$file_name.'.sql')) { return true; } elseif (!$sql = Tools::file_get_contents(dirname(__FILE__).'/../sql/'.$file_name.'.sql')) { return false; } $sql = str_replace('PREFIX_', _DB_PREFIX_, $sql); $sql = str_replace('MYSQL_ENGINE', _MYSQL_ENGINE_, $sql); $sql = preg_split("/;\s*[\r\n]+/", $sql); foreach ($sql as $query) { if (!Db::getInstance()->Execute(trim($query))) { return false; } } return true; } protected function fillConfigVars() { if (!Module::isInstalled($this->name)) { return false; } $languages = Language::getLanguages(false); foreach ($this->configure_vars as $config) { if (isset($config['is_bool']) && $config['is_bool']) { $this->config_vars[$config['name']] = (bool)Configuration::get($config['name']); } else { $this->config_vars[$config['name']] = Configuration::get($config['name']); if (isset($config['is_lang']) && $config['is_lang']) { $this->config_vars[$config['name']] = array(); foreach ($languages as $language) { $this->config_vars[$config['name']][$language['id_lang']] = Configuration::get( $config['name'], $language['id_lang'] ); } } } } $this->config_vars[$this->prefix_module.'_RM'] = Configuration::get($this->prefix_module.'_RM'); } protected function displayErrors($return = true) { if (count($this->errors)) { $html = '
    '; foreach ($this->errors as $error) { $html .= '
  1. '.$error.'
  2. '; } $html .= '
'; if ($return) { $this->html = $html; } else { echo $html; } } } protected function displayWarnings($return = true) { if (count($this->warning)) { $html = '
    '; foreach ($this->warning as $warning) { $html .= '
  1. '.$warning.'
  2. '; } $html .= '
'; if ($return) { $this->html = $html; } else { echo $html; } } } protected function sendEmail( $email, $subject, $values = array(), $template_name = 'default', $email_from = null, $to_name = null, $lang = null, $file_attachment = null ) { if ($lang == null) { $lang = (int) Configuration::get('PS_LANG_DEFAULT'); } if ($email_from == null) { $email_from = (string) Configuration::get('PS_SHOP_EMAIL'); } return Mail::Send( $lang, $template_name, $subject, $values, $email, $to_name, $email_from, null, $file_attachment, null, _PS_MODULE_DIR_.$this->name.'/mails/' ); } public function updateVersion() { $registered_version = Configuration::get($this->prefix_module.'_VERSION'); if ($registered_version != $this->version) { $list = array(); $upgrade_path = _PS_MODULE_DIR_.$this->name.'/upgrades/'; // Check if folder exist and it could be read if (file_exists($upgrade_path) && ($files = scandir($upgrade_path))) { // Read each file name foreach ($files as $file) { if (!in_array($file, array('.', '..', '.svn', 'index.php'))) { $tab = explode('-', $file); $file_version = basename($tab[1], '.php'); // Compare version, if minor than actual, we need to upgrade the module if (count($tab) == 2 && version_compare($registered_version, $file_version) < 0) { $list[] = array( 'file' => $upgrade_path.$file, 'version' => $file_version, 'upgrade_function' => 'upgrade_module_'.str_replace('.', '_', $file_version)); } } } } usort($list, array($this, 'moduleVersionSort')); foreach ($list as $num => $file_detail) { include $file_detail['file']; // Call the upgrade function if defined if (function_exists($file_detail['upgrade_function'])) { $file_detail['upgrade_function']($this); } unset($list[$num]); } Configuration::updateValue($this->prefix_module.'_VERSION', $this->version); $this->fillConfigVars(); } return 'OK'; } public function checkModulePTS() { return true; } public function isVisible() { $display_module = true; $enable_debug = $this->config_vars[$this->prefix_module.'_ENABLE_DEBUG']; if ($enable_debug) { $display_module = false; $my_ip = Tools::getRemoteAddr(); $ip_debug = $this->config_vars[$this->prefix_module.'_IP_DEBUG']; $array_ips_debug = explode(',', $ip_debug); if (in_array($my_ip, $array_ips_debug)) { $display_module = true; } } if ($display_module) { $registered_version = Configuration::get($this->prefix_module.'_VERSION'); if ($registered_version != $this->version) { $display_module = false; } } return $display_module; } protected function copyOverride($file) { $source = _PS_MODULE_DIR_.$this->name.'/public/'.$file; $dest = _PS_ROOT_DIR_.'/'.$file; $path_dest = dirname($dest); if (!is_dir($path_dest)) { if (!mkdir($path_dest, 0777, true)) { return false; } } if (@copy($source, $dest)) { $path_cache_file = _PS_ROOT_DIR_.'/cache/class_index.php'; if (file_exists($path_cache_file)) { unlink($path_cache_file); } return true; } return false; } protected function existOverride($filename, $key = false) { $file = _PS_ROOT_DIR_.'/'.$filename; if (file_exists($file)) { if ($key) { $file_content = Tools::file_get_contents($file); if (preg_match($key, $file_content) > 0) { return true; } return false; } return true; } return false; } public function isModuleActive($name_module, $function_exist = false) { if (Module::isInstalled($name_module)) { $module = Module::getInstanceByName($name_module); if (Validate::isLoadedObject($module) && $module->active) { $sql = new DbQuery(); $sql->from('module_shop', 'm'); $sql->where('m.id_module = '.(int)$module->id); $sql->where('m.enable_device & '.(int)Context::getContext()->getDevice()); $sql->where('m.id_shop = '.(int)Context::getContext()->shop->id); $active_device = Db::getInstance(_PS_USE_SQL_SLAVE_)->executeS($sql); if ($active_device) { if ($function_exist) { if (method_exists($module, $function_exist)) { return $module; } else { return false; } } return $module; } } } return false; } public function getContext() { return $this->context; } public function getUrlStore() { return (Configuration::get('PS_SSL_ENABLED') ? Tools::getShopDomainSsl(true) : Tools::getShopDomain(true)); } public static function getServerIpAddress() { $server_addr = $_SERVER['SERVER_ADDR']; if ($server_addr === '::1') { $hostname = php_uname('n'); $server_addr = gethostbyname($hostname); } return $server_addr; } private function moduleVersionSort($a, $b) { return version_compare($a['version'], $b['version']); } /** * Customize save data from form. * @param type $option * @param string $config_var_value */ protected function saveCustomConfigValue($option, &$config_var_value) { switch ($option['name']) { case 'custom': $config_var_value = ''; break; } } /** * @internal This method is not editable, use saveCustomConfigValue if necessary * @param type $option */ protected function saveConfigValue($option) { $config_var_name = $this->prefix_module.'_'.$option['name']; $config_var_name = Tools::strtoupper($config_var_name); if (array_key_exists($config_var_name, $this->config_vars)) { if (isset($option['multilang'])) { $languages = Language::getLanguages(false); $config_var_value = array(); foreach ($languages as $language) { $config_var_value[$language['id_lang']] = Tools::getValue($option['name'].'_'.$language['id_lang']); } } else { $config_var_value = Tools::getValue($option['name'], null); } switch ($option['type']) { case $this->globals->type_control->checkbox: $config_var_value = (int) ((is_null($config_var_value) || empty($config_var_value)) ? false : true); break; case $this->globals->type_control->select: if (isset($option['multiple']) && $option['multiple']) { if (is_array($config_var_value) && count($config_var_value)) { $config_var_value = implode(',', $config_var_value); } else { $config_var_value = ''; } } break; default: $config_var_value = (is_null($config_var_value)) ? '' : $config_var_value; break; } //call function to save some options by custom restrictions or data treatment $this->saveCustomConfigValue($option, $config_var_value); //save value if (!Configuration::updateValue($config_var_name, $config_var_value)) { $this->errors[] = $this->l('An error occurred while trying update').': '.$option['label']; } //if dependencies if (isset($option['depends']) && is_array($option['depends']) && count($option['depends'])) { foreach ($option['depends'] as $dependency_option) { $this->saveConfigValue($dependency_option); } } } } /** * Save data configuration from post form. * @param type $form */ protected function saveFormData($form) { if (isset($form['options']) && is_array($form['options']) && count($form['options'])) { foreach ($form['options'] as $option) { $this->saveConfigValue($option); } $this->fillConfigVars(); } } public function writeLog($error = null) { $name_error = Tools::getValue('name_error', 'Internal error'); $code_error = Tools::getValue('code_error', '000'); $error = Tools::getValue('error', $error); $data_sent = Tools::getValue('data_sent'); $name_log = date('Ymd').'_error.log'; $message = '['.$code_error.'] '.$name_error."\n".$error."\n\n".$data_sent."\n"; $message .= '----------------------------------------------------------------'."\n\n"; $file_log = fopen(dirname(__FILE__).'/../log/'.$name_log, 'a+'); fwrite($file_log, $message); fclose($file_log); if (class_exists('PrestaShopLogger')) { PrestaShopLogger::addLog($message, 3, $code_error, 'OnePageCheckoutPS'); } return 'An internal error has occurred. Please inform the administrator of the store, thank you.'; } protected function truncateChars($text, $limit, $ellipsis = '...') { if (Tools::strlen($text) > $limit) { $text = trim(Tools::substr($text, 0, $limit)).$ellipsis; } return $text; } protected function getCacheId($extra_params = array()) { $cacheId = ''; $cache_array = array(); $cache_array[] = $this->name; $cache_array[] = (int)$this->context->shop->id; $cache_array[] = (int)$this->context->language->id; $cache_array[] = (int)$this->context->currency->id; $cacheId = implode('|', $cache_array); $cacheId .= '|'.implode('|', $extra_params); return $cacheId; } protected static function getFormatedName($name) { $theme_name = Context::getContext()->shop->theme_name; $name_without_theme_name = str_replace(array('_'.$theme_name, $theme_name.'_'), '', $name); //check if the theme name is already in $name if yes only return $name if (strstr($name, $theme_name) && self::getByNameNType($name)) { return $name; } elseif (self::getByNameNType($name_without_theme_name.'_'.$theme_name)) { return $name_without_theme_name.'_'.$theme_name; } elseif (self::getByNameNType($theme_name.'_'.$name_without_theme_name)) { return $theme_name.'_'.$name_without_theme_name; } else { return $name_without_theme_name.'_default'; } } public static function getByNameNType($name, $type = null) { $results = Db::getInstance()->ExecuteS('SELECT * FROM `'._DB_PREFIX_.'image_type`'); $types = array('products', 'categories', 'manufacturers', 'suppliers', 'scenes', 'stores'); $total = count($types); foreach ($results as $result) { foreach ($result as $value) { $value = $value; for ($i = 0; $i < $total; ++$i) { if ($name === $result['name'] && $types[$i] === $type) { return $result; } } } } return false; } }