/** * Return available modules * * @param boolean $useConfig in order to use config.xml file in module dir * @return array Modules */ public static function getModulesOnDisk($useConfig = false) { global $cookie, $_MODULES; $moduleList = array(); $errors = array(); $modules_dir = self::getModulesDirOnDisk(); foreach ($modules_dir as $module) { $configFile = _PS_MODULE_DIR_ . $module . '/config.xml'; $xml_exist = file_exists($configFile); if ($xml_exist) { $needNewConfigFile = filemtime($configFile) < filemtime(_PS_MODULE_DIR_ . $module . '/' . $module . '.php'); } else { $needNewConfigFile = true; } if ($useConfig and $xml_exist) { $xml_module = simplexml_load_file($configFile); if ((int) $xml_module->need_instance == 0 and !$needNewConfigFile) { $file = _PS_MODULE_DIR_ . $module . '/' . Language::getIsoById($cookie->id_lang) . '.php'; if (Tools::file_exists_cache($file) and (include_once $file)) { if (isset($_MODULE) and is_array($_MODULE)) { $_MODULES = !empty($_MODULES) ? array_merge($_MODULES, $_MODULE) : $_MODULE; } } $xml_module->displayName = Module::findTranslation($xml_module->name, $xml_module->displayName, (string) $xml_module->name); $xml_module->description = Module::findTranslation($xml_module->name, $xml_module->description, (string) $xml_module->name); $xml_module->author = Module::findTranslation($xml_module->name, $xml_module->author, (string) $xml_module->name); if (isset($xml_module->confirmUninstall)) { $xml_module->confirmUninstall = Module::findTranslation($xml_module->name, $xml_module->confirmUninstall, (string) $xml_module->name); } $result = Db::getInstance()->getRow('SELECT `id_module`, `active` FROM `' . _DB_PREFIX_ . 'module` WHERE `name` = \'' . strval($xml_module->name) . '\''); if (isset($result['active']) and $result['active']) { $xml_module->active = $result['active']; } if (isset($result['id_module']) and $result['id_module']) { $xml_module->id = $result['id_module']; } $moduleList[] = $xml_module; } } if (!$useConfig or !$xml_exist or isset($xml_module->need_instance) and (int) $xml_module->need_instance == 1 or $needNewConfigFile) { $file = trim(file_get_contents(_PS_MODULE_DIR_ . $module . '/' . $module . '.php')); if (substr($file, 0, 5) == '<?php') { $file = substr($file, 5); } if (substr($file, -2) == '?>') { $file = substr($file, 0, -2); } if (class_exists($module, false) or eval($file) !== false) { $moduleList[] = new $module(); if (!$xml_exist or $needNewConfigFile) { self::$_generateConfigXmlMode = true; $tmpModule = new $module(); $tmpModule->_generateConfigXml(isset($xml_module->need_instance) ? (int) $xml_module->need_instance : 1); self::$_generateConfigXmlMode = false; } } else { $errors[] = $module; } } } if (sizeof($errors)) { echo '<div class="alert error"><h3>' . Tools::displayError('Parse error(s) in module(s)') . '</h3><ol>'; foreach ($errors as $error) { echo '<li>' . $error . '</li>'; } echo '</ol></div>'; } return $moduleList; }
/** * Return available modules * * @param boolean $useConfig in order to use config.xml file in module dir * @return array Modules */ public static function getModulesOnDisk($useConfig = false) { global $cookie, $_MODULES; $moduleList = array(); $moduleListCursor = 0; $moduleNameList = array(); $modulesNameToCursor = array(); $errors = array(); $modules_dir = self::getModulesDirOnDisk(); $memory_limit = Tools::getMemoryLimit(); foreach ($modules_dir as $module) { // Memory usage checking if (function_exists('memory_get_usage') && $memory_limit != '-1') { $current_memory = memory_get_usage(true); // memory_threshold in MB $memory_threshold = Tools::isX86_64arch() ? 3 : 1.5; if ($memory_limit - $current_memory <= $memory_threshold * 1024 * 1024) { $errors[] = Tools::displayError('All modules cannot be loaded due to memory limit restriction reason, please increase your memory_limit value on your server configuration'); break; } } $configFile = _PS_MODULE_DIR_ . $module . '/config.xml'; $xml_exist = file_exists($configFile); if ($xml_exist) { $needNewConfigFile = filemtime($configFile) < filemtime(_PS_MODULE_DIR_ . $module . '/' . $module . '.php'); } else { $needNewConfigFile = true; } if ($useConfig and $xml_exist) { libxml_use_internal_errors(true); $xml_module = simplexml_load_file($configFile); foreach (libxml_get_errors() as $error) { $errors[] = '[' . $module . '] ' . Tools::displayError('Error found in config file:') . ' ' . htmlentities($error->message); } libxml_clear_errors(); if (!count($errors) and (int) $xml_module->need_instance == 0 and !$needNewConfigFile) { $file = _PS_MODULE_DIR_ . $module . '/' . Language::getIsoById($cookie->id_lang) . '.php'; if (Tools::file_exists_cache($file) and (include_once $file)) { if (isset($_MODULE) and is_array($_MODULE)) { $_MODULES = !empty($_MODULES) ? array_merge($_MODULES, $_MODULE) : $_MODULE; } } $xml_module->displayName = Module::findTranslation($xml_module->name, self::configXmlStringFormat($xml_module->displayName), (string) $xml_module->name); $xml_module->description = Module::findTranslation($xml_module->name, self::configXmlStringFormat($xml_module->description), (string) $xml_module->name); $xml_module->author = Module::findTranslation($xml_module->name, self::configXmlStringFormat($xml_module->author), (string) $xml_module->name); if (isset($xml_module->confirmUninstall)) { $xml_module->confirmUninstall = Module::findTranslation($xml_module->name, self::configXmlStringFormat($xml_module->confirmUninstall), (string) $xml_module->name); } $moduleList[$moduleListCursor] = $xml_module; $moduleNameList[$moduleListCursor] = '\'' . strval($xml_module->name) . '\''; $modulesNameToCursor[strval($xml_module->name)] = $moduleListCursor; $moduleListCursor++; } } if (!$useConfig or !$xml_exist or isset($xml_module->need_instance) and (int) $xml_module->need_instance == 1 or $needNewConfigFile) { // If class already exists, don't include the file if (!class_exists($module, false)) { $filepath = _PS_MODULE_DIR_ . $module . '/' . $module . '.php'; $file = trim(file_get_contents(_PS_MODULE_DIR_ . $module . '/' . $module . '.php')); if (substr($file, 0, 5) == '<?php') { $file = substr($file, 5); } if (substr($file, -2) == '?>') { $file = substr($file, 0, -2); } // if (false) is a trick to not load the class with "eval". // this way require_once will works correctly if (eval('if (false){ ' . $file . ' }') !== false) { require_once _PS_MODULE_DIR_ . $module . '/' . $module . '.php'; } else { $errors[] = sprintf(Tools::displayError('%1$s (parse error in %2$s)'), $module, substr($filepath, strlen(_PS_ROOT_DIR_))); } } if (class_exists($module, false)) { $moduleList[$moduleListCursor++] = new $module(); if (!$xml_exist or $needNewConfigFile) { self::$_generateConfigXmlMode = true; $tmpModule = new $module(); $tmpModule->_generateConfigXml(); self::$_generateConfigXmlMode = false; } } else { $errors[] = sprintf(Tools::displayError('%1$s (class missing in %2$s)'), $module, substr($filepath, strlen(_PS_ROOT_DIR_))); } } } // Get modules information from database if (!empty($moduleNameList)) { $results = Db::getInstance()->executeS('SELECT `id_module`, `active`, `name` FROM `' . _DB_PREFIX_ . 'module` WHERE `name` IN (' . join(',', $moduleNameList) . ')'); foreach ($results as $result) { $moduleCursor = $modulesNameToCursor[$result['name']]; if (isset($result['active']) and $result['active']) { $moduleList[$moduleCursor]->active = $result['active']; } if (isset($result['id_module']) and $result['id_module']) { $moduleList[$moduleCursor]->id = $result['id_module']; } } } if (sizeof($errors)) { echo '<div class="alert error"><h3>' . Tools::displayError('The following module(s) couldn\'t be loaded') . ':</h3><ol>'; foreach ($errors as $error) { echo '<li>' . $error . '</li>'; } echo '</ol></div>'; } return $moduleList; }
/** * Return available modules * * @param boolean $useConfig in order to use config.xml file in module dir * @return array Modules */ public static function getModulesOnDisk($useConfig = false) { global $cookie, $_MODULES; $moduleList = array(); $moduleListCursor = 0; $moduleNameList = array(); $modulesNameToCursor = array(); $errors = array(); $modules_dir = self::getModulesDirOnDisk(); foreach ($modules_dir as $module) { $configFile = _PS_MODULE_DIR_ . $module . '/config.xml'; $xml_exist = file_exists($configFile); if ($xml_exist) { $needNewConfigFile = filemtime($configFile) < filemtime(_PS_MODULE_DIR_ . $module . '/' . $module . '.php'); } else { $needNewConfigFile = true; } if ($useConfig and $xml_exist) { libxml_use_internal_errors(true); $xml_module = simplexml_load_file($configFile); foreach (libxml_get_errors() as $error) { $errors[] = '[' . $module . '] ' . Tools::displayError('Error found in config file:') . ' ' . htmlentities($error->message); } libxml_clear_errors(); if (!count($errors) and (int) $xml_module->need_instance == 0 and !$needNewConfigFile) { $file = _PS_MODULE_DIR_ . $module . '/' . Language::getIsoById($cookie->id_lang) . '.php'; if (Tools::file_exists_cache($file) and (include_once $file)) { if (isset($_MODULE) and is_array($_MODULE)) { $_MODULES = !empty($_MODULES) ? array_merge($_MODULES, $_MODULE) : $_MODULE; } } $xml_module->displayName = Module::findTranslation($xml_module->name, $xml_module->displayName, (string) $xml_module->name); $xml_module->description = Module::findTranslation($xml_module->name, $xml_module->description, (string) $xml_module->name); $xml_module->author = Module::findTranslation($xml_module->name, $xml_module->author, (string) $xml_module->name); if (isset($xml_module->confirmUninstall)) { $xml_module->confirmUninstall = Module::findTranslation($xml_module->name, $xml_module->confirmUninstall, (string) $xml_module->name); } $moduleList[$moduleListCursor] = $xml_module; $moduleNameList[$moduleListCursor] = '\'' . strval($xml_module->name) . '\''; $modulesNameToCursor[strval($xml_module->name)] = $moduleListCursor; $moduleListCursor++; } } if (!$useConfig or !$xml_exist or isset($xml_module->need_instance) and (int) $xml_module->need_instance == 1 or $needNewConfigFile) { $file = trim(file_get_contents(_PS_MODULE_DIR_ . $module . '/' . $module . '.php')); if (substr($file, 0, 5) == '<?php') { $file = substr($file, 5); } if (substr($file, -2) == '?>') { $file = substr($file, 0, -2); } if (class_exists($module, false) or eval($file) !== false) { $moduleList[$moduleListCursor++] = new $module(); if (!$xml_exist or $needNewConfigFile) { self::$_generateConfigXmlMode = true; $tmpModule = new $module(); $tmpModule->_generateConfigXml(); self::$_generateConfigXmlMode = false; } } else { $errors[] = $module; } } } // Get modules information from database if (!empty($moduleNameList)) { $results = Db::getInstance()->executeS('SELECT `id_module`, `active`, `name` FROM `' . _DB_PREFIX_ . 'module` WHERE `name` IN (' . join(',', $moduleNameList) . ')'); foreach ($results as $result) { $moduleCursor = $modulesNameToCursor[$result['name']]; if (isset($result['active']) and $result['active']) { $moduleList[$moduleCursor]->active = $result['active']; } if (isset($result['id_module']) and $result['id_module']) { $moduleList[$moduleCursor]->id = $result['id_module']; } } } if (sizeof($errors)) { echo '<div class="alert error"><h3>' . Tools::displayError('Parse error(s) in module(s)') . '</h3><ol>'; foreach ($errors as $error) { echo '<li>' . $error . '</li>'; } echo '</ol></div>'; } return $moduleList; }