diff --git a/classes/controller/Controller.php b/classes/controller/Controller.php index 8633b7417982b..bf34360444751 100644 --- a/classes/controller/Controller.php +++ b/classes/controller/Controller.php @@ -405,6 +405,10 @@ protected function smartyOutputContent($content) if ($this->controller_type == 'front' && !empty($html) && $this->getLayout()) { + $live_edit_content = ''; + if (!$this->useMobileTheme() && $this->checkLiveEditAccess()) + $live_edit_content = $this->getLiveEditFooter(); + $dom_available = extension_loaded('dom') ? true : false; if ($dom_available) $html = Media::deferInlineScripts($html); @@ -415,7 +419,7 @@ protected function smartyOutputContent($content) 'js_inline' => $dom_available ? Media::getInlineScript() : array() )); $javascript = $this->context->smarty->fetch(_PS_ALL_THEMES_DIR_.'javascript.tpl'); - echo $html.$javascript."\t\n"; + echo $html.$javascript.$live_edit_content."\t\n"; } else echo $html; diff --git a/classes/controller/FrontController.php b/classes/controller/FrontController.php index 19c5f16218480..7946c80a1eaec 100644 --- a/classes/controller/FrontController.php +++ b/classes/controller/FrontController.php @@ -540,25 +540,21 @@ public function display() 'display_header' => $this->display_header, 'display_footer' => $this->display_footer, )); - - $live_edit_content = ''; - // Don't use live edit if on mobile theme - if (!$this->useMobileTheme() && $this->checkLiveEditAccess()) - $live_edit_content = $this->getLiveEditFooter(); - + $layout = $this->getLayout(); if ($layout) { if ($this->template) - $this->context->smarty->assign('template', $this->context->smarty->fetch($this->template).$live_edit_content); + $template = $this->context->smarty->fetch($this->template); else // For retrocompatibility with 1.4 controller { ob_start(); $this->displayContent(); $template = ob_get_contents(); ob_clean(); - $this->context->smarty->assign('template', $template.$live_edit_content); + } + $template = $this->context->smarty->assign('template', $template); $this->smartyOutputContent($layout); } else diff --git a/controllers/admin/AdminModulesPositionsController.php b/controllers/admin/AdminModulesPositionsController.php index 5c08c7a4cdedf..aaeef53219950 100644 --- a/controllers/admin/AdminModulesPositionsController.php +++ b/controllers/admin/AdminModulesPositionsController.php @@ -232,6 +232,7 @@ public function initContent() if (array_key_exists('addToHook', $_GET) || array_key_exists('editGraft', $_GET) || (Tools::isSubmit('submitAddToHook') && $this->errors)) { $this->display = 'edit'; + $this->content .= $this->renderForm(); } else @@ -566,12 +567,12 @@ public function ajaxProcessSaveHook() $hookableList = array(); // $_POST['hook'] is an array of id_module $hooks_list = Tools::getValue('hook'); + foreach ($hooks_list as $id_hook => $modules) { + // 1st, drop all previous hooked modules - $sql = 'DELETE FROM `'._DB_PREFIX_.'hook_module` - WHERE `id_hook` = '.(int)$id_hook.' - AND id_shop = '.(int)$id_shop; + $sql = 'DELETE FROM `'._DB_PREFIX_.'hook_module` WHERE `id_hook` = '.(int)$id_hook.' AND id_shop = '.(int)$id_shop; $res &= Db::getInstance()->execute($sql); $i = 1; @@ -579,20 +580,24 @@ public function ajaxProcessSaveHook() $ids = array(); // then prepare sql query to rehook all chosen modules(id_module, id_shop, id_hook, position) // position is i (autoincremented) - foreach ($modules as $id_module) + if (is_array($modules) && count($modules)) { - if (!in_array($id_module, $ids)) + foreach ($modules as $id_module) { - $ids[] = (int)$id_module; - $value .= '('.(int)$id_module.', '.(int)$id_shop.', '.(int)$id_hook.', '.(int)$i.'),'; + if ($id_module && !in_array($id_module, $ids)) + { + $ids[] = (int)$id_module; + $value .= '('.(int)$id_module.', '.(int)$id_shop.', '.(int)$id_hook.', '.(int)$i.'),'; + } + $i++; } - $i++; - } - $value = rtrim($value, ','); - $res &= Db::getInstance()->execute('INSERT INTO `'._DB_PREFIX_.'hook_module` - (id_module, id_shop, id_hook, position) - VALUES '.$value); + if ($value) + { + $value = rtrim($value, ','); + $res &= Db::getInstance()->execute('INSERT INTO `'._DB_PREFIX_.'hook_module` (id_module, id_shop, id_hook, position) VALUES '.$value); + } + } } if ($res) $hasError = true; diff --git a/install-dev/upgrade/sql/1.6.0.7.sql b/install-dev/upgrade/sql/1.6.0.7.sql index 748facd6ac2a3..3c82023af3009 100644 --- a/install-dev/upgrade/sql/1.6.0.7.sql +++ b/install-dev/upgrade/sql/1.6.0.7.sql @@ -2,4 +2,10 @@ SET NAMES 'utf8'; ALTER TABLE `PREFIX_customer_message` CHANGE `ip_address` `ip_address` VARCHAR( 16 ) NULL DEFAULT NULL; -UPDATE `PREFIX_theme` SET product_per_page = '12' WHERE `product_per_page` = 0; \ No newline at end of file +UPDATE `PREFIX_theme` SET product_per_page = '12' WHERE `product_per_page` = 0; + +UPDATE `PREFIX_hook` SET live_edit = '1' WHERE `name` IN('displayTop','displayAttributeForm','displayAttributeGroupForm','displayBeforeCarrier', +'displayBeforePayment','displayCarrierList','displayCustomerAccount','displayCustomerAccountForm','displayCustomerAccountFormTop','displayFeatureForm', +'displayFeatureValueForm','displayFooter','displayLeftColumnProduct','displayMyAccountBlock','displayMyAccountBlockfooter','displayOrderConfirmation', +'displayOrderDetail','displayPaymentReturn','displayPaymentTop','displayProductButtons','displayProductComparison','displayProductListFunctionalButtons', +'displayProductTab','displayProductTabContent','displayRightColumnProduct','displayShoppingCart','displayShoppingCartFooter'); \ No newline at end of file diff --git a/js/hookLiveEdit.js b/js/hookLiveEdit.js index eaa0629be3acb..83b012a0d1461 100644 --- a/js/hookLiveEdit.js +++ b/js/hookLiveEdit.js @@ -36,8 +36,9 @@ $(document).ready(function() { getHookableList(); $('.unregisterHook').unbind('click').click(function() { - id = $(this).attr('id'); + ids = $(this).attr('id').split('_'); $(this).parent().parent().parent().fadeOut('slow', function() { + $(this).parent().data('id', + ids[0]); $(this).remove(); }); return false; @@ -208,18 +209,23 @@ function saveModulePosition() $("#fancy").attr('href', '#live_edit_feedback'); $("#fancy").trigger("click"); var str = ''; - for (var i = 0; i < hooks_list.length; i++) { + for (var i = 0; i < hooks_list.length; i++) + { str += '&' + hooks_list[i] + '='; - $('#' + hooks_list[i] + ' > .dndModule').each(function() { - ids = $(this).attr('id').split('_'); - $("#liveEdit-action-form") - .append(''); - }); + if ($('#' + hooks_list[i] + ' > .dndModule').length) + { + $('#' + hooks_list[i] + ' > .dndModule').each(function(){ + + ids = $(this).attr('id').split('_'); + $("#liveEdit-action-form").append(''); + }); + } + else if (typeof($('#' + hooks_list[i]).data('id')) !== 'undefined' && !$('input[name="hook[' + i + ']"]').length) + $("#liveEdit-action-form").append(''); } - $("#liveEdit-action-form") - .append(''); - datas = $("#liveEdit-action-form").serializeArray(); + $("#liveEdit-action-form").append(''); + datas = $("#liveEdit-action-form").serializeArray(); $.ajax({ type: 'POST', @@ -227,7 +233,7 @@ function saveModulePosition() async: true, dataType: 'json', data: datas, - success: function(jsonData) { + success: function(jsonData){ $('#live_edit_feedback_str').html('

' + saveOK + '

' + close + '
'); timer = setTimeout("hideFeedback()", 3000); has_been_moved = false;