diff --git a/admin-dev/themes/template/modules/content.tpl b/admin-dev/themes/template/modules/content.tpl index 1b857ca8d..c5a12b551 100644 --- a/admin-dev/themes/template/modules/content.tpl +++ b/admin-dev/themes/template/modules/content.tpl @@ -28,6 +28,6 @@ {if isset($module_content)} {$module_content} {else} - {include file='themes/template/modules/js.tpl'} - {include file='themes/template/modules/list.tpl'} -{/if} \ No newline at end of file + {include file='modules/js.tpl'} + {include file='modules/page.tpl'} +{/if} diff --git a/admin-dev/themes/template/modules/filters.tpl b/admin-dev/themes/template/modules/filters.tpl new file mode 100644 index 000000000..d23404b76 --- /dev/null +++ b/admin-dev/themes/template/modules/filters.tpl @@ -0,0 +1,78 @@ +{* +* 2007-2011 PrestaShop +* +* NOTICE OF LICENSE +* +* This source file is subject to the Academic Free License (AFL 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/afl-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 license@prestashop.com 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 +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 9771 $ +* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*} + + +
+
+ + +
+ +
+ +
+ + + +   + +   + +   + + +
+ +
+ + +
+ +
+ +
+ diff --git a/admin-dev/themes/template/modules/header.tpl b/admin-dev/themes/template/modules/header.tpl new file mode 100644 index 000000000..0ea59587f --- /dev/null +++ b/admin-dev/themes/template/modules/header.tpl @@ -0,0 +1,71 @@ +{* +* 2007-2011 PrestaShop +* +* NOTICE OF LICENSE +* +* This source file is subject to the Academic Free License (AFL 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/afl-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 license@prestashop.com 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 +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 9771 $ +* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*} + +
+
+ + + +
+

Module : Liste de modules

+
+ +
+
+ + +
+
+ {l s='Add a new module'} {l s='Add a new module'} +

{'The module must be either a zip file or a tarball.'}

+
+
+ +
+ +

{l s='Upload the module from your computer.'}

+
+
+ +
+
+
+
+
+
diff --git a/admin-dev/themes/template/modules/js.tpl b/admin-dev/themes/template/modules/js.tpl index 6d2259b27..ad8613a0b 100644 --- a/admin-dev/themes/template/modules/js.tpl +++ b/admin-dev/themes/template/modules/js.tpl @@ -35,6 +35,7 @@ var dirNameCurrentIndex = '{$dirNameCurrentIndex}'; var ajaxCurrentIndex = '{$ajaxCurrentIndex}'; var by = '{l s='by'}'; + var errorLogin = '{l s='Could not login to Addons'}'; {literal} function getPrestaStore(){if(getE("prestastore").style.display!='block')return;$.post(dirNameCurrentIndex+"/ajax.php",{page:"prestastore"},function(a){getE("prestastore-content").innerHTML=a;})} @@ -76,7 +77,7 @@ }); }); - // the following to get modules_list.xml from prestashop.com + // Method to get modules_list.xml from prestashop.com and default_country_modules_list.xml from addons.prestashop.com $(document).ready(function(){ try { @@ -103,5 +104,52 @@ } catch(e){} }); + + + // Method to log on PrestaShop Addons WebServices + $(document).ready(function(){ + $('#addons_login_button').click(function() + { + var username_addons = $("#username_addons").val(); + var password_addons = $("#password_addons").val(); + try + { + resAjax = $.ajax({ + type:"POST", + url : ajaxCurrentIndex, + async: true, + data : { + ajax : "1", + token : token, + controller : "AdminModules", + action : "logOnAddonsWebservices", + username_addons : username_addons, + password_addons : password_addons + }, + beforeSend: function(xhr) + { + $('#addons_loading').html(''); + }, + success : function(data) + { + // res.status = cache or refresh + if (data != 'KO') + { + $('#addons_loading').html(''); + $('#addons_login_div').fadeOut(); + } + else + $('#addons_loading').html(errorLogin); + }, + error: function(res,textStatus,jqXHR) + { + //alert("TECHNICAL ERROR"+res); + } + }); + } + catch(e){} + return false; + }); + }); {/literal} - \ No newline at end of file + diff --git a/admin-dev/themes/template/modules/list.tpl b/admin-dev/themes/template/modules/list.tpl index 16f6010f7..f50bbde20 100644 --- a/admin-dev/themes/template/modules/list.tpl +++ b/admin-dev/themes/template/modules/list.tpl @@ -24,156 +24,6 @@ * International Registered Trademark & Property of PrestaShop SA *} -
-
-
- - - -
-

Module : Liste de modules

-
- -
-
- - -
-
- {l s='Add a new module'} {l s='Add a new module'} -

{'The module must be either a zip file or a tarball.'}

-
-
- -
- -

{l s='Upload the module from your computer.'}

-
-
- -
-
-
-
-
-
- - - -
-
- - -
- -
- -
- - - -   - -   - -   - - -
- -
- - -
- -
- -
- - -
- - - -
@@ -197,7 +47,7 @@ {foreach from=$modules item=module} - + {/foreach} - -

{$module->displayName}{if isset($module->id) && $module->id gt 0}{l s='Installed'}{else}{l s='Not installed'}{/if}

@@ -210,7 +60,7 @@ {/if}
{l s='Version'} :
-
{$module->version}
| +
{$module->version} {if isset($module->version_addons)}({l s='Update'} {$module->version_addons} {l s='available on PrestaShop Addons'}){/if}
|
{l s='Category'} :
@@ -227,8 +77,6 @@
{if isset($module->id) && $module->id gt 0}{l s='Uninstall'}{else}{l s='Install'}{/if}
-
-
-
+ + + diff --git a/admin-dev/themes/template/modules/page.tpl b/admin-dev/themes/template/modules/page.tpl new file mode 100644 index 000000000..50a9cb26f --- /dev/null +++ b/admin-dev/themes/template/modules/page.tpl @@ -0,0 +1,72 @@ +{* +* 2007-2011 PrestaShop +* +* NOTICE OF LICENSE +* +* This source file is subject to the Academic Free License (AFL 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/afl-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 license@prestashop.com 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 +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 9771 $ +* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*} + +
+ + {include file='modules/header.tpl'} + {include file='modules/filters.tpl'} + + + {if !isset($logged_on_addons)} + +
+
+ + + + +
+ +
+ + {/if} + + + + +
+ + + +
+ {include file='modules/list.tpl'} +
+
+ +
diff --git a/classes/Module.php b/classes/Module.php index 9ba1b8ebb..941cc7b5a 100644 --- a/classes/Module.php +++ b/classes/Module.php @@ -616,20 +616,25 @@ abstract class ModuleCore } } + // Check if config.xml module file exists and if it's not outdated $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 config.xml exists and that the use config flag is at true if ($useConfig && $xml_exist) { + // Load config.xml 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 no errors in Xml, no need instand and no need new config.xml file, we load only translations if (!count($errors) && (int)$xml_module->need_instance == 0 && !$needNewConfigFile) { $file = _PS_MODULE_DIR_.$module.'/'.Context::getContext()->language->iso_code.'.php'; @@ -657,28 +662,49 @@ abstract class ModuleCore } } + // If use config flag is at false or config.xml does not exist OR need instance OR need a new config.xml file 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 does not exists, we include the file if (!class_exists($module, false)) { + // Get content from php file $filepath = _PS_MODULE_DIR_.$module.'/'.$module.'.php'; - $file = trim(file_get_contents(_PS_MODULE_DIR_.$module.'/'.$module.'.php')); - if (substr($file, 0, 5) == '') - $file = substr($file, 0, -2); - // if (false) is a trick to not load the class with "eval". - // this way require_once will works correctly + $file = trim(file_get_contents(_PS_MODULE_DIR_.$module.'/'.$module.'.php')); + if (substr($file, 0, 5) == '') + $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, we just instanciate it if (class_exists($module,false)) { - $moduleList[$moduleListCursor++] = new $module; + $tmpModule = new $module; + + $item = new stdClass(); + $item->id = $tmpModule->id; + $item->warning = $tmpModule->warning; + $item->name = $tmpModule->name; + $item->version = $tmpModule->version; + $item->tab = $tmpModule->tab; + $item->displayName = $tmpModule->displayName; + $item->description = $tmpModule->description; + $item->author = $tmpModule->author; + $item->limited_countries = $tmpModule->limited_countries; + $item->is_configurable = isset($tmpModule->is_configurable) ? $tmpModule->is_configurable : 0; + $item->need_instance = isset($tmpModule->need_instance) ? $tmpModule->need_instance : 0; + $item->active = $tmpModule->active; + unset($tmpModule); + + $moduleList[] = $item; if (!$xml_exist OR $needNewConfigFile) { self::$_generateConfigXmlMode = true; @@ -711,6 +737,57 @@ abstract class ModuleCore } } + + // Get Default Country Modules and customer module + $filesList = array(_PS_ROOT_DIR_.'/config/default_country_modules_list.xml', _PS_ROOT_DIR_.'/config/default_customer_modules_list.xml'); + foreach ($filesList as $file) + if (file_exists($file)) + { + $content = Tools::file_get_contents($file); + $xml = @simplexml_load_string($content, NULL, LIBXML_NOCDATA); + foreach ($xml->module as $modaddons) + { + $flagFound = 0; + foreach ($moduleList as $k => $m) + if ($m->name == $modaddons->name && !isset($m->available_on_addons)) + { + $flagFound = 1; + if ($m->version != $modaddons->version && version_compare($m->version, $modaddons->version) === -1) + $moduleList[$k]->version_addons = $modaddons->version; + } + if ($flagFound == 0) + { + $item = new stdClass(); + $item->id = 0; + $item->warning = ''; + $item->name = strip_tags((string)$modaddons->name); + $item->version = strip_tags((string)$modaddons->version); + $item->tab = strip_tags((string)$modaddons->tab); + $item->displayName = strip_tags((string)$modaddons->displayName).' (Addons)'; + $item->description = strip_tags((string)$modaddons->description); + $item->author = strip_tags((string)$modaddons->author); + $item->limited_countries = array(); + $item->is_configurable = 0; + $item->need_instance = 0; + $item->available_on_addons = 1; + $item->active = 0; + if (!isset($modaddons->img) && isset($modaddons->id)) + $modaddons->img = 'http://media.prestastore.com/img/pico/'.(int)$modaddons->id.'.jpg'; + if (isset($modaddons->img)) + { + if (!file_exists('../img/tmp/'.md5($modaddons->name).'.jpg')) + copy($modaddons->img, '../img/tmp/'.md5($modaddons->name).'.jpg'); + if (file_exists('../img/tmp/'.md5($modaddons->name).'.jpg')) + $item->image = '../img/tmp/'.md5($modaddons->name).'.jpg'; + } + $moduleList[] = $item; + } + } + } + + //echo '
'.print_r($moduleList, 1).'
'; + echo round($current_memory / 1024 / 1024, 2).'Mo
'; + if ($errors) { echo '

'.Tools::displayError('The following module(s) couldn\'t be loaded').':

    '; diff --git a/controllers/admin/AdminModulesController.php b/controllers/admin/AdminModulesController.php index cfda5d92d..bfef5be68 100644 --- a/controllers/admin/AdminModulesController.php +++ b/controllers/admin/AdminModulesController.php @@ -58,8 +58,10 @@ class AdminModulesControllerCore extends AdminController private $iso_default_country; private $filter_configuration = array(); - - + private $addons_url = 'https://addons.prestashop.com/webservice/151/'; + private $logged_on_addons = false; + private $cache_file_default_country_modules_list = '/config/default_country_modules_list.xml'; + private $cache_file_customer_modules_list = '/config/default_customer_modules_list.xml'; /* ** Admin Modules Controller Constructor @@ -123,6 +125,10 @@ class AdminModulesControllerCore extends AdminController 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; } @@ -138,31 +144,61 @@ class AdminModulesControllerCore extends AdminController ** @return null */ + public function isFresh($file, $timeout = 604800000) + { + if (file_exists(_PS_ROOT_DIR_.$file)) + return ((time() - filemtime(_PS_ROOT_DIR_.$this->cache_file_modules_list)) < $timeout); + else + return false; + } + + public function refresh($file_to_refresh, $external_file) + { + return file_put_contents(_PS_ROOT_DIR_.$file_to_refresh, Tools::file_get_contents($external_file)); + } + + public function ajaxProcessRefreshModuleList() { // Refresh modules_list.xml every week - if (!$this->isFresh()) + if (!$this->isFresh($this->cache_file_modules_list, 604800)) { - if ($this->refresh()) + if ($this->refresh($this->cache_file_modules_list, $this->xml_modules_list)) $this->status = 'refresh'; else $this->status = 'error'; } else $this->status = 'cache'; - } - public function isFresh($timeout = 604800000) - { - if (file_exists(_PS_ROOT_DIR_ . $this->_moduleCacheFile)) - return ((time() - filemtime(_PS_ROOT_DIR_ . $this->_moduleCacheFile)) < $timeout); - else - return false; - } - public function refresh() - { - return file_put_contents(_PS_ROOT_DIR_.$this->_moduleCacheFile, Tools::file_get_contents($this->xml_modules_list)); + // If logged to Addons Webservices, refresh default country modules list every day + if ($this->logged_on_addons && $this->status != 'error') + { + if (!$this->isFresh($this->cache_file_default_country_modules_list, 86400)) + { + if ($this->refresh($this->cache_file_default_country_modules_list, $this->addons_url.'listing/'.strtolower(Configuration::get('PS_LOCALE_COUNTRY')))) + $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($this->cache_file_customer_modules_list, 86400)) + { + if ($this->refresh($this->cache_file_customer_modules_list, $this->addons_url.'listing/customer/'.pSQL(trim($this->context->cookie->username_addons)).'/'.pSQL(trim($this->context->cookie->password_addons)))) + $this->status = 'refresh'; + else + $this->status = 'error'; + } + else + $this->status = 'cache'; + } } public function displayAjaxRefreshModuleList() @@ -171,8 +207,16 @@ class AdminModulesControllerCore extends AdminController } - - + public function ajaxProcessLogOnAddonsWebservices() + { + $content = Tools::file_get_contents($this->addons_url.'listing/customer/'.pSQL(trim(Tools::getValue('username_addons'))).'/'.pSQL(trim(Tools::getValue('password_addons')))); + $xml = @simplexml_load_string($content, NULL, LIBXML_NOCDATA); + if (!$xml) + die('KO'); + $this->context->cookie->username_addons = pSQL(trim(Tools::getValue('username_addons'))); + $this->context->cookie->password_addons = pSQL(trim(Tools::getValue('password_addons'))); + die('OK'); + } /* @@ -558,6 +602,9 @@ class AdminModulesControllerCore extends AdminController public function postProcess() { + // Parent Post Process + parent::postProcess(); + // Execute filter or callback methods $filterMethods = array('filterModules', 'resetFilterModules', 'filterCategory', 'unfilterCategory'); $callbackMethods = array('reset', 'download', 'enable', 'delete'); @@ -787,6 +834,9 @@ class AdminModulesControllerCore extends AdminController $tpl_vars['list_modules_categories'] = $this->list_modules_categories; $tpl_vars['list_modules_authors'] = $this->modules_authors; + if ($this->logged_on_addons) + $tpl_vars['logged_on_addons'] = 1; + $smarty->assign($tpl_vars); }