Пример #1
0
 /**
  * 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;
 }
Пример #2
0
 /**
  * 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;
 }
Пример #3
0
 /**
  * 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;
 }