From 58ff94f2174a75de725c02891edbf5e4bbf7c471 Mon Sep 17 00:00:00 2001 From: "vishalsingh.qlo325" Date: Wed, 9 Jul 2025 13:27:37 +0530 Subject: [PATCH 01/41] Removed admin search configuration controller --- controllers/admin/AdminSearchConfController.php | 1 + install/data/xml/tab.xml | 4 ++-- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/controllers/admin/AdminSearchConfController.php b/controllers/admin/AdminSearchConfController.php index e07881d2c..00d2daab7 100644 --- a/controllers/admin/AdminSearchConfController.php +++ b/controllers/admin/AdminSearchConfController.php @@ -33,6 +33,7 @@ class AdminSearchConfControllerCore extends AdminController public function __construct() { + Tools::redirectAdmin(Context::getContext()->link->getAdminLink('AdminDashboard')); $this->bootstrap = true; $this->table = 'alias'; $this->className = 'Alias'; diff --git a/install/data/xml/tab.xml b/install/data/xml/tab.xml index ac0890d86..09eed80f3 100644 --- a/install/data/xml/tab.xml +++ b/install/data/xml/tab.xml @@ -228,9 +228,9 @@ - + AdminMaintenance From 5566bd498786c9b8688decce69142956e1b38822 Mon Sep 17 00:00:00 2001 From: "vishalsingh.qlo325" Date: Fri, 8 Aug 2025 13:11:57 +0530 Subject: [PATCH 02/41] Fixed: Filter related issue in the front office caused due to floating values --- modules/hotelreservationsystem/classes/HotelBookingDetail.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/hotelreservationsystem/classes/HotelBookingDetail.php b/modules/hotelreservationsystem/classes/HotelBookingDetail.php index ce5ce56b2..fbf4ba1c6 100644 --- a/modules/hotelreservationsystem/classes/HotelBookingDetail.php +++ b/modules/hotelreservationsystem/classes/HotelBookingDetail.php @@ -1718,7 +1718,7 @@ class HotelBookingDetail extends ObjectModel } } $productFeaturePrice = HotelRoomTypeFeaturePricing::getRoomTypeFeaturePricesPerDay($value['id_product'], $date_from, $date_to, self::useTax(), 0, 0, 0, 0, 1, 1, $bookingParams['occupancy']); - if (!empty($price) && ($price['from'] > $productFeaturePrice || $price['to'] < $productFeaturePrice)) { + if (!empty($price) && ((float) $price['from'] > $productFeaturePrice || (float) $price['to'] < $productFeaturePrice)) { unset($bookingData['rm_data'][$key]); continue; } From 0f586536148b0854b86d9abb2d177cc6b7338ae4 Mon Sep 17 00:00:00 2001 From: "vishalsingh.qlo325" Date: Tue, 18 Nov 2025 10:27:08 +0530 Subject: [PATCH 03/41] Fixed: Undefined variable in module.php --- classes/module/Module.php | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/classes/module/Module.php b/classes/module/Module.php index 937e9ecf6..1a1b4c200 100644 --- a/classes/module/Module.php +++ b/classes/module/Module.php @@ -3044,7 +3044,7 @@ abstract class ModuleCore ); $reflectionClassModule = new ReflectionClass($overrideClassName.'Override'.$uniq); - $moduleClassFileArray = $this->getCommentedClass($moduleClassFileArray, $reflectionClassModule, $reflectionClassOverride, $overrideClassFileArray); + $moduleClassFileArray = $this->getCommentedClass($moduleClassFileArray, $reflectionClassModule, $reflectionClassOverride, $overrideClassFileArray, $overrideClassName); // Insert the methods from module override in override $generatedCodeToCopy = array_slice($moduleClassFileArray, $reflectionClassModule->getStartLine() + 1, $reflectionClassModule->getEndLine() - $reflectionClassModule->getStartLine() - 2); @@ -3091,7 +3091,7 @@ abstract class ModuleCore ); $reflectionClassModule = new ReflectionClass($overrideClassName.'Override'.$uniq); - $moduleClassFileArray = $this->getCommentedClass($moduleClassFileArray, $reflectionClassModule); + $moduleClassFileArray = $this->getCommentedClass($moduleClassFileArray, $reflectionClassModule, null, null, $overrideClassName); file_put_contents($overrideClassFilePath, preg_replace($patternEscapeCommon, '', $moduleClassFileArray)); @@ -3102,7 +3102,7 @@ abstract class ModuleCore return true; } - private function getCommentedClass($moduleClassFileArray, $reflectionClassModule, $reflectionClassOverride = null, $overrideClassFileArray = null) + private function getCommentedClass($moduleClassFileArray, $reflectionClassModule, $reflectionClassOverride = null, $overrideClassFileArray = null, $className = '') { // Check if none of the methods already exists in the override class foreach ($reflectionClassModule->getMethods() as $method) { @@ -3110,15 +3110,15 @@ abstract class ModuleCore if ($reflectionClassOverride->hasMethod($method->getName())) { $overrideMethodInfo = $reflectionClassOverride->getMethod($method->getName()); if (preg_match('/module: (.*)/ism', $overrideClassFileArray[$overrideMethodInfo->getStartLine() - 5], $name) && preg_match('/date: (.*)/ism', $overrideClassFileArray[$overrideMethodInfo->getStartLine() - 4], $date) && preg_match('/version: ([0-9.]+)/ism', $overrideClassFileArray[$overrideMethodInfo->getStartLine() - 3], $version)) { - throw new Exception(sprintf(Tools::displayError('The method %1$s in the class %2$s is already overridden by the module %3$s version %4$s at %5$s.'), $method->getName(), $classname, $name[1], $version[1], $date[1])); + throw new Exception(sprintf(Tools::displayError('The method %1$s in the class %2$s is already overridden by the module %3$s version %4$s at %5$s.'), $method->getName(), $className, $name[1], $version[1], $date[1])); } - throw new Exception(sprintf(Tools::displayError('The method %1$s in the class %2$s is already overridden.'), $method->getName(), $classname)); + throw new Exception(sprintf(Tools::displayError('The method %1$s in the class %2$s is already overridden.'), $method->getName(), $className)); } } $moduleClassFileArray = preg_replace('/((:?public|private|protected)\s+(static\s+)?function\s+(?:\b'.$method->getName().'\b))/ism', "/*\n * module: ".$this->name."\n * date: ".date('Y-m-d H:i:s')."\n * version: ".$this->version."\n */\n $1", $moduleClassFileArray); if ($moduleClassFileArray === null) { - throw new Exception(sprintf(Tools::displayError('Failed to override method %1$s in class %2$s.'), $method->getName(), $classname)); + throw new Exception(sprintf(Tools::displayError('Failed to override method %1$s in class %2$s.'), $method->getName(), $className)); } } @@ -3126,13 +3126,13 @@ abstract class ModuleCore foreach ($reflectionClassModule->getProperties() as $property) { if ($reflectionClassOverride) { if ($reflectionClassOverride->hasProperty($property->getName())) { - throw new Exception(sprintf(Tools::displayError('The property %1$s in the class %2$s is already defined.'), $property->getName(), $classname)); + throw new Exception(sprintf(Tools::displayError('The property %1$s in the class %2$s is already defined.'), $property->getName(), $className)); } } $moduleClassFileArray = preg_replace('/((?:public|private|protected)\s)\s*(static\s)?\s*(\$\b'.$property->getName().'\b)/ism', "/*\n * module: ".$this->name."\n * date: ".date('Y-m-d H:i:s')."\n * version: ".$this->version."\n */\n $1$2$3", $moduleClassFileArray); if ($moduleClassFileArray === null) { - throw new Exception(sprintf(Tools::displayError('Failed to override property %1$s in class %2$s.'), $property->getName(), $classname)); + throw new Exception(sprintf(Tools::displayError('Failed to override property %1$s in class %2$s.'), $property->getName(), $className)); } } @@ -3140,13 +3140,13 @@ abstract class ModuleCore foreach ($reflectionClassModule->getConstants() as $constant => $value) { if ($reflectionClassOverride) { if ($reflectionClassOverride->hasConstant($constant)) { - throw new Exception(sprintf(Tools::displayError('The constant %1$s in the class %2$s is already defined.'), $constant, $classname)); + throw new Exception(sprintf(Tools::displayError('The constant %1$s in the class %2$s is already defined.'), $constant, $className)); } } $moduleClassFileArray = preg_replace('/(const\s)\s*(\b'.$constant.'\b)/ism', "/*\n * module: ".$this->name."\n * date: ".date('Y-m-d H:i:s')."\n * version: ".$this->version."\n */\n $1$2", $moduleClassFileArray); if ($moduleClassFileArray === null) { - throw new Exception(sprintf(Tools::displayError('Failed to override constant %1$s in class %2$s.'), $constant, $classname)); + throw new Exception(sprintf(Tools::displayError('Failed to override constant %1$s in class %2$s.'), $constant, $className)); } } From c5f7cd73bcb3d4de288a0d2a6aaaf7068c4105f5 Mon Sep 17 00:00:00 2001 From: "vishalsingh.qlo325" Date: Tue, 18 Nov 2025 12:10:11 +0530 Subject: [PATCH 04/41] Fixed: Getting error in growl while deleting the hotel image or while changing the cover image --- .../admin/AdminAddHotelController.php | 13 +++++----- .../views/js/HotelReservationAdmin.js | 26 ------------------- .../views/js/hotelImage.js | 6 +++-- 3 files changed, 10 insertions(+), 35 deletions(-) diff --git a/modules/hotelreservationsystem/controllers/admin/AdminAddHotelController.php b/modules/hotelreservationsystem/controllers/admin/AdminAddHotelController.php index 57dcea009..a2b513676 100644 --- a/modules/hotelreservationsystem/controllers/admin/AdminAddHotelController.php +++ b/modules/hotelreservationsystem/controllers/admin/AdminAddHotelController.php @@ -907,6 +907,7 @@ class AdminAddHotelController extends ModuleAdminController public function ajaxProcessChangeCoverImage() { $idImage = Tools::getValue('id_image'); + $response = array('status' => false); if ($idImage) { $idHotel = Tools::getValue('id_hotel'); if ($coverImg = HotelImage::getCover($idHotel)) { @@ -918,17 +919,15 @@ class AdminAddHotelController extends ModuleAdminController $objHtlImage = new HotelImage((int) $idImage); $objHtlImage->cover = 1; if ($objHtlImage->update()) { - die(true); - } else { - die(false); + $response['status'] = true; } - } else { - die(false); } + $this->ajaxDie(json_encode($response)); } public function ajaxProcessDeleteHotelImage() { + $response = array('status' => false); if ($idImage = Tools::getValue('id_image')) { if ($idHotel = Tools::getValue('id_hotel')) { if (Validate::isLoadedObject($objHtlImage = new HotelImage((int) $idImage))) { @@ -941,12 +940,12 @@ class AdminAddHotelController extends ModuleAdminController $objHtlImage->save(); } } - die(true); + $response['status'] = true; } } } } - die(false); + $this->ajaxDie(json_encode($response)); } public function ajaxProcessUpdateSlidesPosition() diff --git a/modules/hotelreservationsystem/views/js/HotelReservationAdmin.js b/modules/hotelreservationsystem/views/js/HotelReservationAdmin.js index 33fdb3ab6..b3232b15f 100644 --- a/modules/hotelreservationsystem/views/js/HotelReservationAdmin.js +++ b/modules/hotelreservationsystem/views/js/HotelReservationAdmin.js @@ -293,32 +293,6 @@ $(document).ready(function() { } }); - // delete hotel image - $('.deleteHtlImage').on('click', function(){ - var imgId = $(this).attr('id_htl_img'); - var $this = $(this); - $.ajax({ - url: statebycountryurl, - data: { - id_htl_img: imgId, - ajax: true, - action: 'deleteHotelImage', - }, - method: 'POST', - success: function(data) { - if (data == 1) { - $this.closest('.img-container-div').remove(); - showSuccessMessage(htlImgDeleteSuccessMsg); - } else { - showErrorMessage(htlImgDeleteErrMsg); - } - }, - error: function(XMLHttpRequest, textStatus, errorThrown) { - alert(textStatus); - } - }); - }); - $('#hotel_country').on('change', function() { $('#hotel_state').empty(); $.ajax({ diff --git a/modules/hotelreservationsystem/views/js/hotelImage.js b/modules/hotelreservationsystem/views/js/hotelImage.js index ad3152c06..c1fd5f666 100644 --- a/modules/hotelreservationsystem/views/js/hotelImage.js +++ b/modules/hotelreservationsystem/views/js/hotelImage.js @@ -109,6 +109,7 @@ $(document).ready(function () { $.ajax({ type:'POST', url: adminHotelCtrlUrl, + dataType: 'json', data: { ajax: true, action: 'changeCoverImage', @@ -116,7 +117,7 @@ $(document).ready(function () { id_image: idImage, }, success: function(result) { - if (result) { + if (result.status) { // remover cover image identifier from old cover image var oldCoverImageTr = $("#hotel-image-table tbody tr.cover-image-tr"); oldCoverImageTr.removeClass("cover-image-tr").find("td.cover-image-td").removeClass("cover-image-td").find("a.changer-cover-image").removeClass("text-success").addClass("text-danger").attr("data-is-cover", "0").find("i.icon-check").removeClass("icon-check").addClass("icon-times"); @@ -149,6 +150,7 @@ $(document).ready(function () { $.ajax({ type:'POST', url: adminHotelCtrlUrl, + dataType: 'json', data: { ajax: true, action: 'deleteHotelImage', @@ -156,7 +158,7 @@ $(document).ready(function () { id_image: idImage, }, success: function(result) { - if (result) { + if (result.status) { if (parseInt(isCover)) { location.reload(); } else { From 06cd40ead9ffad8e8da01301ed34aec2e522aa2f Mon Sep 17 00:00:00 2001 From: "vishalsingh.qlo325" Date: Tue, 18 Nov 2025 12:39:03 +0530 Subject: [PATCH 05/41] Fixed: Unable to update the position of the services in the back office --- controllers/admin/AdminNormalProductsController.php | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/controllers/admin/AdminNormalProductsController.php b/controllers/admin/AdminNormalProductsController.php index 28d360e21..43838ccc8 100644 --- a/controllers/admin/AdminNormalProductsController.php +++ b/controllers/admin/AdminNormalProductsController.php @@ -2605,6 +2605,7 @@ class AdminNormalProductsControllerCore extends AdminController ->setSelectedCategories(array((int)$id_category)); $this->tpl_list_vars['category_tree'] = $tree->render(); + $this->context->smarty->assign('token', $this->token);// as tree updates the token from the smarty context // used to build the new url when changing category $this->tpl_list_vars['base_url'] = preg_replace('#&id_category=[0-9]*#', '', self::$currentIndex).'&token='.$this->token; } @@ -4513,7 +4514,7 @@ class AdminNormalProductsControllerCore extends AdminController if ($this->tabAccess['edit'] === 1) { $way = (int)(Tools::getValue('way')); $id_product = (int)Tools::getValue('id_product'); - $id_category = (int)Tools::getValue('id_category'); + $id_category = (int)Tools::getValue('id_category_hotel'); $positions = Tools::getValue('product'); $page = (int)Tools::getValue('page'); $selected_pagination = (int)Tools::getValue('selected_pagination'); @@ -4521,14 +4522,13 @@ class AdminNormalProductsControllerCore extends AdminController if (is_array($positions)) { foreach ($positions as $position => $value) { $pos = explode('_', $value); - if ((isset($pos[1]) && isset($pos[2])) && ($pos[1] == $id_category && (int)$pos[2] === $id_product)) { if ($page > 1) { $position = $position + (($page - 1) * $selected_pagination); } if ($product = new Product((int)$pos[2])) { - if (isset($position) && $product->updatePosition($way, $position)) { + if (isset($position) && $product->updatePosition($way, $position, $id_category)) { $category = new Category((int)$id_category); if (Validate::isLoadedObject($category)) { hook::Exec('categoryUpdate', array('category' => $category)); From 42eab164b682f3e3286d1a1ad5a508e2f7b031bc Mon Sep 17 00:00:00 2001 From: "vishalsingh.qlo325" Date: Tue, 18 Nov 2025 13:01:31 +0530 Subject: [PATCH 06/41] Fixed: added our property page in theme meta --- install/data/xml/theme_meta.xml | 1 + .../blocknavigationmenu/classes/WkCustomNavigationLink.php | 4 ++-- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/install/data/xml/theme_meta.xml b/install/data/xml/theme_meta.xml index 041a7e1c7..ce42c1a27 100644 --- a/install/data/xml/theme_meta.xml +++ b/install/data/xml/theme_meta.xml @@ -42,5 +42,6 @@ + diff --git a/modules/blocknavigationmenu/classes/WkCustomNavigationLink.php b/modules/blocknavigationmenu/classes/WkCustomNavigationLink.php index f8cfd422c..e4e86b593 100644 --- a/modules/blocknavigationmenu/classes/WkCustomNavigationLink.php +++ b/modules/blocknavigationmenu/classes/WkCustomNavigationLink.php @@ -197,8 +197,8 @@ class WkCustomNavigationLink extends ObjectModel 'id_cms' => 0, 'show_at_navigation' => 1, 'show_at_footer' => 0, - 'is_custom_link' => 1, - 'link' => $objLink->getPageLink('our-properties'), + 'is_custom_link' => 0, + 'link' => 'our-properties', ), ); From 4ee72acfc5059fb439f3ed0b53438b9332388c5d Mon Sep 17 00:00:00 2001 From: "vishalsingh.qlo325" Date: Tue, 18 Nov 2025 15:20:05 +0530 Subject: [PATCH 07/41] Fixed: Getting fatal error while trying to override a class having any parent::function() call. --- classes/module/Module.php | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/classes/module/Module.php b/classes/module/Module.php index 937e9ecf6..ba3c347f8 100644 --- a/classes/module/Module.php +++ b/classes/module/Module.php @@ -3019,7 +3019,7 @@ abstract class ModuleCore ), array( ' ', - 'class '.$overrideClassName.'OverrideOriginal'.$uniq + 'class '.$overrideClassName.'OverrideOriginal'.$uniq.' extends \stdClass' ), implode('', $overrideClassFileArray) ) @@ -3037,7 +3037,7 @@ abstract class ModuleCore ), array( ' ', - 'class '.$overrideClassName.'Override'.$uniq + 'class '.$overrideClassName.'Override'.$uniq.' extends \stdClass' ), implode('', $moduleClassFileArray) ) @@ -3084,7 +3084,7 @@ abstract class ModuleCore ), array( ' ', - 'class '.$overrideClassName.'Override'.$uniq + 'class '.$overrideClassName.'Override'.$uniq.' extends \stdClass' ), implode('', $moduleClassFileArray) ) @@ -3213,7 +3213,7 @@ abstract class ModuleCore ), array( ' ', - 'class '.$overrideClassName.'Original_remove'.$uniq + 'class '.$overrideClassName.'Original_remove'.$uniq.' extends \stdClass' ), implode('', $overrideClassFileArray) ) @@ -3230,7 +3230,7 @@ abstract class ModuleCore ), array( ' ', - 'class '.$overrideClassName.'Override_remove'.$uniq + 'class '.$overrideClassName.'Override_remove'.$uniq.' extends \stdClass' ), implode('', $moduleClassFileArray) ) From 3df30a2ecc9ff059993af43d9c6b1bb16370b5b4 Mon Sep 17 00:00:00 2001 From: Amit sharma Date: Fri, 21 Nov 2025 16:03:05 +0530 Subject: [PATCH 08/41] Fixed : Undefined variable numdays while creating order from the BO. --- classes/order/Order.php | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/classes/order/Order.php b/classes/order/Order.php index 656bce9cc..2fac4b50a 100644 --- a/classes/order/Order.php +++ b/classes/order/Order.php @@ -2577,10 +2577,16 @@ class OrderCore extends ObjectModel )) { $totals = array_reduce($serviceProductDetail, function ($carry, $item) use ($order_detail) { $objHotelBookingDetail = new HotelBookingDetail((int) $item['id_htl_booking_detail']); - if ((Product::PRICE_CALCULATION_METHOD_PER_DAY == $order_detail['product_price_calculation_method']) - && (!$numDays = HotelHelper::getNumberOfDays($objHotelBookingDetail->date_from, $objHotelBookingDetail->date_to)) - ) { - $numDays = 1; + $numDays = 1; + if (Product::PRICE_CALCULATION_METHOD_PER_DAY == $order_detail['product_price_calculation_method']) { + $calculatedDays = HotelHelper::getNumberOfDays( + $objHotelBookingDetail->date_from, + $objHotelBookingDetail->date_to + ); + + if ($calculatedDays) { + $numDays = $calculatedDays; + } } if (!empty($item['id_tax_rules_group'])) { From b51ddf5a3cbe1d58a0cd9b133651fcfb1dd7c749 Mon Sep 17 00:00:00 2001 From: aradhana kumari Date: Fri, 21 Nov 2025 16:22:54 +0530 Subject: [PATCH 09/41] Fixed : Duplicate category is created for hotel having same name and same parent category --- .../classes/HotelBranchInformation.php | 86 ++++++++++--------- 1 file changed, 46 insertions(+), 40 deletions(-) diff --git a/modules/hotelreservationsystem/classes/HotelBranchInformation.php b/modules/hotelreservationsystem/classes/HotelBranchInformation.php index 27e679eb4..b4fb0ada8 100644 --- a/modules/hotelreservationsystem/classes/HotelBranchInformation.php +++ b/modules/hotelreservationsystem/classes/HotelBranchInformation.php @@ -730,50 +730,56 @@ class HotelBranchInformation extends ObjectModel $catName, $parent_category )) { - if (is_array($link_rewrite)) { - $objCategory = new Category($categoryExists['id_category']); - - foreach (Language::getLanguages() as $lang) { - $objCategory->link_rewrite[$lang['id_lang']] = $link_rewrite[$lang['id_lang']]; - } - - $objCategory->save(); - } - return $categoryExists['id_category']; - } else { - $category = new Category(); - foreach (Language::getLanguages(true) as $lang) { - if (is_array($name) && isset($name[$lang['id_lang']])) { - $catName = $name[$lang['id_lang']]; - } else { - $catName = $name; - } - $category->name[$lang['id_lang']] = $catName; - $category->description[$lang['id_lang']] = $this->moduleInstance->l('Hotel Branch Category', 'HotelBranchInformation'); - + $idHotel = isset($params['id_hotel']) ? $params['id_hotel'] : false; + $isHotel = isset($params['is_hotel']) ? $params['is_hotel'] : false; + $existsCatId = $categoryExists['id_category']; + $belongsToSameHotel = ($idHotel == HotelBranchInformation::getHotelIdByIdCategory($existsCatId)); + if (!$isHotel || $belongsToSameHotel) { if (is_array($link_rewrite)) { - $category->link_rewrite[$lang['id_lang']] = $link_rewrite[$lang['id_lang']]; - } else { - $category->link_rewrite[$lang['id_lang']] = Tools::link_rewrite($catName); + $objCategory = new Category($existsCatId); + + foreach (Language::getLanguages() as $lang) { + $objCategory->link_rewrite[$lang['id_lang']] = $link_rewrite[$lang['id_lang']]; + } + + $objCategory->save(); } + return $existsCatId; } - - if ($meta_title) { - $category->meta_title = $meta_title; - } - if ($meta_description) { - $category->meta_description = $meta_description; - } - if ($meta_keywords) { - $category->meta_keywords = $meta_keywords; - } - - $category->id_parent = $parent_category; - $category->groupBox = $group_ids; - $category->add(); - - return $category->id; } + + $category = new Category(); + foreach (Language::getLanguages(true) as $lang) { + if (is_array($name) && isset($name[$lang['id_lang']])) { + $catName = $name[$lang['id_lang']]; + } else { + $catName = $name; + } + $category->name[$lang['id_lang']] = $catName; + $category->description[$lang['id_lang']] = $this->moduleInstance->l('Hotel Branch Category', 'HotelBranchInformation'); + + if (is_array($link_rewrite)) { + $category->link_rewrite[$lang['id_lang']] = $link_rewrite[$lang['id_lang']]; + } else { + $category->link_rewrite[$lang['id_lang']] = Tools::link_rewrite($catName); + } + } + + if ($meta_title) { + $category->meta_title = $meta_title; + } + if ($meta_description) { + $category->meta_description = $meta_description; + } + if ($meta_keywords) { + $category->meta_keywords = $meta_keywords; + } + + $category->id_parent = $parent_category; + $category->groupBox = $group_ids; + $category->add(); + + return $category->id; } //Overrided ObjectModet::delete() to delete all the dependencies of the hotel From 2a8d646f5fdb744ce27cf3624c6833dab0919635 Mon Sep 17 00:00:00 2001 From: Amit sharma Date: Fri, 21 Nov 2025 16:45:16 +0530 Subject: [PATCH 10/41] Fixed: Notices on Admin request sql controller in case there is any error. --- tools/parser_sql/php_sql_parser_autoload.php | 57 ++++++++++---------- 1 file changed, 30 insertions(+), 27 deletions(-) diff --git a/tools/parser_sql/php_sql_parser_autoload.php b/tools/parser_sql/php_sql_parser_autoload.php index 00b8625f4..9a84efe06 100644 --- a/tools/parser_sql/php_sql_parser_autoload.php +++ b/tools/parser_sql/php_sql_parser_autoload.php @@ -1,44 +1,47 @@ Date: Tue, 25 Nov 2025 12:06:04 +0530 Subject: [PATCH 11/41] Fixed : Getting warning while trying to delete a cart rule. --- admin/themes/default/template/modal.tpl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/admin/themes/default/template/modal.tpl b/admin/themes/default/template/modal.tpl index 360e1cc48..043bec023 100644 --- a/admin/themes/default/template/modal.tpl +++ b/admin/themes/default/template/modal.tpl @@ -41,7 +41,7 @@ {if $action.type == 'link'} {$action.label} {elseif $action.type == 'button'} - {/if} From 16a67321fe019211c754ce2ded0af2878ebeee5d Mon Sep 17 00:00:00 2001 From: Amit sharma Date: Thu, 4 Dec 2025 16:28:47 +0530 Subject: [PATCH 12/41] Fixed: warning issue the admin stats while trying to export the data using the CSV export in back office --- classes/module/ModuleGraph.php | 3 +++ 1 file changed, 3 insertions(+) diff --git a/classes/module/ModuleGraph.php b/classes/module/ModuleGraph.php index 0d659dca0..6ba3b5566 100644 --- a/classes/module/ModuleGraph.php +++ b/classes/module/ModuleGraph.php @@ -28,6 +28,9 @@ abstract class ModuleGraphCore extends Module { protected $_employee; + /** @var string CSV data */ + protected $_csv; + /** @var array of integers graph data */ protected $_values = array(); From 38abb56caa44f61b0da60bd2eff5e858effffb3f Mon Sep 17 00:00:00 2001 From: Amit sharma Date: Fri, 5 Dec 2025 13:21:13 +0530 Subject: [PATCH 13/41] Fixed: Transaction ID now visible in Back Office order details --- .../qlopaypalcommerce/controllers/front/payment.php | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/modules/qlopaypalcommerce/controllers/front/payment.php b/modules/qlopaypalcommerce/controllers/front/payment.php index 61eeb19c1..323a81954 100644 --- a/modules/qlopaypalcommerce/controllers/front/payment.php +++ b/modules/qlopaypalcommerce/controllers/front/payment.php @@ -123,7 +123,7 @@ class QloPaypalCommercePaymentModuleFrontController extends ModuleFrontControlle $paypalOrderID = $returnData['data']['id']; // Save order data - $this->saveOrderData($returnData); + $transaction_id = $this->saveOrderData($returnData); if ($paypalOrderID) { $currency = $this->context->currency; $total = (float)$cart->getOrderTotal(true, Cart::BOTH); @@ -144,6 +144,7 @@ class QloPaypalCommercePaymentModuleFrontController extends ModuleFrontControlle $orderStatus = Configuration::get('PS_OS_AWAITING_PAYMENT'); } + $extraVars['transaction_id'] = $transaction_id; // create order for the payment $this->module->validateOrder( $cart->id, @@ -151,7 +152,7 @@ class QloPaypalCommercePaymentModuleFrontController extends ModuleFrontControlle $total, $this->module->l('PayPal Checkout', 'payment'), null, - null, + $extraVars, (int)$currency->id, false, $customer->secure_key @@ -226,6 +227,7 @@ class QloPaypalCommercePaymentModuleFrontController extends ModuleFrontControlle // Save order data private function saveOrderData($orderData) { + $transaction_id = '-'; if ($orderData) { $purchaseUnits = $orderData['data']['purchase_units']; foreach ($purchaseUnits as $purchase) { @@ -264,11 +266,9 @@ class QloPaypalCommercePaymentModuleFrontController extends ModuleFrontControlle $orderObj->order_date = date('Y-m-d H:i:s'); $orderObj->save(); } - - return true; } - return false; + return $transaction_id; } // Create order data to send to PayPal From 7c755c084df2e982f8c0a983f7550a24e84a7f94 Mon Sep 17 00:00:00 2001 From: Amit sharma Date: Wed, 10 Dec 2025 19:32:12 +0530 Subject: [PATCH 14/41] Fixed: notices in the admin stats (customer account tab ) while trying to export the data using the CSV export. --- .../statsregistrations/statsregistrations.php | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) diff --git a/modules/statsregistrations/statsregistrations.php b/modules/statsregistrations/statsregistrations.php index 4e2deaa07..06432ef5a 100644 --- a/modules/statsregistrations/statsregistrations.php +++ b/modules/statsregistrations/statsregistrations.php @@ -184,7 +184,11 @@ class StatsRegistrations extends ModuleGraph { $result = Db::getInstance(_PS_USE_SQL_SLAVE_)->executeS($this->query.$this->getDate()); foreach ($result as $row) { - $this->_values[(int)Tools::substr($row['date_add'], 0, 4)]++; + $days = (int)Tools::substr($row['date_add'], 0, 4); + if (!isset($this->_values[$days])) { + $this->_values[$days] = 0; + } + $this->_values[$days]++; } } @@ -204,7 +208,11 @@ class StatsRegistrations extends ModuleGraph { $result = Db::getInstance(_PS_USE_SQL_SLAVE_)->executeS($this->query.$this->getDate()); foreach ($result as $row) { - $this->_values[(int)Tools::substr($row['date_add'], 8, 2)]++; + $days = (int)Tools::substr($row['date_add'], 8, 2); + if (!isset($this->_values[$days])) { + $this->_values[$days] = 0; + } + $this->_values[$days]++; } } @@ -212,7 +220,11 @@ class StatsRegistrations extends ModuleGraph { $result = Db::getInstance(_PS_USE_SQL_SLAVE_)->executeS($this->query.$this->getDate()); foreach ($result as $row) { - $this->_values[(int)Tools::substr($row['date_add'], 11, 2)]++; + $hour = (int)Tools::substr($row['date_add'], 11, 2); + if (!isset($this->_values[$hour])) { + $this->_values[$hour] = 0; + } + $this->_values[$hour]++; } } } From 928756b94738d2c4f26ea3746f8f039e557c38a1 Mon Sep 17 00:00:00 2001 From: Amit sharma Date: Thu, 11 Dec 2025 12:24:57 +0530 Subject: [PATCH 15/41] Fixed: change the variable name --- modules/statsregistrations/statsregistrations.php | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/modules/statsregistrations/statsregistrations.php b/modules/statsregistrations/statsregistrations.php index 06432ef5a..8c9c32c74 100644 --- a/modules/statsregistrations/statsregistrations.php +++ b/modules/statsregistrations/statsregistrations.php @@ -184,11 +184,11 @@ class StatsRegistrations extends ModuleGraph { $result = Db::getInstance(_PS_USE_SQL_SLAVE_)->executeS($this->query.$this->getDate()); foreach ($result as $row) { - $days = (int)Tools::substr($row['date_add'], 0, 4); - if (!isset($this->_values[$days])) { - $this->_values[$days] = 0; + $year = (int)Tools::substr($row['date_add'], 0, 4); + if (!isset($this->_values[$year])) { + $this->_values[$year] = 0; } - $this->_values[$days]++; + $this->_values[$year]++; } } From 87e85f2a4d9c37690d39dead376aaf3928712925 Mon Sep 17 00:00:00 2001 From: Amit sharma Date: Thu, 11 Dec 2025 19:32:02 +0530 Subject: [PATCH 16/41] Fixed: When issuing a full refund after a partial PayPal refund, the transaction details in the back office no longer display two separate validation entries. --- .../admin/AdminPaypalCommerceTransactionController.php | 2 +- .../admin/paypal_commerce_transaction/helpers/view/view.tpl | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/modules/qlopaypalcommerce/controllers/admin/AdminPaypalCommerceTransactionController.php b/modules/qlopaypalcommerce/controllers/admin/AdminPaypalCommerceTransactionController.php index 8de5e39e3..6430c27f5 100644 --- a/modules/qlopaypalcommerce/controllers/admin/AdminPaypalCommerceTransactionController.php +++ b/modules/qlopaypalcommerce/controllers/admin/AdminPaypalCommerceTransactionController.php @@ -156,7 +156,7 @@ class AdminPaypalCommerceTransactionController extends ModuleAdminController $smartyVars['ppstatusDetailMsg'] = $objPPOrder->ppStatusDetail[$response['data']['purchase_units'][0]['payments']['captures'][0]['status_details']['reason']]; } } - + $smartyVars['refund_url'] = $this->context->link->getAdminLink('AdminPaypalCommerceTransaction',Tools::getAdminTokenLite('AdminPaypalCommerceTransaction')).'&viewwk_paypal_commerce_order&id_paypal_commerce_order=' . (int)$idTrans; $smartyVars['transaction_data'] = $transactionData; $smartyVars['refund_data'] = $refundData; $smartyVars['refunded_amount'] = $totalRefundedFormatted; diff --git a/modules/qlopaypalcommerce/views/templates/admin/paypal_commerce_transaction/helpers/view/view.tpl b/modules/qlopaypalcommerce/views/templates/admin/paypal_commerce_transaction/helpers/view/view.tpl index 67e31f9ff..e20b8666f 100644 --- a/modules/qlopaypalcommerce/views/templates/admin/paypal_commerce_transaction/helpers/view/view.tpl +++ b/modules/qlopaypalcommerce/views/templates/admin/paypal_commerce_transaction/helpers/view/view.tpl @@ -107,7 +107,7 @@ {if $transaction_data and $transaction_data.pp_payment_status == 'COMPLETED'} {* show refund form only if there is any remaing amount for refund *} {if $remaining_refund > 0} -
+
From af875c3607358324e24e6d74adaa1e9d5a415dc6 Mon Sep 17 00:00:00 2001 From: Amit sharma Date: Fri, 12 Dec 2025 12:13:57 +0530 Subject: [PATCH 17/41] Fixed: Getting warnings in the admin products while adding a room in room type in back office. --- .../default/template/controllers/products/configuration.tpl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/admin/themes/default/template/controllers/products/configuration.tpl b/admin/themes/default/template/controllers/products/configuration.tpl index 456a63ec8..7f0bc0f60 100644 --- a/admin/themes/default/template/controllers/products/configuration.tpl +++ b/admin/themes/default/template/controllers/products/configuration.tpl @@ -638,7 +638,7 @@ html += ''; html += ''; html += ''; - html += ''; + html += ''; html += ''; html += ''; html += ''; From 14988b37a04d9c39ddbec3fa9c0606c4ef2c04c9 Mon Sep 17 00:00:00 2001 From: Amit sharma Date: Fri, 12 Dec 2025 16:34:46 +0530 Subject: [PATCH 18/41] Added: Growl notifications now appear when the admin adds a room to the cart or removes a room from the cart. --- .../controllers/admin/AdminHotelRoomsBookingController.php | 2 ++ .../views/js/admin/hotel_rooms_booking.js | 4 +++- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/modules/hotelreservationsystem/controllers/admin/AdminHotelRoomsBookingController.php b/modules/hotelreservationsystem/controllers/admin/AdminHotelRoomsBookingController.php index d78a32f41..fac60d468 100644 --- a/modules/hotelreservationsystem/controllers/admin/AdminHotelRoomsBookingController.php +++ b/modules/hotelreservationsystem/controllers/admin/AdminHotelRoomsBookingController.php @@ -1024,6 +1024,8 @@ class AdminHotelRoomsBookingController extends ModuleAdminController 'no_realloc_rm_type_avail_txt' => $this->l('No room type available for reallocation.', null, true), 'no_swap_rm_avail_txt' => $this->l('No room available for swap.', null, true), 'select_room_txt' => $this->l('Select room', null, true), + 'added_room_success_txt' => $this->l('Room added to cart successfully', null, true), + 'removed_room_success_txt' => $this->l('Room removed from cart successfully', null, true), ); if (Configuration::get('PS_BACKOFFICE_SEARCH_TYPE') == HotelBookingDetail::SEARCH_TYPE_OWS ) { $jsVars['is_occupancy_wise_search'] = true; diff --git a/modules/hotelreservationsystem/views/js/admin/hotel_rooms_booking.js b/modules/hotelreservationsystem/views/js/admin/hotel_rooms_booking.js index 1c4805138..225f08bd2 100644 --- a/modules/hotelreservationsystem/views/js/admin/hotel_rooms_booking.js +++ b/modules/hotelreservationsystem/views/js/admin/hotel_rooms_booking.js @@ -386,6 +386,7 @@ $(document).ready(function() { if (result.success) { $(".cart_booking_btn").removeAttr('disabled'); $current_btn.removeAttr('disabled'); + showSuccessMessage(added_room_success_txt); } btn.removeClass('btn-primary').removeClass('avai_add_cart').addClass('btn-danger').addClass('avai_delete_cart_data').html(remove); @@ -512,6 +513,7 @@ $(document).ready(function() { if (!result.success) { $(".cart_booking_btn").attr('disabled', 'true'); } else { + showSuccessMessage(removed_room_success_txt); $("#htl_rooms_list").empty().append(result.data.room_tpl); refreshCartData(); refreshStatsData(); @@ -571,7 +573,7 @@ $(document).ready(function() { if (!(result.success)) { $(".cart_booking_btn").attr('disabled', 'true'); } - + showSuccessMessage(removed_room_success_txt); $(".cart_tbody tr td button[data-id-cart-book-data='" + id_cart_book_data + "']").parent().parent().remove(); refreshCartData(); refreshStatsData(); From 55e193790bdfed1634ee3c7aae1764e1caa0c7c5 Mon Sep 17 00:00:00 2001 From: "vishalsingh.qlo325" Date: Tue, 16 Dec 2025 12:48:28 +0530 Subject: [PATCH 19/41] Fixed: Order by and Order way not working for the lists in the Back office. --- classes/controller/AdminController.php | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/classes/controller/AdminController.php b/classes/controller/AdminController.php index 67d88e69a..d5299ba94 100644 --- a/classes/controller/AdminController.php +++ b/classes/controller/AdminController.php @@ -875,9 +875,13 @@ class AdminControllerCore extends Controller $prefix = $this->getCookieFilterPrefix(); $filters = array(); if (isset($this->list_id)) { + $postPrefixPattern = '#^(' . + preg_quote($this->list_id, '#') . 'Filter_|' . + 'submitFilter' . + ')#i'; foreach ($_POST as $key => $value) { // only process the filter fields. - if (stripos($key, $this->list_id.'Filter_') !== 0) { + if (!preg_match($postPrefixPattern, $key)) { continue; } @@ -898,9 +902,15 @@ class AdminControllerCore extends Controller } } + $getPrefixPattern = '#^(' . + preg_quote($this->list_id, '#') . 'Filter_|' . + 'submitFilter|' . + preg_quote($this->list_id, '#') . 'Orderby|' . + preg_quote($this->list_id, '#') . 'Orderway' . + ')#i'; foreach ($_GET as $key => $value) { - // only process the filter fields. - if (stripos($key, $this->list_id.'Filter_') !== 0) { + // only process the filter and order by, order way fields. + if (!preg_match($getPrefixPattern, $key)) { continue; } From ba957ac9a872f216aaeca3703aef4dc7e224cdec Mon Sep 17 00:00:00 2001 From: Amit sharma Date: Tue, 16 Dec 2025 17:14:40 +0530 Subject: [PATCH 20/41] Fixed:Displaying a warning about a deprecated function when trying to view PayPal transaction details. --- .../classes/WkPaypalCommerceHelper.php | 14 +++++++------- .../classes/WkPaypalCommerceWebhook.php | 4 ++-- ...dminPaypalCommerceTransactionController.php | 10 +++++----- .../controllers/front/callback.php | 8 ++++---- .../controllers/front/payment.php | 18 +++++++++--------- .../controllers/front/webhook.php | 8 ++++---- .../libs/Helpers/HttpHelper.php | 4 ++-- 7 files changed, 33 insertions(+), 33 deletions(-) diff --git a/modules/qlopaypalcommerce/classes/WkPaypalCommerceHelper.php b/modules/qlopaypalcommerce/classes/WkPaypalCommerceHelper.php index 42b4e1b0e..cc0ee0129 100644 --- a/modules/qlopaypalcommerce/classes/WkPaypalCommerceHelper.php +++ b/modules/qlopaypalcommerce/classes/WkPaypalCommerceHelper.php @@ -65,7 +65,7 @@ class WkPaypalCommerceHelper if ($err) { throw new PrestaShopException(sprintf('cURL Error #: %s', $err)); } else { - $accessToken = Tools::jsonDecode($response, true); + $accessToken = json_decode($response, true); if (isset($accessToken['error']) && !empty($accessToken['error'])) { $apiResp['success'] = false; $apiResp['message'] = $accessToken['error_description']; @@ -83,12 +83,12 @@ class WkPaypalCommerceHelper $temp = array( "alg" => "none" ); - $returnData = base64_encode(Tools::jsonEncode($temp)) . '.'; + $returnData = base64_encode(json_encode($temp)) . '.'; $temp = array( "iss" => trim(Configuration::get('WK_PAYPAL_COMMERCE_CLIENT_ID')), "payer_id" => Configuration::get('WK_PAYPAL_COMMERCE_MERCHANT_ID') ); - $returnData .= base64_encode(Tools::jsonEncode($temp)) . '.'; + $returnData .= base64_encode(json_encode($temp)) . '.'; return $returnData; } @@ -145,7 +145,7 @@ class WkPaypalCommerceHelper CURLOPT_TIMEOUT => 30, CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1, CURLOPT_CUSTOMREQUEST => "POST", - CURLOPT_POSTFIELDS => Tools::jsonEncode($postData), + CURLOPT_POSTFIELDS => json_encode($postData), CURLOPT_HTTPHEADER => array( "PayPal-Partner-Attribution-Id: " . PayPalHelper::WK_PAYPAL_COMMERCE_ATTRIBUTION_ID, "authorization: Bearer " . $token, @@ -161,7 +161,7 @@ class WkPaypalCommerceHelper if ($err) { throw new PrestaShopException(sprintf('cURL Error #: %s', $err)); } else { - $webhookResponse = Tools::jsonDecode($response, true); + $webhookResponse = json_decode($response, true); if (isset($webhookResponse['id']) && !empty($webhookResponse['id'])) { $apiResp['success'] = true; $apiResp['webhook_id'] = $webhookResponse['id']; @@ -243,7 +243,7 @@ class WkPaypalCommerceHelper CURLOPT_TIMEOUT => 30, CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1, CURLOPT_CUSTOMREQUEST => "POST", - CURLOPT_POSTFIELDS => Tools::jsonEncode($postData), + CURLOPT_POSTFIELDS => json_encode($postData), CURLOPT_HTTPHEADER => array( "PayPal-Partner-Attribution-Id: " . PayPalHelper::WK_PAYPAL_COMMERCE_ATTRIBUTION_ID, "authorization: Bearer " . $accessToken['access_token'], @@ -260,7 +260,7 @@ class WkPaypalCommerceHelper if ($err) { throw new PrestaShopException(sprintf('cURL Error #: %s', $err)); } else { - $apiResp = Tools::jsonDecode($response, true); + $apiResp = json_decode($response, true); } } return $apiResp; diff --git a/modules/qlopaypalcommerce/classes/WkPaypalCommerceWebhook.php b/modules/qlopaypalcommerce/classes/WkPaypalCommerceWebhook.php index a1bc73ae0..4a6833f40 100644 --- a/modules/qlopaypalcommerce/classes/WkPaypalCommerceWebhook.php +++ b/modules/qlopaypalcommerce/classes/WkPaypalCommerceWebhook.php @@ -52,7 +52,7 @@ class WkPaypalCommerceWebhook if (isset($eventData['resource']['note_to_payer'])) { $refundObj->refund_reason = $eventData['resource']['note_to_payer']; } - $refundObj->response = Tools::jsonEncode($eventData); + $refundObj->response = json_encode($eventData); $refundObj->refund_status = $eventData['resource']['status']; $refundObj->save(); } @@ -188,7 +188,7 @@ class WkPaypalCommerceWebhook return Db::getInstance()->execute( 'UPDATE `'._DB_PREFIX_.'wk_paypal_commerce_order` SET `pp_payment_status` = "'.pSQL($payment_status).'", - `response` = "'.pSQL(Tools::jsonEncode($orderData)).'" + `response` = "'.pSQL(json_encode($orderData)).'" WHERE `pp_transaction_id` = "'.pSQL($transaction_id).'" ' ); diff --git a/modules/qlopaypalcommerce/controllers/admin/AdminPaypalCommerceTransactionController.php b/modules/qlopaypalcommerce/controllers/admin/AdminPaypalCommerceTransactionController.php index 8de5e39e3..57b954ede 100644 --- a/modules/qlopaypalcommerce/controllers/admin/AdminPaypalCommerceTransactionController.php +++ b/modules/qlopaypalcommerce/controllers/admin/AdminPaypalCommerceTransactionController.php @@ -144,7 +144,7 @@ class AdminPaypalCommerceTransactionController extends ModuleAdminController $totalRefunded = WkPaypalCommerceRefund::getTotalRefundedAmount((int)$idTrans, false); $remainingRefund = (float)($transactionData['pp_paid_total'] - $totalRefunded); - $response = Tools::jsonDecode($transactionData['response'], true); + $response = json_decode($transactionData['response'], true); // Buyer making a payment in a different currency (ex: EUR) which is different from the default currency of merchant (Ex: USD), In all those cross currency cases, After Capture, transaction will fall into Pending state and will require merchant to manually go to his PayPal account and accept the payment. $objPPOrder = new WKPayPalCommerceOrder(); @@ -231,7 +231,7 @@ class AdminPaypalCommerceTransactionController extends ModuleAdminController WkPaypalCommerceHelper::logMsg('refund', 'PayPal Transaction ID: '. $transactionData['pp_transaction_id']); WkPaypalCommerceHelper::logMsg('refund', 'PayPal Order ID: '. $transactionData['pp_order_id']); WkPaypalCommerceHelper::logMsg('refund', 'Refund request data: '); - WkPaypalCommerceHelper::logMsg('refund', Tools::jsonEncode($postData)); + WkPaypalCommerceHelper::logMsg('refund', json_encode($postData)); $objPPCommerce = new PayPalCommerce(); $refundData = $objPPCommerce->orders->refund($postData); @@ -243,7 +243,7 @@ class AdminPaypalCommerceTransactionController extends ModuleAdminController WkPaypalCommerceHelper::logMsg('refund', 'Refund success: ', true); WkPaypalCommerceHelper::logMsg('refund', 'PayPal Refund Id: '. $refundID); WkPaypalCommerceHelper::logMsg('refund', 'Refund reponse data: '); - WkPaypalCommerceHelper::logMsg('refund', Tools::jsonEncode($refundData)); + WkPaypalCommerceHelper::logMsg('refund', json_encode($refundData)); WkPaypalCommerceHelper::logMsg('refund', '----------------------- ', true); $refundObj = new WkPaypalCommerceRefund(); @@ -253,7 +253,7 @@ class AdminPaypalCommerceTransactionController extends ModuleAdminController $refundObj->refund_type = (int)$refundType; $refundObj->currency_code = $transactionData['pp_paid_currency']; $refundObj->refund_reason = $refundReason; - $refundObj->response = Tools::jsonEncode($refundData); + $refundObj->response = json_encode($refundData); $refundObj->refund_status = $refundData['data']['status']; if ($refundObj->save()) { $urlString = '&viewwk_paypal_commerce_order=&id_paypal_commerce_order=' . (int)Tools::getValue('id_paypal_commerce_order'); @@ -263,7 +263,7 @@ class AdminPaypalCommerceTransactionController extends ModuleAdminController } else { WkPaypalCommerceHelper::logMsg('refund', 'Refund failed: ', true); WkPaypalCommerceHelper::logMsg('refund', 'Refund reponse data: '); - WkPaypalCommerceHelper::logMsg('refund', Tools::jsonEncode($refundData)); + WkPaypalCommerceHelper::logMsg('refund', json_encode($refundData)); WkPaypalCommerceHelper::logMsg('refund', '----------------------- ', true); $this->errors[] = $refundData['data']['message']; } diff --git a/modules/qlopaypalcommerce/controllers/front/callback.php b/modules/qlopaypalcommerce/controllers/front/callback.php index daa39abb9..89aac427d 100644 --- a/modules/qlopaypalcommerce/controllers/front/callback.php +++ b/modules/qlopaypalcommerce/controllers/front/callback.php @@ -44,25 +44,25 @@ class QloPaypalCommerceCallbackModuleFrontController extends ModuleFrontControll } if ($json) { - $payload['webhook_event'] = Tools::jsonDecode($json, true); + $payload['webhook_event'] = json_decode($json, true); } if ($payload) { WkPaypalCommerceHelper::logMsg('webhook', 'Webhook initiated...', true); WkPaypalCommerceHelper::logMsg('webhook', 'Environment: '. Configuration::get('WK_PAYPAL_COMMERCE_PAYMENT_MODE')); WkPaypalCommerceHelper::logMsg('webhook', 'Webhook payload data: '); - WkPaypalCommerceHelper::logMsg('webhook', Tools::jsonEncode($payload)); + WkPaypalCommerceHelper::logMsg('webhook', json_encode($payload)); WkPaypalCommerceHelper::logMsg('webhook', 'Validating webhook signature...'); $validateSig = WkPaypalCommerceHelper::validateWebhookSig($payload); WkPaypalCommerceHelper::logMsg('webhook', 'Webhook respose data: '); - WkPaypalCommerceHelper::logMsg('webhook', Tools::jsonEncode($validateSig)); + WkPaypalCommerceHelper::logMsg('webhook', json_encode($validateSig)); if (isset($validateSig['verification_status']) && $validateSig['verification_status'] == 'SUCCESS' ) { - $eventData = Tools::jsonDecode($json, true); + $eventData = json_decode($json, true); $objWebhook = new WkPaypalCommerceWebhook(); switch ($eventData['event_type']) { case 'CHECKOUT.ORDER.APPROVED': diff --git a/modules/qlopaypalcommerce/controllers/front/payment.php b/modules/qlopaypalcommerce/controllers/front/payment.php index 61eeb19c1..383c34598 100644 --- a/modules/qlopaypalcommerce/controllers/front/payment.php +++ b/modules/qlopaypalcommerce/controllers/front/payment.php @@ -69,7 +69,7 @@ class QloPaypalCommercePaymentModuleFrontController extends ModuleFrontControlle switch ($action) { case 1: $json = Tools::file_get_contents('php://input'); - $orderDetails = Tools::jsonDecode($json, true); + $orderDetails = json_decode($json, true); $cart = $this->context->cart; @@ -86,23 +86,23 @@ class QloPaypalCommercePaymentModuleFrontController extends ModuleFrontControlle // create order $orderDetails['original'] = $this->getOrderDetails(); - WkPaypalCommerceHelper::logMsg('payment', Tools::jsonEncode($orderDetails)); + WkPaypalCommerceHelper::logMsg('payment', json_encode($orderDetails)); $ppOrderData = $ppCommerce->orders->create($orderDetails); WkPaypalCommerceHelper::logMsg('payment', 'Payment response data: ', true); - WkPaypalCommerceHelper::logMsg('payment', Tools::jsonEncode($ppOrderData)); + WkPaypalCommerceHelper::logMsg('payment', json_encode($ppOrderData)); - die(Tools::jsonEncode($ppOrderData)); + die(json_encode($ppOrderData)); case 2: $json = Tools::file_get_contents('php://input'); - $orderData = Tools::jsonDecode($json, true); + $orderData = json_decode($json, true); if ($orderData['orderID'] && $orderData['getOrderData']) { $ppCommerce = new PayPalCommerce(); $returnData = $ppCommerce->orders->capture($orderData['orderID']); header('Content-Type: application/json'); - echo Tools::jsonEncode($returnData['data']); + echo json_encode($returnData['data']); die; } elseif (Tools::getIsset('order_id')) { $orderID = Tools::getValue('order_id'); @@ -116,7 +116,7 @@ class QloPaypalCommercePaymentModuleFrontController extends ModuleFrontControlle WkPaypalCommerceHelper::logMsg('payment', 'Customer ID: '. $cart->id_customer); WkPaypalCommerceHelper::logMsg('payment', 'Currency ID: '. $cart->id_currency); WkPaypalCommerceHelper::logMsg('payment', 'Cart Total: '. $cart->getOrderTotal(true, Cart::BOTH)); - WkPaypalCommerceHelper::logMsg('payment', Tools::jsonEncode($returnData)); + WkPaypalCommerceHelper::logMsg('payment', json_encode($returnData)); if (isset($returnData['data']['id']) && !empty($returnData['data']['id'])) { // Payment success @@ -210,7 +210,7 @@ class QloPaypalCommercePaymentModuleFrontController extends ModuleFrontControlle break; case 3: WkPaypalCommerceHelper::logMsg('payment', 'Payment cancelled by customer...', true); - WkPaypalCommerceHelper::logMsg('payment', Tools::jsonEncode(Tools::getAllValues())); + WkPaypalCommerceHelper::logMsg('payment', json_encode(Tools::getAllValues())); WkPaypalCommerceHelper::logMsg('payment', '--------------', true); Tools::redirect($this->context->link->getPageLink('order-opc', true, null).'?pp_cancel=1'); @@ -260,7 +260,7 @@ class QloPaypalCommercePaymentModuleFrontController extends ModuleFrontControlle $orderObj->pp_order_id = $orderData['data']['id']; $orderObj->pp_transaction_id = $transaction_id; $orderObj->pp_payment_status = $payment_status; - $orderObj->response = Tools::jsonEncode($orderData); + $orderObj->response = json_encode($orderData); $orderObj->order_date = date('Y-m-d H:i:s'); $orderObj->save(); } diff --git a/modules/qlopaypalcommerce/controllers/front/webhook.php b/modules/qlopaypalcommerce/controllers/front/webhook.php index 0ff356f8f..8315afd89 100644 --- a/modules/qlopaypalcommerce/controllers/front/webhook.php +++ b/modules/qlopaypalcommerce/controllers/front/webhook.php @@ -44,25 +44,25 @@ class QloPaypalCommerceWebhookModuleFrontController extends ModuleFrontControlle } if ($json) { - $payload['webhook_event'] = Tools::jsonDecode($json, true); + $payload['webhook_event'] = json_decode($json, true); } if ($payload) { WkPaypalCommerceHelper::logMsg('webhook', 'Webhook initiated...', true); WkPaypalCommerceHelper::logMsg('webhook', 'Environment: '. Configuration::get('WK_PAYPAL_COMMERCE_PAYMENT_MODE')); WkPaypalCommerceHelper::logMsg('webhook', 'Webhook payload data: '); - WkPaypalCommerceHelper::logMsg('webhook', Tools::jsonEncode($payload)); + WkPaypalCommerceHelper::logMsg('webhook', json_encode($payload)); WkPaypalCommerceHelper::logMsg('webhook', 'Validating webhook signature...'); $validateSig = WkPaypalCommerceHelper::validateWebhookSig($payload); WkPaypalCommerceHelper::logMsg('webhook', 'Webhook respose data: '); - WkPaypalCommerceHelper::logMsg('webhook', Tools::jsonEncode($validateSig)); + WkPaypalCommerceHelper::logMsg('webhook', json_encode($validateSig)); if (isset($validateSig['verification_status']) && $validateSig['verification_status'] == 'SUCCESS' ) { - $eventData = Tools::jsonDecode($json, true); + $eventData = json_decode($json, true); $objWebhook = new WkPaypalCommerceWebhook(); switch ($eventData['event_type']) { case 'CHECKOUT.ORDER.APPROVED': diff --git a/modules/qlopaypalcommerce/libs/Helpers/HttpHelper.php b/modules/qlopaypalcommerce/libs/Helpers/HttpHelper.php index cdd2952ba..f3c42b7ce 100644 --- a/modules/qlopaypalcommerce/libs/Helpers/HttpHelper.php +++ b/modules/qlopaypalcommerce/libs/Helpers/HttpHelper.php @@ -70,7 +70,7 @@ class HttpHelper { $headerSize = curl_getinfo($this->_curl, CURLINFO_HEADER_SIZE); $body = substr($result, $headerSize); - return Tools::jsonDecode($body, true); + return json_decode($body, true); } public function resetHelper() { @@ -85,7 +85,7 @@ class HttpHelper { public function setBody($postData) { if(is_array($postData)) { - $postData = Tools::jsonEncode($postData); + $postData = json_encode($postData); } curl_setopt($this->_curl, CURLOPT_POSTFIELDS, $postData); curl_setopt($this->_curl, CURLOPT_POST, true); From 98ea0f712e201eac99914b0395f8dfb2b87c70a0 Mon Sep 17 00:00:00 2001 From: Amit sharma Date: Wed, 17 Dec 2025 14:13:47 +0530 Subject: [PATCH 21/41] Fixed: fatal error on dashboard when number of decimals is 0. --- controllers/admin/AdminOrdersController.php | 3 ++- modules/dashactivity/dashactivity.php | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/controllers/admin/AdminOrdersController.php b/controllers/admin/AdminOrdersController.php index cd2874dba..30026bcca 100644 --- a/controllers/admin/AdminOrdersController.php +++ b/controllers/admin/AdminOrdersController.php @@ -2992,7 +2992,8 @@ class AdminOrdersControllerCore extends AdminController $helper->icon = 'icon-money'; $helper->color = 'color2'; $helper->title = $this->l('Total Due Amount', null, null, false); - $minValue = ('0.' . str_repeat('0', (Configuration::get('PS_PRICE_DISPLAY_PRECISION') - 1)) . '1'); + $priceDisplayPrecision = (int)Configuration::get('PS_PRICE_DISPLAY_PRECISION'); + $minValue = ('0.' . ($priceDisplayPrecision ? str_repeat('0', ($priceDisplayPrecision - 1)) : '') . '1'); // get all valid order states for due amount calculations $validOrderStatesFilter = ''; diff --git a/modules/dashactivity/dashactivity.php b/modules/dashactivity/dashactivity.php index 5f409565d..f9a36d348 100644 --- a/modules/dashactivity/dashactivity.php +++ b/modules/dashactivity/dashactivity.php @@ -532,12 +532,13 @@ class Dashactivity extends Module public function getConfigFieldsValues() { + $priceDisplayPrecision = (int)Configuration::get('PS_PRICE_DISPLAY_PRECISION'); return array( 'DASHACTIVITY_CART_ACTIVE' => Tools::getValue('DASHACTIVITY_CART_ACTIVE', Configuration::get('DASHACTIVITY_CART_ACTIVE')), 'DASHACTIVITY_CART_ABANDONED_MIN' => Tools::getValue('DASHACTIVITY_CART_ABANDONED_MIN', Configuration::get('DASHACTIVITY_CART_ABANDONED_MIN')), 'DASHACTIVITY_CART_ABANDONED_MAX' => Tools::getValue('DASHACTIVITY_CART_ABANDONED_MAX', Configuration::get('DASHACTIVITY_CART_ABANDONED_MAX')), 'DASHACTIVITY_VISITOR_ONLINE' => Tools::getValue('DASHACTIVITY_VISITOR_ONLINE', Configuration::get('DASHACTIVITY_VISITOR_ONLINE')), - 'min_due_amount' => ('0.' . str_repeat('0', (Configuration::get('PS_PRICE_DISPLAY_PRECISION') - 1)) . '1') + 'min_due_amount' => ('0.' . ($priceDisplayPrecision ? str_repeat('0', ($priceDisplayPrecision - 1)) : '') . '1') ); } From f7a5b18d0ed15b7856ebf94380f968989c2ca23c Mon Sep 17 00:00:00 2001 From: Amit sharma Date: Wed, 17 Dec 2025 18:10:15 +0530 Subject: [PATCH 22/41] Fixed: The displayed theme compatibility version is incorrect. --- controllers/admin/AdminThemesController.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/controllers/admin/AdminThemesController.php b/controllers/admin/AdminThemesController.php index 9781d25ef..795b96943 100644 --- a/controllers/admin/AdminThemesController.php +++ b/controllers/admin/AdminThemesController.php @@ -1358,8 +1358,8 @@ class AdminThemesControllerCore extends AdminController $fields_value['theme_name'] = $theme->name; $fields_value['theme_directory'] = $theme->directory; $fields_value['theme_version'] = '1.0'; - $fields_value['compa_from'] = _PS_VERSION_; - $fields_value['compa_to'] = _PS_VERSION_; + $fields_value['compa_from'] = _QLOAPPS_VERSION_; + $fields_value['compa_to'] = _QLOAPPS_VERSION_; $fields_value['id_theme_export'] = Tools::getValue('id_theme_export'); $fields_value['documentationName'] = $this->l('documentation'); From cdb0fbad0ef1d850ff284055d02c4482f823c7f6 Mon Sep 17 00:00:00 2001 From: Amit sharma Date: Thu, 18 Dec 2025 16:59:06 +0530 Subject: [PATCH 23/41] Fixed: Undefined variable in the admin stats while trying to export the data using the CSV export. --- classes/module/ModuleGrid.php | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/classes/module/ModuleGrid.php b/classes/module/ModuleGrid.php index 66f292359..903d749e2 100644 --- a/classes/module/ModuleGrid.php +++ b/classes/module/ModuleGrid.php @@ -159,12 +159,13 @@ abstract class ModuleGridCore extends Module $this->setLang($context->language->id); $this->setEmployee($context->employee->id); + $layers = isset($datas['layers']) ? $datas['layers'] : 1; + if (isset($datas['option'])) { $this->setOption($datas['option'], $layers); } $this->getData(); - $layers = isset($datas['layers']) ? $datas['layers'] : 1; if (count($datas['columns'])) { foreach ($datas['columns'] as $column) { From a5787f1b8688dd72a54456247da1d3c595c5ecb9 Mon Sep 17 00:00:00 2001 From: Amit sharma Date: Fri, 19 Dec 2025 16:23:58 +0530 Subject: [PATCH 24/41] Fixed: Service product quantity not showing on the order details page in the back office --- .../_extra_services_service_products_tab_content.tpl | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/admin/themes/default/template/controllers/orders/modals/_extra_services_service_products_tab_content.tpl b/admin/themes/default/template/controllers/orders/modals/_extra_services_service_products_tab_content.tpl index a1013e732..c2af485fb 100644 --- a/admin/themes/default/template/controllers/orders/modals/_extra_services_service_products_tab_content.tpl +++ b/admin/themes/default/template/controllers/orders/modals/_extra_services_service_products_tab_content.tpl @@ -256,6 +256,7 @@ {l s='ID'} {l s='Name'} + {l s='Quantity'} {l s='Unit Price (tax excl.)'} {l s='Total Price (tax excl.)'} {l s='Total Price (tax incl.)'} @@ -276,6 +277,15 @@ {l s='Auto added'} {/if} + + {if isset($service['allow_multiple_quantity']) && $service['allow_multiple_quantity']} +
+ +
+ {else} + {l s='--'} + {/if} + {displayPrice price=$service['unit_price_tax_excl'] currency=$orderCurrency} {if $service['price_calculation_method'] == Product::PRICE_CALCULATION_METHOD_PER_DAY} From 3dc41008511d716d6ec513a24418b82573fc3a3d Mon Sep 17 00:00:00 2001 From: Amit sharma Date: Fri, 26 Dec 2025 16:32:27 +0530 Subject: [PATCH 25/41] Fixed: correction of the variable declaration --- classes/order/Order.php | 13 ++++--------- 1 file changed, 4 insertions(+), 9 deletions(-) diff --git a/classes/order/Order.php b/classes/order/Order.php index 2fac4b50a..7bceb94cf 100644 --- a/classes/order/Order.php +++ b/classes/order/Order.php @@ -2578,15 +2578,10 @@ class OrderCore extends ObjectModel $totals = array_reduce($serviceProductDetail, function ($carry, $item) use ($order_detail) { $objHotelBookingDetail = new HotelBookingDetail((int) $item['id_htl_booking_detail']); $numDays = 1; - if (Product::PRICE_CALCULATION_METHOD_PER_DAY == $order_detail['product_price_calculation_method']) { - $calculatedDays = HotelHelper::getNumberOfDays( - $objHotelBookingDetail->date_from, - $objHotelBookingDetail->date_to - ); - - if ($calculatedDays) { - $numDays = $calculatedDays; - } + if ((Product::PRICE_CALCULATION_METHOD_PER_DAY == $order_detail['product_price_calculation_method']) + && (!$numDays = HotelHelper::getNumberOfDays($objHotelBookingDetail->date_from, $objHotelBookingDetail->date_to)) + ) { + $numDays = 1; } if (!empty($item['id_tax_rules_group'])) { From 8e260a991c8632f29bae3ed4ca236d5c8628835a Mon Sep 17 00:00:00 2001 From: Amit sharma Date: Fri, 26 Dec 2025 16:57:38 +0530 Subject: [PATCH 26/41] Fixed: remove textbox and display quantity in normal text --- .../modals/_extra_services_service_products_tab_content.tpl | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/admin/themes/default/template/controllers/orders/modals/_extra_services_service_products_tab_content.tpl b/admin/themes/default/template/controllers/orders/modals/_extra_services_service_products_tab_content.tpl index c2af485fb..8fb331302 100644 --- a/admin/themes/default/template/controllers/orders/modals/_extra_services_service_products_tab_content.tpl +++ b/admin/themes/default/template/controllers/orders/modals/_extra_services_service_products_tab_content.tpl @@ -279,9 +279,7 @@ {if isset($service['allow_multiple_quantity']) && $service['allow_multiple_quantity']} -
- -
+ {$service['quantity']} {else} {l s='--'} {/if} From 56b2b29adbc6fc7207e143b5c60d07d7580910b4 Mon Sep 17 00:00:00 2001 From: azhar bhat Date: Mon, 29 Dec 2025 13:01:55 +0530 Subject: [PATCH 27/41] roomtype name is clickable now in search result page --- themes/hotel-reservation-theme/_partials/room_type_list.tpl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/themes/hotel-reservation-theme/_partials/room_type_list.tpl b/themes/hotel-reservation-theme/_partials/room_type_list.tpl index 377a22ae1..aaa0f3ec0 100644 --- a/themes/hotel-reservation-theme/_partials/room_type_list.tpl +++ b/themes/hotel-reservation-theme/_partials/room_type_list.tpl @@ -42,7 +42,7 @@
{block name='room_type_list_room_quantity'}
-

{$room_v['name']|escape:'htmlall':'UTF-8'}

+

{$room_v['name']|escape:'htmlall':'UTF-8'}

{if !isset($restricted_country_mode) && !$PS_CATALOG_MODE && !$order_date_restrict}

$warning_num} style="display:none"{/if}> {l s='Hurry!'} {$room_v['room_left']|escape:'htmlall':'UTF-8'} {l s='rooms left'} From 1a6cf15d6d536ec142f148122436eeab84c7474e Mon Sep 17 00:00:00 2001 From: Amit sharma Date: Tue, 30 Dec 2025 15:36:00 +0530 Subject: [PATCH 28/41] Fixed: remove text formatter --- tools/parser_sql/php_sql_parser_autoload.php | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/tools/parser_sql/php_sql_parser_autoload.php b/tools/parser_sql/php_sql_parser_autoload.php index 9a84efe06..d5ab4c7e6 100644 --- a/tools/parser_sql/php_sql_parser_autoload.php +++ b/tools/parser_sql/php_sql_parser_autoload.php @@ -31,10 +31,8 @@ function classAutoLoader($class) return; } - $parts = explode('\\', $class); - $className = end($parts); - - if (class_exists($className)) { + $className = end(explode('\\', $class)); + if(class_exists($className)) { return; } From 2fefed0040be65178441b25b6e0edf7340ee4373 Mon Sep 17 00:00:00 2001 From: Amit sharma Date: Tue, 30 Dec 2025 15:43:35 +0530 Subject: [PATCH 29/41] Fixed: remove text formatter --- tools/parser_sql/php_sql_parser_autoload.php | 52 ++++++++++---------- 1 file changed, 26 insertions(+), 26 deletions(-) diff --git a/tools/parser_sql/php_sql_parser_autoload.php b/tools/parser_sql/php_sql_parser_autoload.php index d5ab4c7e6..a9bb9d3a0 100644 --- a/tools/parser_sql/php_sql_parser_autoload.php +++ b/tools/parser_sql/php_sql_parser_autoload.php @@ -1,37 +1,37 @@ Date: Wed, 7 Jan 2026 17:58:33 +0530 Subject: [PATCH 30/41] Text issue fixed --- controllers/admin/AdminProductsController.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/controllers/admin/AdminProductsController.php b/controllers/admin/AdminProductsController.php index bf4321607..07c3ef99b 100644 --- a/controllers/admin/AdminProductsController.php +++ b/controllers/admin/AdminProductsController.php @@ -3111,7 +3111,7 @@ class AdminProductsControllerCore extends AdminController $this->displayWarning($this->l('You must save the room type in this shop before managing hotel configuration.')); } } else { - $this->displayWarning($this->l('You must save this room type before managing hotel configuration.')); + $this->displayWarning($this->l('You must save this room type before managing rooms.')); } $this->tpl_form_vars['custom_form'] = $data->fetch(); From cfd5f7219038ce6bc90168082f3d2fa684bed600 Mon Sep 17 00:00:00 2001 From: "vishalsingh.qlo325" Date: Wed, 7 Jan 2026 18:29:36 +0530 Subject: [PATCH 31/41] Removed non needed code --- classes/controller/AdminController.php | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/classes/controller/AdminController.php b/classes/controller/AdminController.php index d5299ba94..7e979e4d3 100644 --- a/classes/controller/AdminController.php +++ b/classes/controller/AdminController.php @@ -875,9 +875,9 @@ class AdminControllerCore extends Controller $prefix = $this->getCookieFilterPrefix(); $filters = array(); if (isset($this->list_id)) { - $postPrefixPattern = '#^(' . - preg_quote($this->list_id, '#') . 'Filter_|' . - 'submitFilter' . + $postPrefixPattern = '#^('. + $this->list_id.'Filter_|'. + 'submitFilter'. ')#i'; foreach ($_POST as $key => $value) { // only process the filter fields. @@ -903,10 +903,10 @@ class AdminControllerCore extends Controller } $getPrefixPattern = '#^(' . - preg_quote($this->list_id, '#') . 'Filter_|' . - 'submitFilter|' . - preg_quote($this->list_id, '#') . 'Orderby|' . - preg_quote($this->list_id, '#') . 'Orderway' . + 'submitFilter|'. + $this->list_id.'Filter_|'. + $this->list_id.'Orderby|'. + $this->list_id.'Orderway'. ')#i'; foreach ($_GET as $key => $value) { // only process the filter and order by, order way fields. From 4e1beed7e6839eee48858074ec51bf01b3adb1ab Mon Sep 17 00:00:00 2001 From: azhar bhat Date: Wed, 7 Jan 2026 18:45:05 +0530 Subject: [PATCH 32/41] Design issue in admin Modules fixed --- .../default/template/controllers/modules/configure.tpl | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/admin/themes/default/template/controllers/modules/configure.tpl b/admin/themes/default/template/controllers/modules/configure.tpl index 24b6560a0..3d3f0d1b9 100644 --- a/admin/themes/default/template/controllers/modules/configure.tpl +++ b/admin/themes/default/template/controllers/modules/configure.tpl @@ -60,7 +60,7 @@

  • -
    {l s='Back'}
    + {l s='Back'}