GT ITECH Posted January 18, 2016 Share Posted January 18, 2016 Hello, i have a little issue with the overriding of the OrderController.php file. I want to change how the $minimal_purchase variable is set, to do that i must override the init() function of the controller. class OrderController extends OrderControllerCore { public $step; const STEP_SUMMARY_EMPTY_CART = -1; const STEP_ADDRESSES = 1; const STEP_DELIVERY = 2; const STEP_PAYMENT = 3; /** * Initialize order controller * @see FrontController::init() */ public function init() { global $orderTotal; parent::init(); $this->step = (int)Tools::getValue('step'); if (!$this->nbProducts) { $this->step = -1; } $product = $this->context->cart->checkQuantities(true); if ((int)$id_product = $this->context->cart->checkProductsAccess()) { $this->step = 0; $this->errors[] = sprintf(Tools::displayError('An item in your cart is no longer available (%1s). You cannot proceed with your order.'), Product::getProductName((int)$id_product)); } // If some products have disappear if (is_array($product)) { $this->step = 0; $this->errors[] = sprintf(Tools::displayError('An item (%1s) in your cart is no longer available in this quantity. You cannot proceed with your order until the quantity is adjusted.'), $product['name']); } // Check minimal amount $currency = Currency::getCurrency((int)$this->context->cart->id_currency); $orderTotal = $this->context->cart->getOrderTotal(); $query = Db::getInstance()->getRow('SELECT * FROM '._DB_PREFIX_.'currency WHERE id_currency = '.(int)$this->context->cart->id_currency, true, false); $moabg_cgroups = Customer::getGroupsStatic($this->context->cart->id_customer); if (empty($moabg_cgroups)) { $minimal_purchase = (float)Configuration::get('PS_PURCHASE_MINIMUM')*(float)$query['conversion_rate']; $minimal_purchase = (float)number_format((float)$minimal_purchase, 2, ',', ''); } else { $arr = array(); foreach ($moabg_cgroups as $field) { $query2 = Db::getInstance()->getRow('SELECT * FROM '._DB_PREFIX_.'moabg WHERE customer_group = '.(int)$field, true, false); if (empty($query2)) $arr[] = Configuration::get('PS_PURCHASE_MINIMUM'); else $arr[] = $query2['amount']; } $minimal_purchase = (float)min($arr)*(float)$query['conversion_rate']; $minimal_purchase = (float)number_format((float)$minimal_purchase, 2, ',', ''); } if ($this->context->cart->getOrderTotal(false, Cart::ONLY_PRODUCTS) < $minimal_purchase && $this->step > 0) { $_GET['step'] = $this->step = 0; $this->errors[] = sprintf( Tools::displayError('A minimum purchase total of %1s (tax excl.) is required to validate your order, current purchase total is %2s (tax excl.).'), Tools::displayPrice($minimal_purchase, $currency), Tools::displayPrice($this->context->cart->getOrderTotal(false, Cart::ONLY_PRODUCTS), $currency) ); } if (!$this->context->customer->isLogged(true) && in_array($this->step, array(1, 2, 3))) { $params = array(); if ($this->step) { $params['step'] = (int)$this->step; } if ($multi = (int)Tools::getValue('multi-shipping')) { $params['multi-shipping'] = $multi; } $back_url = $this->context->link->getPageLink('order', true, (int)$this->context->language->id, $params); $params = array('back' => $back_url); if ($multi) { $params['multi-shipping'] = $multi; } if ($guest = (int)Configuration::get('PS_GUEST_CHECKOUT_ENABLED')) { $params['display_guest_checkout'] = $guest; } Tools::redirect($this->context->link->getPageLink('authentication', true, (int)$this->context->language->id, $params)); } if (Tools::getValue('multi-shipping') == 1) { $this->context->smarty->assign('multi_shipping', true); } else { $this->context->smarty->assign('multi_shipping', false); } if ($this->context->customer->id) { $this->context->smarty->assign('address_list', $this->context->customer->getAddresses($this->context->language->id)); } else { $this->context->smarty->assign('address_list', array()); } } } If i make a call to var_dump($minimal_purchase) just before the if statement that checking if the ordered amount is less than the minimal amount required, it show me the good value from the db (140). But as you can see on the screenshot below, Prestashop continue after that to set the variable again with the default value from the configuration table (50) : It seem like my overriden file is read and executed but just after the original file is executed too :/ It's the only one explanation i founded for the moment. Please can anyone help me ? Thanks in advance ^^ Link to comment Share on other sites More sharing options...
bellini13 Posted January 18, 2016 Share Posted January 18, 2016 ModuleFrontController also appears to change this value. You may need to use a file search tool to locate any other places that touch this variable public function initContent() { if (Tools::isSubmit('module') && Tools::getValue('controller') == 'payment') { $currency = Currency::getCurrency((int)$this->context->cart->id_currency); $orderTotal = $this->context->cart->getOrderTotal(); $minimal_purchase = Tools::convertPrice((float)Configuration::get('PS_PURCHASE_MINIMUM'), $currency); if ($this->context->cart->getOrderTotal(false, Cart::ONLY_PRODUCTS) < $minimal_purchase) { Tools::redirect('index.php?controller=order&step=1'); } } parent::initContent(); } Link to comment Share on other sites More sharing options...
GT ITECH Posted January 18, 2016 Author Share Posted January 18, 2016 (edited) Ohhhhhh i will see that, thank you edit : There is no $minimal_purchase in ModuleFrontController for me (Prestashop 1.6.1.1), and i don't find any other script that set this variable except the original OrderController. The strang thing is if i manually comment the $minimal_purchase definition in the original core controller file and use my module, it seems all work fine and Prestashop use as 100% my override file. It's just bad because it's for a module and i can't tell to people to manually comment a line on their OrderController.php :/ Strangely, it work fine with no problem with the OrderOpcController (one page checkout). The unique difference between theses two files is where is the $minimal_purchase definition. For OrderOpcController its in the _getPaymentMethods() function. For the OrderController its in the init() function Edited January 18, 2016 by GT ITECH (see edit history) Link to comment Share on other sites More sharing options...
GT ITECH Posted January 20, 2016 Author Share Posted January 20, 2016 Up please it's important for me :/ Link to comment Share on other sites More sharing options...
GT ITECH Posted January 26, 2016 Author Share Posted January 26, 2016 Please i really really need this to work :/ Link to comment Share on other sites More sharing options...
Eusebio100 Posted September 26, 2018 Share Posted September 26, 2018 Hello, I have a similar problem, did you find a solution for this? Link to comment Share on other sites More sharing options...
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now