Roby42 Posted December 16, 2017 Share Posted December 16, 2017 Hello, I am unable to enter the modules section from the Prestashop backend. When I try to go into Modules section I receive the error below: Deprecated: Methods with the same name as their class will not be constructors in a future version of PHP; Archive_Tar has a deprecated constructor in /home/shop.com/public_html/tools/tar/Archive_Tar.php on line 32 The Archive_Tar.php file exists in the correct directory. I am running Prestaship 1.5.5.0 with PHP 7.0.26-2 and MySQL version 10.0.31 on Nginx 1.10.3 webserver. It is my intention to upgrade to the latest Prestashop version soon, but for now I need to access the modules as soon as possible. Many thanks for your help. Robert Link to comment Share on other sites More sharing options...
Roby42 Posted December 18, 2017 Author Share Posted December 18, 2017 Anybody any idea? Many thanks in advance. Rob Link to comment Share on other sites More sharing options...
bellini13 Posted December 18, 2017 Share Posted December 18, 2017 Prestashop 1.5.5.0 will not work with PHP 7.0.26-2. That PHP is too modern for such an old version of Prestashop. You may need to get an older version of PHP 5.4 preferably. Link to comment Share on other sites More sharing options...
Roby42 Posted December 18, 2017 Author Share Posted December 18, 2017 Hello, Many thanks for your help. Ok clear. It is not my intention to keep this old Prestashop version running on this server with PHP 7. But because of circumstances (my old server with older PHP and on which my shop was active crashed. The most recent copy of the shop I have on another server which is running PHP 7.) For now I only need to enter the Admin-modules section, but I am running into the error, see post above. Is there any way to correct this error to only be able to access the modules section? I know I still wont be able to run the shop with PHP 7, but i only need to get into the admin-modules for now. Any idea how to accomplish that? Thanks. Link to comment Share on other sites More sharing options...
bellini13 Posted December 19, 2017 Share Posted December 19, 2017 I'm sure there is a lot of code that would have to be refactored. In this case, Prestashop appears to be including a third party archiving tool (from PEAR), perhaps which did not exist as a standard PHP extension/library at the time, but now does. Looks like its purposes is to support modules that were packaged as a .tar file instead of a .zip file. You should not even need this functionality anymore Archive_Tar is located in the tools folder, and searching for that in the code of PS v1.5 shows 4 files LocalizationPack.php AdminModulesController.php AdminTranslationsController.php shopimporter.php Since the module page is failing, then you can focus on AdminModulesController.php for now. There are 2 references The first is in the controllers construct function, so that is easy to just remove this line include_once(_PS_ADMIN_DIR_.'/../tools/tar/Archive_Tar.php'); The second reference is in the extractArchive function. You could probably just remove or comment out the entire 'else' block and just don't try to ad modules using a .tar extension. protected function extractArchive($file, $redirect = true) { $success = false; if (substr($file, -4) == '.zip') { if (Tools::ZipExtract($file, _PS_MODULE_DIR_)) $success = true; else $this->errors[] = Tools::displayError('Error while extracting module (file may be corrupted).'); } else { $archive = new Archive_Tar($file); if ($archive->extract(_PS_MODULE_DIR_)) $success = true; else $this->errors[] = Tools::displayError('Error while extracting module (file may be corrupted).'); } @unlink($file); if ($success && $redirect) Tools::redirectAdmin(self::$currentIndex.'&conf=8'.'&token='.$this->token); } Link to comment Share on other sites More sharing options...
Roby42 Posted December 19, 2017 Author Share Posted December 19, 2017 Many thanks for your reply. I removed the line: include_once(_PS_ADMIN_DIR_.'/../tools/tar/Archive_Tar.php'); My AdminModulesController.php then is as follows. Which part do you think I should remove exactly.? (please excuse me I don't know a lot about coding) I tried to remove the else part, but it gives me a generic "500" error. (debugging is on) In the AdminModulesController.php below only the line from above has been removed by me, so hopefull you can tell me which part exactly needs to be removed. Many thanks in advance. <?php /* * 2007-2013 PrestaShop * * NOTICE OF LICENSE * * This source file is subject to the Open Software License (OSL 3.0) * that is bundled with this package in the file LICENSE.txt. * It is also available through the world-wide-web at this URL: * http://opensource.org/licenses/osl-3.0.php * If you did not receive a copy of the license and are unable to * obtain it through the world-wide-web, please send an email * to [email protected] so we can send you a copy immediately. * * DISCLAIMER * * Do not edit or add to this file if you wish to upgrade PrestaShop to newer * versions in the future. If you wish to customize PrestaShop for your * needs please refer to http://www.prestashop.com for more information. * * @author PrestaShop SA <[email protected]> * @copyright 2007-2013 PrestaShop SA * @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) * International Registered Trademark & Property of PrestaShop SA */ class AdminModulesControllerCore extends AdminController { /* ** @var array map with $_GET keywords and their callback */ protected $map = array( 'install' => 'install', 'uninstall' => 'uninstall', 'configure' => 'getContent', 'update' => 'update', 'delete' => 'delete' ); protected $list_modules_categories = array(); protected $list_partners_modules = array(); protected $list_natives_modules = array(); protected $nb_modules_total = 0; protected $nb_modules_installed = 0; protected $nb_modules_activated = 0; protected $serial_modules = ''; protected $modules_authors = array(); protected $id_employee; protected $iso_default_country; protected $filter_configuration = array(); protected $xml_modules_list = 'api.prestashop.com/xml/modules_list_15.xml'; protected $logged_on_addons = false; /** * Admin Modules Controller Constructor * Init list modules categories * Load id employee * Load filter configuration * Load cache file */ public function __construct() { parent::__construct(); register_shutdown_function('displayFatalError'); // Set the modules categories $this->list_modules_categories['administration']['name'] = $this->l('Administration'); $this->list_modules_categories['advertising_marketing']['name'] = $this->l('Advertising and Marketing'); $this->list_modules_categories['analytics_stats']['name'] = $this->l('Analytics and Stats'); $this->list_modules_categories['billing_invoicing']['name'] = $this->l('Billing and Invoicing'); $this->list_modules_categories['checkout']['name'] = $this->l('Checkout'); $this->list_modules_categories['content_management']['name'] = $this->l('Content Management'); $this->list_modules_categories['export']['name'] = $this->l('Export'); $this->list_modules_categories['emailing']['name'] = $this->l('Emailing'); $this->list_modules_categories['front_office_features']['name'] = $this->l('Front Office Features'); $this->list_modules_categories['i18n_localization']['name'] = $this->l('Internationalization and Localization'); $this->list_modules_categories['merchandizing']['name'] = $this->l('Merchandizing'); $this->list_modules_categories['migration_tools']['name'] = $this->l('Migration Tools'); $this->list_modules_categories['payments_gateways']['name'] = $this->l('Payments and Gateways'); $this->list_modules_categories['payment_security']['name'] = $this->l('Payment Security'); $this->list_modules_categories['pricing_promotion']['name'] = $this->l('Pricing and Promotion'); $this->list_modules_categories['quick_bulk_update']['name'] = $this->l('Quick / Bulk update'); $this->list_modules_categories['search_filter']['name'] = $this->l('Search and Filter'); $this->list_modules_categories['seo']['name'] = $this->l('SEO'); $this->list_modules_categories['shipping_logistics']['name'] = $this->l('Shipping and Logistics'); $this->list_modules_categories['slideshows']['name'] = $this->l('Slideshows'); $this->list_modules_categories['smart_shopping']['name'] = $this->l('Smart Shopping'); $this->list_modules_categories['market_place']['name'] = $this->l('Marketplace'); $this->list_modules_categories['social_networks']['name'] = $this->l('Social Networks'); $this->list_modules_categories['others']['name'] = $this->l('Other Modules'); $this->list_modules_categories['mobile']['name'] = $this->l('Mobile'); // Set Id Employee, Iso Default Country and Filter Configuration $this->id_employee = (int)$this->context->employee->id; $this->iso_default_country = $this->context->country->iso_code; $this->filter_configuration = Configuration::getMultiple(array( 'PS_SHOW_TYPE_MODULES_'.(int)$this->id_employee, 'PS_SHOW_COUNTRY_MODULES_'.(int)$this->id_employee, 'PS_SHOW_INSTALLED_MODULES_'.(int)$this->id_employee, 'PS_SHOW_ENABLED_MODULES_'.(int)$this->id_employee, 'PS_SHOW_CAT_MODULES_'.(int)$this->id_employee, )); // Load cache file modules list (natives and partners modules) $xmlModules = false; if (file_exists(_PS_ROOT_DIR_.Module::CACHE_FILE_MODULES_LIST)) $xmlModules = @simplexml_load_file(_PS_ROOT_DIR_.Module::CACHE_FILE_MODULES_LIST); if ($xmlModules) foreach ($xmlModules->children() as $xmlModule) foreach ($xmlModule->children() as $module) foreach ($module->attributes() as $key => $value) { if ($xmlModule->attributes() == 'native' && $key == 'name') $this->list_natives_modules[] = (string)$value; if ($xmlModule->attributes() == 'partner' && $key == 'name') $this->list_partners_modules[] = (string)$value; } // Check if logged on Addons if (isset($this->context->cookie->username_addons) && isset($this->context->cookie->password_addons) && !empty($this->context->cookie->username_addons) && !empty($this->context->cookie->password_addons)) $this->logged_on_addons = true; } public function setMedia() { parent::setMedia(); $this->addJqueryPlugin(array('autocomplete', 'fancybox')); } public function ajaxProcessRefreshModuleList() { // Refresh modules_list.xml every week if (!$this->isFresh(Module::CACHE_FILE_MODULES_LIST, 604800)) { if ($this->refresh(Module::CACHE_FILE_MODULES_LIST, 'https://'.$this->xml_modules_list)) $this->status = 'refresh'; elseif ($this->refresh(Module::CACHE_FILE_MODULES_LIST, 'http://'.$this->xml_modules_list)) $this->status = 'refresh'; else $this->status = 'error'; } else $this->status = 'cache'; // If logged to Addons Webservices, refresh default country native modules list every day if ($this->status != 'error') { if (!$this->isFresh(Module::CACHE_FILE_DEFAULT_COUNTRY_MODULES_LIST, 86400)) { if (file_put_contents(_PS_ROOT_DIR_.Module::CACHE_FILE_DEFAULT_COUNTRY_MODULES_LIST, Tools::addonsRequest('native'))) $this->status = 'refresh'; else $this->status = 'error'; } else $this->status = 'cache'; if (!$this->isFresh(Module::CACHE_FILE_MUST_HAVE_MODULES_LIST, 86400)) { if (file_put_contents(_PS_ROOT_DIR_.Module::CACHE_FILE_MUST_HAVE_MODULES_LIST, Tools::addonsRequest('must-have'))) $this->status = 'refresh'; else $this->status = 'error'; } else $this->status = 'cache'; } // If logged to Addons Webservices, refresh customer modules list every day if ($this->logged_on_addons && $this->status != 'error') { if (!$this->isFresh(Module::CACHE_FILE_CUSTOMER_MODULES_LIST, 60)) { if (file_put_contents(_PS_ROOT_DIR_.Module::CACHE_FILE_CUSTOMER_MODULES_LIST, Tools::addonsRequest('customer'))) $this->status = 'refresh'; else $this->status = 'error'; } else $this->status = 'cache'; } } public function displayAjaxRefreshModuleList() { echo Tools::jsonEncode(array('status' => $this->status)); } public function ajaxProcessLogOnAddonsWebservices() { $content = Tools::addonsRequest('check_customer', array('username_addons' => pSQL(trim(Tools::getValue('username_addons'))), 'password_addons' => pSQL(trim(Tools::getValue('password_addons'))))); $xml = @simplexml_load_string($content, null, LIBXML_NOCDATA); if (!$xml) die('KO'); $result = strtoupper((string)$xml->success); if (!in_array($result, array('OK', 'KO'))) die ('KO'); if ($result == 'OK') { Configuration::updateValue('PS_LOGGED_ON_ADDONS', 1); $this->context->cookie->username_addons = pSQL(trim(Tools::getValue('username_addons'))); $this->context->cookie->password_addons = pSQL(trim(Tools::getValue('password_addons'))); $this->context->cookie->write(); } die($result); } public function ajaxProcessLogOutAddonsWebservices() { $this->context->cookie->username_addons = ''; $this->context->cookie->password_addons = ''; $this->context->cookie->write(); die('OK'); } public function ajaxProcessReloadModulesList() { if (Tools::getValue('filterCategory')) Configuration::updateValue('PS_SHOW_CAT_MODULES_'.(int)$this->id_employee, Tools::getValue('filterCategory')); if (Tools::getValue('unfilterCategory')) Configuration::updateValue('PS_SHOW_CAT_MODULES_'.(int)$this->id_employee, ''); $this->initContent(); $this->smartyOutputContent('controllers/modules/list.tpl'); exit; } public function ajaxProcessGetTabModulesList() { $tab_modules_list = Tools::getValue('tab_modules_list'); $back = Tools::getValue('back_tab_modules_list'); if ($back) $back .= '&tab_modules_open=1'; $modules_list = array('installed' =>array(), 'not_installed' => array()); if ($tab_modules_list) { $tab_modules_list = explode(',', $tab_modules_list); $all_modules = Module::getModulesOnDisk(true, $this->logged_on_addons, $this->id_employee); foreach($all_modules as $module) { if (in_array($module->name, $tab_modules_list)) { $perm = true; if ($module->id) $perm &= Module::getPermissionStatic($module->id, 'configure'); else { $id_admin_module = Tab::getIdFromClassName('AdminModules'); $access = Profile::getProfileAccess($this->context->employee->id_profile, $id_admin_module); if (!$access['edit']) $perm &= false; } if ($perm) { $this->fillModuleData($module, 'select', $back); if ($module->id) $modules_list['installed'][] = $module; else $modules_list['not_installed'][] = $module; } } } } $this->context->smarty->assign(array( 'tab_modules_list' => $modules_list, 'admin_module_favorites_view' => $this->context->link->getAdminLink('AdminModules').'&select=favorites' )); $this->smartyOutputContent('controllers/modules/tab_modules_list.tpl'); exit; } public function ajaxProcessSetFilter() { $this->setFilterModules(Tools::getValue('module_type'), Tools::getValue('country_module_value'), Tools::getValue('module_install'), Tools::getValue('module_status')); die('OK'); } public function ajaxProcessSaveFavoritePreferences() { $action = Tools::getValue('action_pref'); $value = Tools::getValue('value_pref'); $module = Tools::getValue('module_pref'); $id_module_preference = (int)Db::getInstance()->getValue('SELECT `id_module_preference` FROM `'._DB_PREFIX_.'module_preference` WHERE `id_employee` = '.(int)$this->id_employee.' AND `module` = \''.pSQL($module).'\''); if ($id_module_preference > 0) { if ($action == 'i') $update = array('interest' => ($value == '' ? null : (int)$value)); if ($action == 'f') $update = array('favorite' => ($value == '' ? null : (int)$value)); Db::getInstance()->update('module_preference', $update, '`id_employee` = '.(int)$this->id_employee.' AND `module` = \''.pSQL($module).'\'', 0, true); } else { $insert = array('id_employee' => (int)$this->id_employee, 'module' => pSQL($module), 'interest' => null, 'favorite' => null); if ($action == 'i') $insert['interest'] = ($value == '' ? null : (int)$value); if ($action == 'f') $insert['favorite'] = ($value == '' ? null : (int)$value); Db::getInstance()->insert('module_preference', $insert, true); } die('OK'); } public function ajaxProcessSaveTabModulePreferences() { $values = Tools::getValue('value_pref'); $module = Tools::getValue('module_pref'); if (Validate::isModuleName($module)) { Db::getInstance()->execute('DELETE FROM `'._DB_PREFIX_.'tab_module_preference` WHERE `id_employee` = '.(int)$this->id_employee.' AND `module` = \''.pSQL($module).'\''); if (is_array($values) && count($values)) foreach($values as $value) Db::getInstance()->execute(' INSERT INTO `'._DB_PREFIX_.'tab_module_preference` (`id_tab_module_preference`, `id_employee`, `id_tab`, `module`) VALUES (NULL, '.(int)$this->id_employee.', '.(int)$value.', \''.pSQL($module).'\');'); } die('OK'); } /* ** Get current URL ** ** @param array $remove List of keys to remove from URL ** @return string */ protected function getCurrentUrl($remove = array()) { $url = $_SERVER['REQUEST_URI']; if (!$remove) return $url; if (!is_array($remove)) $remove = array($remove); $url = preg_replace('#(?<=&|\?)('.implode('|', $remove).')=.*?(&|$)#i', '', $url); $len = strlen($url); if ($url[$len - 1] == '&') $url = substr($url, 0, $len - 1); return $url; } protected function extractArchive($file, $redirect = true) { $zip_folders = array(); $tmp_folder = _PS_MODULE_DIR_.md5(time()); $success = false; if (substr($file, -4) == '.zip') { if (Tools::ZipExtract($file, $tmp_folder)) { $zip_folders = scandir($tmp_folder); if (Tools::ZipExtract($file, _PS_MODULE_DIR_)) $success = true; } } else { $archive = new Archive_Tar($file); if ($archive->extract($tmp_folder)) { $zip_folders = scandir($tmp_folder); if ($archive->extract(_PS_MODULE_DIR_)) $success = true; } } if (!$success) $this->errors[] = Tools::displayError('There was an error while extracting the module (file may be corrupted).'); //check if it's a real module foreach($zip_folders as $folder) if (!in_array($folder, array('.', '..', '.svn', '.git', '__MACOSX')) && !Module::getInstanceByName($folder)) { $this->errors[] = Tools::displayError('The \'.$folder.\' you uploaded is not a module'); $this->recursiveDeleteOnDisk(_PS_MODULE_DIR_.$folder); } @unlink($file); $this->recursiveDeleteOnDisk($tmp_folder); if ($success && $redirect) Tools::redirectAdmin(self::$currentIndex.'&conf=8&anchor=anchor'.ucfirst($folder).'&token='.$this->token); return $success; } protected function recursiveDeleteOnDisk($dir) { if (strpos(realpath($dir), realpath(_PS_MODULE_DIR_)) === false) return; if (is_dir($dir)) { $objects = scandir($dir); foreach ($objects as $object) if ($object != '.' && $object != '..') { if (filetype($dir.'/'.$object) == 'dir') $this->recursiveDeleteOnDisk($dir.'/'.$object); else unlink($dir.'/'.$object); } reset($objects); rmdir($dir); } } /* ** Filter Configuration Methods ** Set and reset filter configuration */ protected function setFilterModules($module_type, $country_module_value, $module_install, $module_status) { Configuration::updateValue('PS_SHOW_TYPE_MODULES_'.(int)$this->id_employee, $module_type); Configuration::updateValue('PS_SHOW_COUNTRY_MODULES_'.(int)$this->id_employee, $country_module_value); Configuration::updateValue('PS_SHOW_INSTALLED_MODULES_'.(int)$this->id_employee, $module_install); Configuration::updateValue('PS_SHOW_ENABLED_MODULES_'.(int)$this->id_employee, $module_status); } protected function resetFilterModules() { Configuration::updateValue('PS_SHOW_TYPE_MODULES_'.(int)$this->id_employee, 'allModules'); Configuration::updateValue('PS_SHOW_COUNTRY_MODULES_'.(int)$this->id_employee, 0); Configuration::updateValue('PS_SHOW_INSTALLED_MODULES_'.(int)$this->id_employee, 'installedUninstalled'); Configuration::updateValue('PS_SHOW_ENABLED_MODULES_'.(int)$this->id_employee, 'enabledDisabled'); Configuration::updateValue('PS_SHOW_CAT_MODULES_'.(int)$this->id_employee, ''); } /* ** Post Process Filter ** */ public function postProcessFilterModules() { $this->setFilterModules(Tools::getValue('module_type'), Tools::getValue('country_module_value'), Tools::getValue('module_install'), Tools::getValue('module_status')); Tools::redirectAdmin(self::$currentIndex.'&token='.$this->token); } public function postProcessResetFilterModules() { $this->resetFilterModules(); Tools::redirectAdmin(self::$currentIndex.'&token='.$this->token); } public function postProcessFilterCategory() { // Save configuration and redirect employee Configuration::updateValue('PS_SHOW_CAT_MODULES_'.(int)$this->id_employee, Tools::getValue('filterCategory')); Tools::redirectAdmin(self::$currentIndex.'&token='.$this->token); } public function postProcessUnfilterCategory() { // Save configuration and redirect employee Configuration::updateValue('PS_SHOW_CAT_MODULES_'.(int)$this->id_employee, ''); Tools::redirectAdmin(self::$currentIndex.'&token='.$this->token); } /* ** Post Process Module CallBack ** */ public function postProcessReset() { if ($this->tabAccess['edit'] === '1') { $module = Module::getInstanceByName(Tools::getValue('module_name')); if (Validate::isLoadedObject($module)) { if (!$module->getPermission('configure')) $this->errors[] = Tools::displayError('You do not have the permission to use this module.'); else { if ($module->uninstall()) if ($module->install()) Tools::redirectAdmin(self::$currentIndex.'&conf=21'.'&token='.$this->token.'&tab_module='.$module->tab.'&module_name='.$module->name.'&anchor=anchor'.ucfirst($module->name)); else $this->errors[] = Tools::displayError('Cannot install this module.'); else $this->errors[] = Tools::displayError('Cannot uninstall this module.'); } } else $this->errors[] = Tools::displayError('Cannot load the module\'s object.'); $this->errors = array_merge($this->errors, $module->getErrors()); } else $this->errors[] = Tools::displayError('You do not have permission to add this.'); } public function postProcessDownload() { // PrestaShop demo mode if (_PS_MODE_DEMO_) { $this->errors[] = Tools::displayError('This functionality has been disabled.'); return; } // Try to upload and unarchive the module if ($this->tabAccess['add'] === '1') { // UPLOAD_ERR_OK: 0 // UPLOAD_ERR_INI_SIZE: 1 // UPLOAD_ERR_FORM_SIZE: 2 // UPLOAD_ERR_NO_TMP_DIR: 6 // UPLOAD_ERR_CANT_WRITE: 7 // UPLOAD_ERR_EXTENSION: 8 // UPLOAD_ERR_PARTIAL: 3 if (!isset($_FILES['file']['tmp_name']) || empty($_FILES['file']['tmp_name'])) $this->errors[] = $this->l('No file has been selected'); elseif (substr($_FILES['file']['name'], -4) != '.tar' && substr($_FILES['file']['name'], -4) != '.zip' && substr($_FILES['file']['name'], -4) != '.tgz' && substr($_FILES['file']['name'], -7) != '.tar.gz') $this->errors[] = Tools::displayError('Unknown archive type.'); elseif (!@copy($_FILES['file']['tmp_name'], _PS_MODULE_DIR_.$_FILES['file']['name'])) $this->errors[] = Tools::displayError('An error occurred while copying archive to the module directory.'); else $this->extractArchive(_PS_MODULE_DIR_.$_FILES['file']['name']); } else $this->errors[] = Tools::displayError('You do not have permission to add this.'); } public function postProcessEnable() { if ($this->tabAccess['edit'] === '1') { $module = Module::getInstanceByName(Tools::getValue('module_name')); if (Validate::isLoadedObject($module)) { if (!$module->getPermission('configure')) $this->errors[] = Tools::displayError('You do not have the permission to use this module.'); else { if (Tools::getValue('enable')) $module->enable(); else $module->disable(); Tools::redirectAdmin($this->getCurrentUrl('enable')); } } else $this->errors[] = Tools::displayError('Cannot load the module\'s object.'); } else $this->errors[] = Tools::displayError('You do not have permission to add this.'); } public function postProcessDelete() { if ($this->tabAccess['delete'] === '1') { if (Tools::getValue('module_name') != '') { $module = Module::getInstanceByName(Tools::getValue('module_name')); if (Validate::isLoadedObject($module) && !$module->getPermission('configure')) $this->errors[] = Tools::displayError('You do not have the permission to use this module.'); else { // Uninstall the module before deleting the files, but do not block the process if uninstall returns false if (Module::isInstalled($module->name)) $module->uninstall(); $moduleDir = _PS_MODULE_DIR_.str_replace(array('.', '/', '\\'), array('', '', ''), Tools::getValue('module_name')); $this->recursiveDeleteOnDisk($moduleDir); Tools::redirectAdmin(self::$currentIndex.'&conf=22&token='.$this->token.'&tab_module='.Tools::getValue('tab_module').'&module_name='.Tools::getValue('module_name')); } } } else $this->errors[] = Tools::displayError('You do not have permission to delete this.'); } public function postProcessCallback() { $return = false; $installed_modules = array(); foreach ($this->map as $key => $method) { $modules = Tools::getValue($key); if (strpos($modules, '|')) { $modules_list_save = $modules; $modules = explode('|', $modules); } else $modules = empty($modules) ? false : array($modules); $module_errors = array(); if ($modules) foreach ($modules as $name) { $full_report = null; // If Addons module, download and unzip it before installing it if (!file_exists('../modules/'.$name.'/'.$name.'.php') || $key == 'update') { $filesList = array( array('type' => 'addonsNative', 'file' => Module::CACHE_FILE_DEFAULT_COUNTRY_MODULES_LIST, 'loggedOnAddons' => 0), array('type' => 'addonsBought', 'file' => Module::CACHE_FILE_CUSTOMER_MODULES_LIST, 'loggedOnAddons' => 1), ); foreach ($filesList as $f) if (file_exists(_PS_ROOT_DIR_.$f['file'])) { $file = $f['file']; $content = Tools::file_get_contents(_PS_ROOT_DIR_.$file); $xml = @simplexml_load_string($content, null, LIBXML_NOCDATA); foreach ($xml->module as $modaddons) if ($name == $modaddons->name && isset($modaddons->id) && ($this->logged_on_addons || $f['loggedOnAddons'] == 0)) { $download_ok = false; if ($f['loggedOnAddons'] == 0) if (file_put_contents(_PS_MODULE_DIR_.$modaddons->name.'.zip', Tools::addonsRequest('module', array('id_module' => pSQL($modaddons->id))))) $download_ok = true; elseif ($f['loggedOnAddons'] == 1 && $this->logged_on_addons) if (file_put_contents(_PS_MODULE_DIR_.$modaddons->name.'.zip', Tools::addonsRequest('module', array('id_module' => pSQL($modaddons->id), 'username_addons' => pSQL(trim($this->context->cookie->username_addons)), 'password_addons' => pSQL(trim($this->context->cookie->password_addons)))))) $download_ok = true; if (!$download_ok) $this->errors[] = $this->l('Error on downloading the lastest version'); elseif (!$this->extractArchive(_PS_MODULE_DIR_.$modaddons->name.'.zip', false)) $this->errors[] = $this->l(sprintf("Module %s can't be upgraded: ", $modaddons->name)); } } } // Check potential error if (!($module = Module::getInstanceByName(urldecode($name)))) $this->errors[] = $this->l('Module not found'); elseif ($key == 'install' && $this->tabAccess['add'] !== '1') $this->errors[] = Tools::displayError('You do not have permission to install this module.'); elseif ($key == 'uninstall' && ($this->tabAccess['delete'] !== '1' || !$module->getPermission('configure'))) $this->errors[] = Tools::displayError('You do not have permission to delete this module.'); elseif ($key == 'configure' && ($this->tabAccess['edit'] !== '1' || !$module->getPermission('configure') || !Module::isInstalled(urldecode($name)))) $this->errors[] = Tools::displayError('You do not have permission to configure this module.'); elseif ($key == 'install' && Module::isInstalled($module->name)) $this->errors[] = Tools::displayError('This module is already installed:').' '.$module->name; elseif ($key == 'uninstall' && !Module::isInstalled($module->name)) $this->errors[] = Tools::displayError('This module has already been uninstalled:').' '.$module->name; else if ($key == 'update' && !Module::isInstalled($module->name)) $this->errors[] = Tools::displayError('This module need to be installed in order to be updated:').' '.$module->name; else { // If we install a module, force temporary global context for multishop if (Shop::isFeatureActive() && Shop::getContext() != Shop::CONTEXT_ALL && $method != 'getContent') { Context::getContext()->tmpOldShop = clone(Context::getContext()->shop); Context::getContext()->shop = new Shop(); } //retrocompatibility if (Tools::getValue('controller') != '') $_POST['tab'] = Tools::safeOutput(Tools::getValue('controller')); $echo = ''; if ($key != 'update') { // We check if method of module exists if (!method_exists($module, $method)) throw new PrestaShopException('Method of module can\'t be found'); // Get the return value of current method $echo = $module->{$method}(); // After a successful install of a single module that has a configuration method, to the configuration page if ($key == 'install' && $echo === true && strpos(Tools::getValue('install'), '|') === false && method_exists($module, 'getContent')) Tools::redirectAdmin(self::$currentIndex.'&token='.$this->token.'&configure='.$module->name.'&conf=12'); } // If the method called is "configure" (getContent method), we show the html code of configure page if ($key == 'configure' && Module::isInstalled($module->name)) { if (isset($module->multishop_context)) $this->multishop_context = $module->multishop_context; $backlink = self::$currentIndex.'&token='.$this->token.'&tab_module='.$module->tab.'&module_name='.$module->name; $hooklink = 'index.php?tab=AdminModulesPositions&token='.Tools::getAdminTokenLite('AdminModulesPositions').'&show_modules='.(int)$module->id; $tradlink = 'index.php?tab=AdminTranslations&token='.Tools::getAdminTokenLite('AdminTranslations').'&type=modules&lang='; $toolbar = '<table class="table" cellpadding="0" cellspacing="0" style="margin:auto;text-align:center"><tr> <th>'.$this->l('Module').' <span style="color: green;">'.$module->name.'</span></th> <th><a href="'.$backlink.'" style="padding:5px 10px">'.$this->l('Back').'</a></th> <th><a href="'.$hooklink.'" style="padding:5px 10px">'.$this->l('Manage hooks').'</a></th> <th style="padding:5px 10px">'.$this->l('Manage translations').' '; foreach (Language::getLanguages(false) as $language) $toolbar .= '<a href="'.$tradlink.$language['iso_code'].'#'.$module->name.'" style="margin-left:5px"><img src="'._THEME_LANG_DIR_.$language['id_lang'].'.jpg" alt="'.$language['iso_code'].'" title="'.$language['iso_code'].'" /></a>'; $toolbar .= '</th></tr>'; // Display checkbox in toolbar if multishop if (Shop::isFeatureActive()) { $activateOnclick = 'onclick="location.href = \''.$this->getCurrentUrl('enable').'&enable=\'+(($(this).attr(\'checked\')) ? 1 : 0)"'; $toolbar .= '<tr> <th colspan="4"> <input type="checkbox" name="activateModule" value="1" '.(($module->active) ? 'checked="checked"' : '').' '.$activateOnclick.' /> '.$this->l('Activate module for').' '; if (Shop::getContext() == Shop::CONTEXT_SHOP) $toolbar .= 'shop <b>'.$this->context->shop->name.'</b>'; elseif (Shop::getContext() == Shop::CONTEXT_GROUP) { $shop_group = new ShopGroup((int)Shop::getContextShopGroupID()); $toolbar .= 'all shops of group shop <b>'.$shop_group->name.'</b>'; } else $toolbar .= 'all shops'; $toolbar .= '</th> </tr>'; } $toolbar .= '</table>'; if (Shop::isFeatureActive() && isset(Context::getContext()->tmpOldShop)) { Context::getContext()->shop = clone(Context::getContext()->tmpOldShop); unset(Context::getContext()->tmpOldShop); } // Display module configuration $this->context->smarty->assign('module_content', $toolbar.'<div class="clear"> </div>'.$echo.'<div class="clear"> </div>'.$toolbar); } elseif ($echo === true) { $return = 13; if ($method == 'install') { $return = 12; $installed_modules[] = $module->id; } } elseif ($echo === false) $module_errors[] = array('name' => $name, 'message' => $module->getErrors()); if (Shop::isFeatureActive() && Shop::getContext() != Shop::CONTEXT_ALL && isset(Context::getContext()->tmpOldShop)) { Context::getContext()->shop = clone(Context::getContext()->tmpOldShop); unset(Context::getContext()->tmpOldShop); } } if ($key != 'configure' && isset($_GET['bpay'])) Tools::redirectAdmin('index.php?tab=AdminPayment&token='.Tools::getAdminToken('AdminPayment'.(int)(Tab::getIdFromClassName('AdminPayment')).(int)$this->id_employee)); } if (count($module_errors)) { // If error during module installation, no redirection $html_error = $this->generateHtmlMessage($module_errors); $this->errors[] = sprintf(Tools::displayError('The following module(s) were not installed properly: %s'), $html_error); $this->context->smarty->assign('error_module', 'true'); } } if ($return) { $params = (count($installed_modules)) ? '&installed_modules='.implode('|', $installed_modules) : ''; // If redirect parameter is present and module installed with success, we redirect on configuration module page if (Tools::getValue('redirect') == 'config' && Tools::getValue('module_name') != '' && $return == '12' && Module::isInstalled(pSQL(Tools::getValue('module_name')))) Tools::redirectAdmin('index.php?controller=adminmodules&configure='.Tools::getValue('module_name').'&token='.Tools::getValue('token').'&module_name='.Tools::getValue('module_name').$params); Tools::redirectAdmin(self::$currentIndex.'&conf='.$return.'&token='.$this->token.'&tab_module='.$module->tab.'&module_name='.$module->name.'&anchor=anchor'.ucfirst($module->name).(isset($modules_list_save) ? '&modules_list='.$modules_list_save : '').$params); } if (isset($_GET['update'])) Tools::redirectAdmin(self::$currentIndex.'&token='.$this->token.'&updated=1tab_module='.$module->tab.'&module_name='.$module->name.'&anchor=anchor'.ucfirst($module->name).(isset($modules_list_save) ? '&modules_list='.$modules_list_save : '').$params); } public function postProcess() { // Parent Post Process parent::postProcess(); // Get the list of installed module ans prepare it for ajax call. if (($list = Tools::getValue('installed_modules'))) Context::getContext()->smarty->assign('installed_modules', Tools::jsonEncode(explode('|', $list))); // If redirect parameter is present and module already installed, we redirect on configuration module page if (Tools::getValue('redirect') == 'config' && Tools::getValue('module_name') != '' && Module::isInstalled(pSQL(Tools::getValue('module_name')))) Tools::redirectAdmin('index.php?controller=adminmodules&configure='.Tools::getValue('module_name').'&token='.Tools::getValue('token').'&module_name='.Tools::getValue('module_name')); // Execute filter or callback methods $filterMethods = array('filterModules', 'resetFilterModules', 'filterCategory', 'unfilterCategory'); $callbackMethods = array('reset', 'download', 'enable', 'delete'); $postProcessMethodsList = array_merge((array)$filterMethods, (array)$callbackMethods); foreach ($postProcessMethodsList as $ppm) if (Tools::isSubmit($ppm)) { $ppm = 'postProcess'.ucfirst($ppm); if (method_exists($this, $ppm)) $ppmReturn = $this->$ppm(); } // Call appropriate module callback if (!isset($ppmReturn)) $this->postProcessCallback(); if ($back = Tools::getValue('back')) Tools::redirectAdmin($back); } /** * Generate html errors for a module process * * @param $module_errors * @return string */ protected function generateHtmlMessage($module_errors) { $html_error = ''; if (count($module_errors)) { $html_error = '<ul style="line-height:20px">'; foreach ($module_errors as $module_error) { $html_error_description = ''; if (count($module_error['message']) > 0) foreach ($module_error['message'] as $e) $html_error_description .= '<br />'.$e; $html_error .= '<li><b>- '.$module_error['name'].'</b> : '.$html_error_description.'</li>'; } $html_error .= '</ul>'; } return $html_error; } public function initModulesList(&$modules) { foreach ($modules as $k => $module) { // Check add permissions, if add permissions not set, addons modules and uninstalled modules will not be displayed if ($this->tabAccess['add'] !== '1' && isset($module->type) && ($module->type != 'addonsNative' || $module->type != 'addonsBought')) unset($modules[$k]); else if ($this->tabAccess['add'] !== '1' && (!isset($module->id) || $module->id < 1)) unset($modules[$k]); else if ($module->id && !Module::getPermissionStatic($module->id, 'view') && !Module::getPermissionStatic($module->id, 'configure')) unset($modules[$k]); else { // Init serial and modules author list if (!in_array($module->name, $this->list_natives_modules)) $this->serial_modules .= $module->name.' '.$module->version.'-'.($module->active ? 'a' : 'i')."\n"; $module_author = $module->author; if (!empty($module_author) && ($module_author != '')) $this->modules_authors[strtolower($module_author)] = 'notselected'; } } $this->serial_modules = urlencode($this->serial_modules); } public function makeModulesStats($module) { // Count Installed Modules if (isset($module->id) && $module->id > 0) $this->nb_modules_installed++; // Count Activated Modules if (isset($module->id) && $module->id > 0 && $module->active > 0) $this->nb_modules_activated++; // Count Modules By Category if (isset($this->list_modules_categories[$module->tab]['nb'])) $this->list_modules_categories[$module->tab]['nb']++; else $this->list_modules_categories['others']['nb']++; } public function isModuleFiltered($module) { // If action on module, we display it if (Tools::getValue('module_name') != '' && Tools::getValue('module_name') == $module->name) return false; // Filter on module name $filter_name = Tools::getValue('filtername'); if (!empty($filter_name)) { if (stristr($module->name, $filter_name) === false && stristr($module->displayName, $filter_name) === false && stristr($module->description, $filter_name) === false) return true; return false; } // Filter on interest if ((int)Db::getInstance()->getValue('SELECT `id_module_preference` FROM `'._DB_PREFIX_.'module_preference` WHERE `module` = \''.pSQL($module->name).'\' AND `id_employee` = '.(int)$this->id_employee.' AND `interest` = 0') > 0) return true; // Filter on favorites if (Configuration::get('PS_SHOW_CAT_MODULES_'.(int)$this->id_employee) == 'favorites') { if ((int)Db::getInstance()->getValue('SELECT `id_module_preference` FROM `'._DB_PREFIX_.'module_preference` WHERE `module` = \''.pSQL($module->name).'\' AND `id_employee` = '.(int)$this->id_employee.' AND `favorite` = 1 AND (`interest` = 1 OR `interest` IS NULL)') < 1) return true; } else { // Handle "others" category if (!isset($this->list_modules_categories[$module->tab])) $module->tab = 'others'; // Filter on module category $categoryFiltered = array(); $filterCategories = explode('|', Configuration::get('PS_SHOW_CAT_MODULES_'.(int)$this->id_employee)); if (count($filterCategories) > 0) foreach ($filterCategories as $fc) if (!empty($fc)) $categoryFiltered[$fc] = 1; if (count($categoryFiltered) > 0 && !isset($categoryFiltered[$module->tab])) return true; } // Filter on module type and author $show_type_modules = $this->filter_configuration['PS_SHOW_TYPE_MODULES_'.(int)$this->id_employee]; if ($show_type_modules == 'nativeModules' && !in_array($module->name, $this->list_natives_modules)) return true; else if ($show_type_modules == 'partnerModules' && !in_array($module->name, $this->list_partners_modules)) return true; else if ($show_type_modules == 'addonsModules' && (!isset($module->type) || $module->type != 'addonsBought')) return true; else if ($show_type_modules == 'mustHaveModules' && (!isset($module->type) || $module->type != 'addonsMustHave')) return true; else if ($show_type_modules == 'otherModules' && (in_array($module->name, $this->list_partners_modules) || in_array($module->name, $this->list_natives_modules))) return true; else if (strpos($show_type_modules, 'authorModules[') !== false) { // setting selected author in authors set $author_selected = substr(str_replace(array('authorModules[', "\'"), array('', "'"), $show_type_modules), 0, -1); $this->modules_authors[$author_selected] = 'selected'; if (empty($module->author) || strtolower($module->author) != $author_selected) return true; } // Filter on install status $show_installed_modules = $this->filter_configuration['PS_SHOW_INSTALLED_MODULES_'.(int)$this->id_employee]; if ($show_installed_modules == 'installed' && !$module->id) return true; if ($show_installed_modules == 'uninstalled' && $module->id) return true; // Filter on active status $show_enabled_modules = $this->filter_configuration['PS_SHOW_ENABLED_MODULES_'.(int)$this->id_employee]; if ($show_enabled_modules == 'enabled' && !$module->active) return true; if ($show_enabled_modules == 'disabled' && $module->active) return true; // Filter on country $show_country_modules = $this->filter_configuration['PS_SHOW_COUNTRY_MODULES_'.(int)$this->id_employee]; if ($show_country_modules && (isset($module->limited_countries) && !empty($module->limited_countries) && ((is_array($module->limited_countries) && count($module->limited_countries) && !in_array(strtolower($this->iso_default_country), $module->limited_countries)) || (!is_array($module->limited_countries) && strtolower($this->iso_default_country) != strval($module->limited_countries))))) return true; // Module has not been filtered return false; } public function initContent() { // Adding Css $this->addCSS(__PS_BASE_URI__.str_replace(_PS_ROOT_DIR_.DIRECTORY_SEPARATOR, '', _PS_ADMIN_DIR_).'/themes/'.$this->bo_theme.'/css/modules.css', 'all'); // If we are on a module configuration, no need to load all modules if (Tools::getValue('configure') != '') return true; // Init $smarty = $this->context->smarty; $autocompleteList = 'var moduleList = ['; $nameCountryDefault = Country::getNameById($this->context->language->id, Configuration::get('PS_COUNTRY_DEFAULT')); $categoryFiltered = array(); $filterCategories = explode('|', Configuration::get('PS_SHOW_CAT_MODULES_'.(int)$this->id_employee)); if (count($filterCategories) > 0) foreach ($filterCategories as $fc) if (!empty($fc)) $categoryFiltered[$fc] = 1; foreach ($this->list_modules_categories as $k => $v) $this->list_modules_categories[$k]['nb'] = 0; // Retrieve Modules Preferences $modules_preferences = ''; $tab_modules_preferences = array(); $modules_preferences_tmp = Db::getInstance()->executeS('SELECT * FROM `'._DB_PREFIX_.'module_preference` WHERE `id_employee` = '.(int)$this->id_employee); $tab_modules_preferences_tmp = Db::getInstance()->executeS('SELECT * FROM `'._DB_PREFIX_.'tab_module_preference` WHERE `id_employee` = '.(int)$this->id_employee); foreach($tab_modules_preferences_tmp as $i => $j) $tab_modules_preferences[$j['module']][] = $j['id_tab']; foreach ($modules_preferences_tmp as $k => $v) { if ($v['interest'] == null) unset($v['interest']); if ($v['favorite'] == null) unset($v['favorite']); $modules_preferences[$v['module']] = $v; } // Retrieve Modules List $modules = Module::getModulesOnDisk(true, $this->logged_on_addons, $this->id_employee); $this->initModulesList($modules); $this->nb_modules_total = count($modules); $module_errors = array(); $module_success = array(); $upgrade_available = array(); // Browse modules list foreach ($modules as $km => $module) { //Add succes message for one module update if (Tools::getValue('updated') && Tools::getValue('module_name')) { if ($module->name === (string)Tools::getValue('module_name')) $module_success[] = array('name' => $module->displayName, 'message' => array( 0 => $this->l('Current version:').$module->version)); } //if we are in favorites view we only display installed modules if (Tools::getValue('select') == 'favorites' && !$module->id) { unset($modules[$km]); continue; } // Upgrade Module process, init check if a module could be upgraded if (Module::initUpgradeModule($module)) { // When the XML cache file is up-to-date, the module may not be loaded yet if (!class_exists($module->name)) { if (!file_exists(_PS_MODULE_DIR_.$module->name.'/'.$module->name.'.php')) continue; require_once(_PS_MODULE_DIR_.$module->name.'/'.$module->name.'.php'); } if ($object = new $module->name()) { $object->runUpgradeModule(); if ((count($errors_module_list = $object->getErrors()))) $module_errors[] = array('name' => $module->name, 'message' => $errors_module_list); else if ((count($conf_module_list = $object->getConfirmations()))) $module_success[] = array('name' => $module->name, 'message' => $conf_module_list); unset($object); } } // Module can't be upgraded if not file exist but can change the database version... // User has to be prevented elseif (Module::getUpgradeStatus($module->name)) { // When the XML cache file is up-to-date, the module may not be loaded yet if (!class_exists($module->name)) if (file_exists(_PS_MODULE_DIR_.$module->name.'/'.$module->name.'.php')) { require_once(_PS_MODULE_DIR_.$module->name.'/'.$module->name.'.php'); $object = new $module->name(); $module_success[] = array('name' => $module->name, 'message' => array( 0 => $this->l('Current version:').$object->version, 1 => $this->l('No file upgrades applied (none exist).')) ); } else continue; unset($object); } // Make modules stats $this->makeModulesStats($module); // Assign warnings if ($module->active && isset($module->warning) && !empty($module->warning)) $this->warnings[] = sprintf($this->l('%1$s: %2$s'), $module->displayName, $module->warning); // AutoComplete array $autocompleteList .= Tools::jsonEncode(array( 'displayName' => (string)$module->displayName, 'desc' => (string)$module->description, 'name' => (string)$module->name, 'author' => (string)$module->author, 'image' => (isset($module->image) ? (string)$module->image : ''), 'option' => '', )).', '; // Apply filter if ($this->isModuleFiltered($module) && Tools::getValue('select') != 'favorites') unset($modules[$km]); else { $this->fillModuleData($module); $module->categoryName = (isset($this->list_modules_categories[$module->tab]['name']) ? $this->list_modules_categories[$module->tab]['name'] : $this->list_modules_categories['others']['name']); if (isset($modules_preferences[$modules[$km]->name])) $modules[$km]->preferences = $modules_preferences[$modules[$km]->name]; } unset($object); if (isset($module->version_addons)) $upgrade_available[] = array('anchor' => ucfirst($module->name), 'name' => $module->displayName);; } // Don't display categories without modules $cleaned_list = array(); foreach ($this->list_modules_categories as $k => $list) if ($list['nb'] > 0) $cleaned_list[$k] = $list; // Actually used for the report of the upgraded errors if (count($module_errors)) { $html = $this->generateHtmlMessage($module_errors); $this->errors[] = sprintf(Tools::displayError('The following module(s) were not upgraded successfully: %s'), $html); } if (count($module_success)) { $html = $this->generateHtmlMessage($module_success); $this->confirmations[] = sprintf($this->l('The following module(s) were upgraded successfully:').' %s', $html); } // Init tpl vars for smarty $tpl_vars = array(); $tpl_vars['token'] = $this->token; $tpl_vars['upgrade_available'] = $upgrade_available; $tpl_vars['currentIndex'] = self::$currentIndex; $tpl_vars['dirNameCurrentIndex'] = dirname(self::$currentIndex); $tpl_vars['ajaxCurrentIndex'] = str_replace('index', 'ajax-tab', self::$currentIndex); $tpl_vars['autocompleteList'] = rtrim($autocompleteList, ' ,').'];'; $tpl_vars['showTypeModules'] = $this->filter_configuration['PS_SHOW_TYPE_MODULES_'.(int)$this->id_employee]; $tpl_vars['showCountryModules'] = $this->filter_configuration['PS_SHOW_COUNTRY_MODULES_'.(int)$this->id_employee]; $tpl_vars['showInstalledModules'] = $this->filter_configuration['PS_SHOW_INSTALLED_MODULES_'.(int)$this->id_employee]; $tpl_vars['showEnabledModules'] = $this->filter_configuration['PS_SHOW_ENABLED_MODULES_'.(int)$this->id_employee]; $tpl_vars['nameCountryDefault'] = Country::getNameById($this->context->language->id, Configuration::get('PS_COUNTRY_DEFAULT')); $tpl_vars['isoCountryDefault'] = $this->iso_default_country; $tpl_vars['categoryFiltered'] = $categoryFiltered; $tpl_vars['modules'] = $modules; $tpl_vars['nb_modules'] = $this->nb_modules_total; $tpl_vars['nb_modules_favorites'] = Db::getInstance()->getValue('SELECT COUNT(`id_module_preference`) FROM `'._DB_PREFIX_.'module_preference` WHERE `id_employee` = '.(int)$this->id_employee.' AND `favorite` = 1 AND (`interest` = 1 OR `interest` IS NULL)'); $tpl_vars['nb_modules_installed'] = $this->nb_modules_installed; $tpl_vars['nb_modules_uninstalled'] = $tpl_vars['nb_modules'] - $tpl_vars['nb_modules_installed']; $tpl_vars['nb_modules_activated'] = $this->nb_modules_activated; $tpl_vars['nb_modules_unactivated'] = $tpl_vars['nb_modules_installed'] - $tpl_vars['nb_modules_activated']; $tpl_vars['list_modules_categories'] = $cleaned_list; $tpl_vars['list_modules_authors'] = $this->modules_authors; $tpl_vars['check_url_fopen'] = (ini_get('allow_url_fopen') ? 'ok' : 'ko'); $tpl_vars['check_openssl'] = (extension_loaded('openssl') ? 'ok' : 'ko'); $tpl_vars['add_permission'] = $this->tabAccess['add']; $tpl_vars['tab_modules_preferences'] = $tab_modules_preferences; if ($this->logged_on_addons) { $tpl_vars['logged_on_addons'] = 1; $tpl_vars['username_addons'] = $this->context->cookie->username_addons; } $smarty->assign($tpl_vars); } } Link to comment Share on other sites More sharing options...
bellini13 Posted December 20, 2017 Share Posted December 20, 2017 remove this part else { $archive = new Archive_Tar($file); if ($archive->extract($tmp_folder)) { $zip_folders = scandir($tmp_folder); if ($archive->extract(_PS_MODULE_DIR_)) $success = true; } } Link to comment Share on other sites More sharing options...
Roby42 Posted December 20, 2017 Author Share Posted December 20, 2017 (edited) Thanks. I removed the part above, but am getting "HTTP ERROR 500" now. (error reporting is on) In the Admin most things work, but not the "modules" section... Any further ideas? Thanks, Robert Edited December 20, 2017 by Roby42 (see edit history) Link to comment Share on other sites More sharing options...
bellini13 Posted December 21, 2017 Share Posted December 21, 2017 Go to your php error log and check for error messages Link to comment Share on other sites More sharing options...
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now