';
- }
-}
diff --git a/admin-dev/themes/template/modules_positions/form.tpl b/admin-dev/themes/template/modules_positions/form.tpl
new file mode 100644
index 000000000..3d7d6fd54
--- /dev/null
+++ b/admin-dev/themes/template/modules_positions/form.tpl
@@ -0,0 +1,113 @@
+{*
+* 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$
+* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0)
+* International Registered Trademark & Property of PrestaShop SA
+*}
+
+
+
\ No newline at end of file
diff --git a/admin-dev/themes/template/modules_positions/list_modules.tpl b/admin-dev/themes/template/modules_positions/list_modules.tpl
new file mode 100644
index 000000000..25aee5993
--- /dev/null
+++ b/admin-dev/themes/template/modules_positions/list_modules.tpl
@@ -0,0 +1,115 @@
+{*
+* 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$
+* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0)
+* International Registered Trademark & Property of PrestaShop SA
+*}
+
+
+
+{l s='Transplant a module'}
+
+
+
+
+
+
\ No newline at end of file
diff --git a/classes/AdminController.php b/classes/AdminController.php
index 016a94214..9e00615be 100644
--- a/classes/AdminController.php
+++ b/classes/AdminController.php
@@ -367,8 +367,8 @@ class AdminControllerCore extends Controller
$token = Tools::getValue('token') ? Tools::getValue('token') : $this->token;
// Sub included tab postProcessing
- $this->includeSubTab('postProcess', array('status', 'submitAdd1', 'submitDel', 'delete', 'submitFilter', 'submitReset'));
-
+ $this->includeSubTab('postProcess', array('status', 'submitAdd1', 'submitDel', 'delete', 'submitFilter', 'submitReset'));
+
if (!empty($this->action) && method_exists($this, 'process'.ucfirst(Tools::toCamelCase($this->action))))
$this->{'process'.Tools::toCamelCase($this->action)}($token);
else if (method_exists($this, $this->action))
@@ -856,7 +856,7 @@ class AdminControllerCore extends Controller
'href' => '#',
'desc' => $this->l('Save')
);
-
+ //no break
case 'view':
// Default cancel button - like old back link
if (!isset($this->no_back) || $this->no_back == false)
@@ -870,9 +870,9 @@ class AdminControllerCore extends Controller
'desc' => $this->l('Cancel')
);
}
- break;
+ break;
case 'options':
- break;
+ break;
default: // list
$this->toolbar_btn['new'] = array(
'href' => self::$currentIndex.'&add'.$this->table.'&token='.$this->token,
diff --git a/controllers/admin/AdminModulesPositionsController.php b/controllers/admin/AdminModulesPositionsController.php
new file mode 100644
index 000000000..f975cdb18
--- /dev/null
+++ b/controllers/admin/AdminModulesPositionsController.php
@@ -0,0 +1,374 @@
+
+* @copyright 2007-2011 PrestaShop SA
+* @version Release: $Revision: 7466 $
+* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0)
+* International Registered Trademark & Property of PrestaShop SA
+*/
+
+class AdminModulesPositionsControllerCore extends AdminController
+{
+ private $displayKey = 0;
+
+ public function postProcess()
+ {
+ // Getting key value for display
+ if (Tools::getValue('show_modules') AND strval(Tools::getValue('show_modules')) != 'all')
+ $this->displayKey = (int)(Tools::getValue('show_modules'));
+
+ // Change position in hook
+ if (array_key_exists('changePosition', $_GET))
+ {
+ if ($this->tabAccess['edit'] === '1')
+ {
+ $id_module = (int)(Tools::getValue('id_module'));
+ $id_hook = (int)(Tools::getValue('id_hook'));
+ $module = Module::getInstanceById($id_module);
+ if (Validate::isLoadedObject($module))
+ {
+ $module->updatePosition($id_hook, (int)(Tools::getValue('direction')));
+ Tools::redirectAdmin(self::$currentIndex.($this->displayKey ? '&show_modules='.$this->displayKey : '').'&token='.$this->token);
+ }
+ else
+ $this->_errors[] = Tools::displayError('module cannot be loaded');
+ }
+ else
+ $this->_errors[] = Tools::displayError('You do not have permission to edit here.');
+ }
+
+ // Add new module in hook
+ elseif (Tools::isSubmit('submitAddToHook'))
+ {
+ if ($this->tabAccess['add'] === '1')
+ {
+ // Getting vars...
+ $id_module = (int)(Tools::getValue('id_module'));
+ $module = Module::getInstanceById($id_module);
+ $id_hook = (int)(Tools::getValue('id_hook'));
+ $hook = new Hook($id_hook);
+
+ if (!$id_module OR !Validate::isLoadedObject($module))
+ $this->_errors[] = Tools::displayError('module cannot be loaded');
+ elseif (!$id_hook OR !Validate::isLoadedObject($hook))
+ $this->_errors[] = Tools::displayError('Hook cannot be loaded.');
+ elseif (Hook::getModulesFromHook($id_hook, $id_module))
+ $this->_errors[] = Tools::displayError('This module is already transplanted to this hook.');
+ elseif (!$module->isHookableOn($hook->name))
+ $this->_errors[] = Tools::displayError('This module can\'t be transplanted to this hook.');
+ // Adding vars...
+ else
+ {
+ if (!$module->registerHook($hook->name, Context::getContext()->shop->getListOfID()))
+ $this->_errors[] = Tools::displayError('An error occurred while transplanting module to hook.');
+ else
+ {
+ $exceptions = Tools::getValue('exceptions');
+ $exceptions = (isset($exceptions[0])) ? $exceptions[0] : array();
+ $exceptions = explode(',', str_replace(' ', '', $exceptions));
+
+ foreach ($exceptions AS $except)
+ if (!Validate::isFileName($except))
+ $this->_errors[] = Tools::displayError('No valid value for field exceptions');
+
+ if (!$this->_errors && !$module->registerExceptions($id_hook, $exceptions, Context::getContext()->shop->getListOfID()))
+ $this->_errors[] = Tools::displayError('An error occurred while transplanting module to hook.');
+ }
+
+ if (!$this->_errors)
+ Tools::redirectAdmin(self::$currentIndex.'&conf=16'.($this->displayKey ? '&show_modules='.$this->displayKey : '').'&token='.$this->token);
+ }
+ }
+ else
+ $this->_errors[] = Tools::displayError('You do not have permission to add here.');
+ }
+
+ // Edit module from hook
+ elseif (Tools::isSubmit('submitEditGraft'))
+ {
+ if ($this->tabAccess['add'] === '1')
+ {
+ // Getting vars...
+ $id_module = (int)(Tools::getValue('id_module'));
+ $module = Module::getInstanceById($id_module);
+ $id_hook = (int)(Tools::getValue('id_hook'));
+ $hook = new Hook($id_hook);
+
+ if (!$id_module OR !Validate::isLoadedObject($module))
+ $this->_errors[] = Tools::displayError('module cannot be loaded');
+ elseif (!$id_hook OR !Validate::isLoadedObject($hook))
+ $this->_errors[] = Tools::displayError('Hook cannot be loaded.');
+ else
+ {
+ $exceptions = Tools::getValue('exceptions');
+ if (is_array($exceptions))
+ {
+ foreach ($exceptions as $id => $exception)
+ {
+ $exception = explode(',', str_replace(' ', '', $exception));
+
+ // Check files name
+ foreach ($exception AS $except)
+ if (!Validate::isFileName($except))
+ $this->_errors[] = Tools::displayError('No valid value for field exceptions');
+
+ $exceptions[$id] = $exception;
+ }
+
+ // Add files exceptions
+ if (!$module->editExceptions($id_hook, $exceptions))
+ $this->_errors[] = Tools::displayError('An error occurred while transplanting module to hook.');
+
+ if (!$this->_errors)
+ Tools::redirectAdmin(self::$currentIndex.'&conf=16'.($this->displayKey ? '&show_modules='.$this->displayKey : '').'&token='.$this->token);
+ }
+ else
+ {
+ $exceptions = explode(',', str_replace(' ', '', $exceptions));
+
+ // Check files name
+ foreach ($exceptions AS $except)
+ if (!Validate::isFileName($except))
+ $this->_errors[] = Tools::displayError('No valid value for field exceptions');
+
+ // Add files exceptions
+ if (!$module->editExceptions($id_hook, $exceptions, Context::getContext()->shop->getListOfID()))
+ $this->_errors[] = Tools::displayError('An error occurred while transplanting module to hook.');
+ else
+ Tools::redirectAdmin(self::$currentIndex.'&conf=16'.($this->displayKey ? '&show_modules='.$this->displayKey : '').'&token='.$this->token);
+ }
+ }
+ }
+ else
+ $this->_errors[] = Tools::displayError('You do not have permission to add here.');
+ }
+
+ // Delete module from hook
+ elseif (array_key_exists('deleteGraft', $_GET))
+ {
+ if ($this->tabAccess['delete'] === '1')
+ {
+ $id_module = (int)(Tools::getValue('id_module'));
+ $module = Module::getInstanceById($id_module);
+ $id_hook = (int)(Tools::getValue('id_hook'));
+ $hook = new Hook($id_hook);
+ if (!Validate::isLoadedObject($module))
+ $this->_errors[] = Tools::displayError('module cannot be loaded');
+ elseif (!$id_hook OR !Validate::isLoadedObject($hook))
+ $this->_errors[] = Tools::displayError('Hook cannot be loaded.');
+ else
+ {
+ if (!$module->unregisterHook($id_hook, Context::getContext()->shop->getListOfID()) OR !$module->unregisterExceptions($id_hook, Context::getContext()->shop->getListOfID()))
+ $this->_errors[] = Tools::displayError('An error occurred while deleting module from hook.');
+ else
+ Tools::redirectAdmin(self::$currentIndex.'&conf=17'.($this->displayKey ? '&show_modules='.$this->displayKey : '').'&token='.$this->token);
+ }
+ }
+ else
+ $this->_errors[] = Tools::displayError('You do not have permission to delete here.');
+ }
+ elseif (Tools::isSubmit('unhookform'))
+ {
+ if (!($unhooks = Tools::getValue('unhooks')) OR !is_array($unhooks))
+ $this->_errors[] = Tools::displayError('Select a module to unhook.');
+ else
+ {
+ foreach ($unhooks as $unhook)
+ {
+ $explode = explode('_', $unhook);
+ $id_hook = $explode[0];
+ $id_module = $explode[1];
+ $module = Module::getInstanceById((int)($id_module));
+ $hook = new Hook((int)($id_hook));
+ if (!Validate::isLoadedObject($module))
+ $this->_errors[] = Tools::displayError('module cannot be loaded');
+ elseif (!$id_hook OR !Validate::isLoadedObject($hook))
+ $this->_errors[] = Tools::displayError('Hook cannot be loaded.');
+ else
+ {
+ if (!$module->unregisterHook((int)($id_hook)) OR !$module->unregisterExceptions((int)($id_hook)))
+ $this->_errors[] = Tools::displayError('An error occurred while deleting module from hook.');
+ }
+ }
+ if (!sizeof($this->_errors))
+ Tools::redirectAdmin(self::$currentIndex.'&conf=17'.($this->displayKey ? '&show_modules='.$this->displayKey : '').'&token='.$this->token);
+ }
+ }
+ }
+
+ public function initContent()
+ {
+ if (array_key_exists('addToHook', $_GET) OR array_key_exists('editGraft', $_GET) OR (Tools::isSubmit('submitAddToHook') AND $this->_errors))
+ {
+ $this->display = 'edit';
+ $this->content .= $this->initForm();
+ }
+ else
+ $this->content .= $this->initMain();
+
+ $this->context->smarty->assign(array('content' => $this->content));
+ }
+
+ public function initMain()
+ {
+ $admin_dir = basename(_PS_ADMIN_DIR_);
+ $modules = Module::getModulesInstalled();
+
+ $assoc_modules_id = array();
+ foreach ($modules as $module)
+ if ($tmpInstance = Module::getInstanceById((int)$module['id_module']))
+ {
+ // We want to be able to sort modules by display name
+ $module_instances[$tmpInstance->displayName] = $tmpInstance;
+ // But we also want to associate hooks to modules using the modules IDs
+ $assoc_modules_id[(int)$module['id_module']] = $tmpInstance->displayName;
+ }
+ ksort($module_instances);
+ $hooks = Hook::getHooks(!(int)(Tools::getValue('hook_position')));
+ foreach ($hooks as $key => $hook)
+ {
+ // Get all modules for this hook or only the filtered module
+ $hooks[$key]['modules'] = Hook::getModulesFromHook($hook['id_hook'], $this->displayKey);
+ $hooks[$key]['module_count'] = count($hooks[$key]['modules']);
+ // If modules were found, link to the previously created Module instances
+ if (is_array($hooks[$key]['modules']) && !empty($hooks[$key]['modules']))
+ foreach($hooks[$key]['modules'] as $module_key => $module)
+ $hooks[$key]['modules'][$module_key]['instance'] = $module_instances[$assoc_modules_id[$module['id_module']]];
+ }
+
+ $this->addJqueryPlugin("tablednd");
+
+ $this->context->smarty->assign(array(
+ 'url_transplant' => self::$currentIndex.'&addToHook'.($this->displayKey ? '&show_modules='.$this->displayKey : '').'&token='.$this->token,
+ 'token' => $this->token,
+ 'url_show_modules' => self::$currentIndex.'&token='.$this->token.'&show_modules=',
+ 'modules' => $module_instances,
+ 'url_show_invisible' => self::$currentIndex.'&token='.$this->token.'&show_modules='.(int)(Tools::getValue('show_modules')).'&hook_position=',
+ 'hook_position' => Tools::getValue('hook_position'),
+ 'live_edit' => Shop::isFeatureActive() && $this->context->shop->getContextType() != Shop::CONTEXT_SHOP,
+ 'url_live_edit' => $this->context->link->getPageLink('index', false, null, 'live_edit&ad='.$admin_dir.'&liveToken='.sha1($admin_dir._COOKIE_KEY_).((Shop::isFeatureActive()) ? '&id_shop='.Context::getContext()->shop->getID() : '')),
+ 'display_key' => $this->displayKey,
+ 'hooks' => $hooks,
+ 'url_submit' => self::$currentIndex.'&token='.$this->token,
+ 'can_move' => (Shop::isFeatureActive() && $this->context->shop->getContextType() != Shop::CONTEXT_SHOP) ? false : true,
+ ));
+
+ return $this->context->smarty->fetch('modules_positions/list_modules.tpl');
+ }
+
+ public function initForm()
+ {
+ // toolbar (save, cancel, new, ..)
+ $this->initToolbar();
+ $id_module = (int)(Tools::getValue('id_module'));
+ $id_hook = (int)(Tools::getValue('id_hook'));
+ if (Tools::isSubmit('editGraft'))
+ {
+ // Check auth for this page
+ if (!$id_module || !$id_hook)
+ Tools::redirectAdmin(self::$currentIndex . '&token='.$this->token);
+
+ $sql = 'SELECT id_module
+ FROM '._DB_PREFIX_.'hook_module
+ WHERE id_module = '.$id_module.'
+ AND id_hook = '.$id_hook.'
+ AND id_shop IN('.implode(', ', Context::getContext()->shop->getListOfID()).')';
+ if (!Db::getInstance()->getValue($sql))
+ Tools::redirectAdmin(self::$currentIndex . '&token='.$this->token);
+
+ $slModule = Module::getInstanceById($id_module);
+ $exceptsList = $slModule->getExceptions($id_hook, true);
+ $exceptsDiff = false;
+ $excepts = '';
+ if ($exceptsList)
+ {
+ $first = current($exceptsList);
+ foreach ($exceptsList as $k => $v)
+ if (array_diff($v, $first) || array_diff($first, $v))
+ $exceptsDiff = true;
+
+ if (!$exceptsDiff)
+ $excepts = implode(', ', $first);
+ }
+ }
+ else
+ {
+ $exceptsDiff = false;
+ $exceptsList = Tools::getValue('exceptions', array(array()));
+ }
+ $modules = Module::getModulesInstalled(0);
+
+ $instances = array();
+ foreach ($modules AS $module)
+ if ($tmpInstance = Module::getInstanceById($module['id_module']))
+ $instances[$tmpInstance->displayName] = $tmpInstance;
+ ksort($instances);
+ $modules = $instances;
+ $hooks = Hook::getHooks(0);
+
+ $exception_list_diff = array();
+ foreach ($exceptsList as $shopID => $fileList)
+ $exception_list_diff[] = $this->displayModuleExceptionList($fileList, $shopID);
+
+ $tpl = $this->context->smarty->createTemplate('modules_positions/form.tpl');
+ $tpl->assign(array(
+ 'url_submit' => self::$currentIndex.'&token='.$this->token,
+ 'edit_graft' => Tools::isSubmit('editGraft'),
+ 'id_module' => (int)Tools::getValue('id_module'),
+ 'id_hook' => (int)Tools::getValue('id_hook'),
+ 'show_modules' => Tools::getValue('show_modules'),
+ 'hooks' => $hooks,
+ 'exception_list' => $this->displayModuleExceptionList(array_shift($exceptsList), 0),
+ 'exception_list_diff' => $exception_list_diff,
+ 'except_diff' => isset($exceptsDiff) ? $exceptsDiff : null,
+ 'display_key' => $this->displayKey,
+ 'modules' => $modules,
+ 'show_toolbar' => true,
+ 'toolbar_btn' => $this->toolbar_btn,
+ 'table' => 'hook_module',
+ ));
+
+ return $tpl->fetch();
+ }
+
+ public function displayModuleExceptionList($fileList, $shopID)
+ {
+ if (!is_array($fileList))
+ $fileList = ($fileList) ? array($fileList) : array();
+
+ $content = '';
+ if ($shopID)
+ $content .= ' ('.Shop::getInstance($shopID)->name.')';
+ $content .= '
+