diff --git a/classes/Dispatcher.php b/classes/Dispatcher.php index 1bdc1c15f..a16eb9f54 100644 --- a/classes/Dispatcher.php +++ b/classes/Dispatcher.php @@ -108,10 +108,10 @@ class DispatcherCore ), 'module' => array( 'controller' => 'module', - 'rule' => 'module/{module}/{action}', + 'rule' => 'module/{module}/{process}', 'keywords' => array( 'module' => array('regexp' => '[a-zA-Z0-9_-]+', 'param' => 'module'), - 'action' => array('regexp' => '[a-zA-Z0-9_-]+', 'param' => 'action'), + 'process' => array('regexp' => '[a-zA-Z0-9_-]+', 'param' => 'process'), ), ), ); @@ -149,7 +149,7 @@ class DispatcherCore /** * @var string Controller to use if found controller doesn't exist */ - protected $controller_not_found = 'PageNotFound'; + protected $controller_not_found = 'pagenotfound'; /** * @var array List of controllers where are stored controllers @@ -286,6 +286,20 @@ class DispatcherCore if (!isset($controllers[$this->controller])) $this->controller = strtolower($this->controller_not_found); $controller_class = $controllers[$this->controller]; + + // If module controller is called, we have to call the right module controller + if ($controller_class == 'ModuleController') + { + $module_name = Tools::getValue('module'); + $module = Module::getInstanceByName($module_name); + if (Validate::isLoadedObject($module) && $module->active && file_exists(_PS_MODULE_DIR_.$module_name.'/'.$module_name.'Controller.php')) + { + include_once(_PS_MODULE_DIR_.$module_name.'/'.$module_name.'Controller.php'); + $controller_class = 'Module'.$module_name.'Controller'; + } + else + $controller_class = $controllers[$this->controller_not_found]; + } } // BO dispatch else diff --git a/classes/FrontController.php b/classes/FrontController.php index a34a2b09d..1b39e5590 100755 --- a/classes/FrontController.php +++ b/classes/FrontController.php @@ -464,16 +464,11 @@ class FrontControllerCore extends Controller $this->context->smarty->assign('css_files', $this->css_files); $this->context->smarty->assign('js_files', array_unique($this->js_files)); - $this->context->smarty->assign(array( 'errors' => $this->errors, 'display_header' => $this->display_header, 'display_footer' => $this->display_footer, - 'template' => $this->context->smarty->fetch($this->template), )); - - - if (Tools::isSubmit('live_edit')) { @@ -482,14 +477,18 @@ class FrontControllerCore extends Controller // handle 1.4 theme (with layout.tpl missing) if (file_exists(_PS_THEME_DIR_.'layout.tpl')) + { + if ($this->template) + $this->context->smarty->assign('template', $this->context->smarty->fetch($this->template)); $this->context->smarty->display(_PS_THEME_DIR_.'layout.tpl'); + } else { // BEGIN - 1.4 retrocompatibility - will be removed in 1.6 Tools::displayAsDeprecated('layout.tpl is missing in your theme directory'); if ($this->display_header) $this->context->smarty->display(_PS_THEME_DIR_.'header.tpl'); - + if ($this->template) $this->context->smarty->display($this->template); diff --git a/classes/Link.php b/classes/Link.php index 929214a61..10b65fee7 100644 --- a/classes/Link.php +++ b/classes/Link.php @@ -266,11 +266,11 @@ class LinkCore * * @since 1.5.0 * @param string $module Module name - * @param string $action Action name + * @param string $process Action name * @param int $id_lang * @return string */ - public function getModuleLink($module, $action, $ssl = false, $id_lang = null) + public function getModuleLink($module, $process, $ssl = false, $id_lang = null) { $base = (($ssl && Configuration::get('PS_SSL_ENABLED')) ? _PS_BASE_URL_SSL_ : _PS_BASE_URL_); $url = $base.__PS_BASE_URI__.$this->getLangLink($id_lang); @@ -280,7 +280,7 @@ class LinkCore // Set available keywords $params = array(); $params['module'] = $module; - $params['action'] = $action; + $params['process'] = $process; return $url.Dispatcher::getInstance()->createUrl('module', $params, $this->allow); } diff --git a/classes/Module.php b/classes/Module.php index e8194cef9..ed996ecce 100644 --- a/classes/Module.php +++ b/classes/Module.php @@ -1588,16 +1588,35 @@ abstract class ModuleCore /** * Get module errors + * * @since 1.5.0 * @return array errors */ - public function getErrors() { return $this->_errors; } + public function getErrors() + { + return $this->_errors; + } /** * Get module messages confirmation - * @since 1.5.1 + * + * @since 1.5.0 * @return array conf */ - public function getConfirmations() { return $this->_confirmations; } + public function getConfirmations() + { + return $this->_confirmations; + } + + /** + * Get uri path for module + * + * @since 1.5.0 + * @return string + */ + public function getPathUri() + { + return $this->_path; + } } diff --git a/controllers/front/ModuleController.php b/controllers/front/ModuleController.php index f4a8d9268..eeb2079ab 100644 --- a/controllers/front/ModuleController.php +++ b/controllers/front/ModuleController.php @@ -26,38 +26,32 @@ */ /** - * The module controller call a module action. Module action method need to have the name : - * public function actionMyAction(FrontController $controller) - * * @since 1.5.0 */ class ModuleControllerCore extends FrontController { /** - * Assign template vars related to page content - * @see FrontController::initContent() + * @var Module */ - public function initContent() + public $module; + + public function __construct() { - // Check module existence - $name = Tools::getValue('module'); - if (!Validate::isModuleName($name) || !file_exists(_PS_MODULE_DIR_.$name)) + $this->module = Module::getInstanceByName(Tools::getValue('module')); + if (!$this->module->active) Tools::redirect('index'); + $this->process = Tools::getValue('process'); - $module = Module::getInstanceByName($name); - if (!$module->active) - Tools::redirect('index'); + parent::__construct(); + } - // Trigger module action - $action = Tools::getValue('action'); - $method = 'action'.$action; - - $this->context->smarty->assign('page_name', 'module-'.$name.'-'.$action); - - if ($action && method_exists($module, $method)) - $this->setTemplate($module->$method()); - else - die('Module action not found'); - parent::initContent(); + /** + * Assign module template + * + * @param string $template + */ + public function setTemplate($template) + { + $this->template = $this->module->getTemplatePath($template); } } diff --git a/modules/bankwire/bankwire.php b/modules/bankwire/bankwire.php index 47dd7eb08..dc661dead 100644 --- a/modules/bankwire/bankwire.php +++ b/modules/bankwire/bankwire.php @@ -162,31 +162,11 @@ class BankWire extends PaymentModule return $this->_html; } - public function execPayment($cart) - { - if (!$this->active) - return ; - if (!$this->_checkCurrency($cart)) - Tools::redirect('index.php?controller=order'); - - - $this->context->smarty->assign(array( - 'nbProducts' => $cart->nbProducts(), - 'cust_currency' => $cart->id_currency, - 'currencies' => $this->getCurrency((int)$cart->id_currency), - 'total' => $cart->getOrderTotal(true, Cart::BOTH), - 'this_path' => $this->_path, - 'this_path_ssl' => Tools::getShopDomainSsl(true, true).__PS_BASE_URI__.'modules/'.$this->name.'/' - )); - - return $this->display(__FILE__, 'payment_execution.tpl'); - } - public function hookPayment($params) { if (!$this->active) return ; - if (!$this->_checkCurrency($params['cart'])) + if (!$this->checkCurrency($params['cart'])) return ; @@ -221,14 +201,13 @@ class BankWire extends PaymentModule return $this->display(__FILE__, 'payment_return.tpl'); } - private function _checkCurrency($cart) + public function checkCurrency($cart) { - $currency_order = new Currency((int)($cart->id_currency)); - $currencies_module = $this->getCurrency((int)$cart->id_currency); - $currency_default = Configuration::get('PS_CURRENCY_DEFAULT'); - + $currency_order = new Currency($cart->id_currency); + $currencies_module = $this->getCurrency($cart->id_currency); + if (is_array($currencies_module)) - foreach ($currencies_module AS $currency_module) + foreach ($currencies_module as $currency_module) if ($currency_order->id == $currency_module['id_currency']) return true; return false; diff --git a/modules/bankwire/bankwireController.php b/modules/bankwire/bankwireController.php new file mode 100644 index 000000000..c3a0a97eb --- /dev/null +++ b/modules/bankwire/bankwireController.php @@ -0,0 +1,109 @@ + +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision$ +* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +/** + * @since 1.5.0 + */ +class ModuleBankwireController extends ModuleController +{ + /** + * @see FrontController::postProcess() + */ + public function postProcess() + { + if ($this->process == 'validation') + $this->processValidation(); + } + + /** + * Validate bankwire payment + */ + public function processValidation() + { + $cart = $this->context->cart; + if ($cart->id_customer == 0 || $cart->id_address_delivery == 0 || $cart->id_address_invoice == 0 || !$this->module->active) + Tools::redirect('index.php?controller=order&step=1'); + + // Check that this payment option is still available in case the customer changed his address just before the end of the checkout process + $authorized = false; + foreach (Module::getPaymentModules() as $module) + if ($module['name'] == 'bankwire') + { + $authorized = true; + break; + } + if (!$authorized) + die(Tools::displayError('This payment method is not available.')); + + $customer = new Customer($cart->id_customer); + if (!Validate::isLoadedObject($customer)) + Tools::redirect('index.php?controller=order&step=1'); + + $currency = Tools::getValue('currency_payement', false) ? new Currency(Tools::getValue('currency_payement')) : Context::getContext()->currency; + $total = (float)$cart->getOrderTotal(true, Cart::BOTH); + $mailVars = array( + '{bankwire_owner}' => Configuration::get('BANK_WIRE_OWNER'), + '{bankwire_details}' => nl2br(Configuration::get('BANK_WIRE_DETAILS')), + '{bankwire_address}' => nl2br(Configuration::get('BANK_WIRE_ADDRESS')) + ); + + $this->module->validateOrder($cart->id, Configuration::get('PS_OS_BANKWIRE'), $total, $this->module->displayName, NULL, $mailVars, (int)$currency->id, false, $customer->secure_key); + Tools::redirect('index.php?controller=order-confirmation&id_cart='.$cart->id.'&id_module='.$this->module->id.'&id_order='.$this->module->currentOrder.'&key='.$customer->secure_key); + } + + /** + * @see FrontController::initContent() + */ + public function initContent() + { + parent::initContent(); + + if ($this->process == 'payment') + $this->assignPaymentExecution(); + } + + /** + * Assign bankwire payment template + */ + public function assignPaymentExecution() + { + $cart = $this->context->cart; + if (!$this->module->checkCurrency($cart)) + Tools::redirect('index.php?controller=order'); + + $this->context->smarty->assign(array( + 'nbProducts' => $cart->nbProducts(), + 'cust_currency' => $cart->id_currency, + 'currencies' => $this->module->getCurrency((int)$cart->id_currency), + 'total' => $cart->getOrderTotal(true, Cart::BOTH), + 'this_path' => $this->module->getPathUri(), + 'this_path_ssl' => Tools::getShopDomainSsl(true, true).__PS_BASE_URI__.'modules/'.$this->module->name.'/' + )); + + $this->setTemplate('payment_execution.tpl'); + } +} \ No newline at end of file diff --git a/modules/bankwire/payment.php b/modules/bankwire/payment.php index d528f9943..5085b12cd 100644 --- a/modules/bankwire/payment.php +++ b/modules/bankwire/payment.php @@ -24,18 +24,18 @@ * @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) * International Registered Trademark & Property of PrestaShop SA */ +/** + * @deprecated This file is deprecated, use moduleController instead + */ /* SSL Management */ $useSSL = true; -include(dirname(__FILE__).'/../../config/config.inc.php'); -include(dirname(__FILE__).'/../../header.php'); -include(dirname(__FILE__).'/bankwire.php'); +require('../../config/config.inc.php'); +Tools::displayFileAsDeprecated(); -if (!Context::getContext()->customer->isLogged(true)) - Tools::redirect('index.php?controller=authentication&back=order.php'); -$bankwire = new BankWire(); -echo $bankwire->execPayment($cart); - -include_once(dirname(__FILE__).'/../../footer.php'); +// init front controller in order to use Tools::redirect +$controller = new FrontController(); +$controller->init(); +Tools::redirect('index.php?controller=module&module=bankwire&process=payment'); \ No newline at end of file diff --git a/modules/bankwire/payment.tpl b/modules/bankwire/payment.tpl index 1f1be2df8..bdadec387 100644 --- a/modules/bankwire/payment.tpl +++ b/modules/bankwire/payment.tpl @@ -25,7 +25,7 @@ *}

- + {l s='Pay by bank wire' mod='bankwire'} {l s='Pay by bank wire (order process will be longer)' mod='bankwire'} diff --git a/modules/cheque/cheque.php b/modules/cheque/cheque.php index 74da5549c..4455a6684 100644 --- a/modules/cheque/cheque.php +++ b/modules/cheque/cheque.php @@ -147,16 +147,11 @@ class Cheque extends PaymentModule return $this->_html; } - public function execPayment($cart) - { - return $this->actionPayment(true); - } - public function hookPayment($params) { if (!$this->active) return ; - if (!$this->_checkCurrency($params['cart'])) + if (!$this->checkCurrency($params['cart'])) return ; $this->context->smarty->assign(array( @@ -189,7 +184,7 @@ class Cheque extends PaymentModule return $this->display(__FILE__, 'payment_return.tpl'); } - private function _checkCurrency($cart) + public function checkCurrency($cart) { $currency_order = new Currency((int)($cart->id_currency)); $currencies_module = $this->getCurrency((int)$cart->id_currency); @@ -200,75 +195,4 @@ class Cheque extends PaymentModule return true; return false; } - - /** - * This action display payment form - * - * @param bool $direct_call For retrocompatibility - */ - public function actionPayment($direct_call = false) - { - if (!$this->active) - return ; - - $cart = $this->context->cart; - if (!$this->_checkCurrency($cart)) - Tools::redirect('index.php?controller=order'); - $this->context->smarty->assign(array( - 'nbProducts' => $cart->nbProducts(), - 'cust_currency' => $cart->id_currency, - 'currencies' => $this->getCurrency((int)$cart->id_currency), - 'total' => $cart->getOrderTotal(true, Cart::BOTH), - 'isoCode' => $this->context->language->iso_code, - 'chequeName' => $this->chequeName, - 'chequeAddress' => Tools::nl2br($this->address), - 'cheque_path' => $this->_path, - 'cheque_path_ssl' => Tools::getShopDomainSsl(true, true).__PS_BASE_URI__.'modules/'.$this->name.'/' - )); - - if (!$direct_call) - return $this->getTemplatePath('payment_execution.tpl'); - else - // For retrocompatibility - return $this->display(__FILE__, 'payment_execution.tpl'); - } - - /** - * This action validate the payment - */ - public function actionValidation($direct_call = false) - { - $cart = $this->context->cart; - - if ($cart->id_customer == 0 || $cart->id_address_delivery == 0 || $cart->id_address_invoice == 0 || !$this->active) - Tools::redirect('index.php?controller=order&step=1'); - - // Check that this payment option is still available in case the customer changed his address just before the end of the checkout process - $authorized = false; - foreach (Module::getPaymentModules() as $module) - if ($module['name'] == 'cheque') - { - $authorized = true; - break; - } - if (!$authorized) - die(Tools::displayError('This payment method is not available.')); - - $customer = new Customer($cart->id_customer); - - if (!Validate::isLoadedObject($customer)) - Tools::redirect('index.php?controller=order&step=1'); - - $currency = Tools::isSubmit('currency_payement') ? new Currency(Tools::getValue('currency_payement')) : $this->context->currency; - $total = (float)$cart->getOrderTotal(true, Cart::BOTH); - - $mailVars = array( - '{cheque_name}' => Configuration::get('CHEQUE_NAME'), - '{cheque_address}' => Configuration::get('CHEQUE_ADDRESS'), - '{cheque_address_html}' => str_replace("\n", '
', Configuration::get('CHEQUE_ADDRESS'))); - - $this->validateOrder((int)$cart->id, Configuration::get('PS_OS_CHEQUE'), $total, $this->displayName, NULL, $mailVars, (int)$currency->id, false, $customer->secure_key); - - Tools::redirect('index.php?controller=order-confirmation&id_cart='.(int)($cart->id).'&id_module='.(int)$this->id.'&id_order='.$this->currentOrder.'&key='.$customer->secure_key); - } } diff --git a/modules/cheque/chequeController.php b/modules/cheque/chequeController.php new file mode 100644 index 000000000..926cb13c2 --- /dev/null +++ b/modules/cheque/chequeController.php @@ -0,0 +1,115 @@ + +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision$ +* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +/** + * @since 1.5.0 + */ +class ModuleChequeController extends ModuleController +{ + /** + * @see FrontController::postProcess() + */ + public function postProcess() + { + if ($this->process == 'validation') + $this->processValidation(); + } + + /** + * Validate cheque payment + */ + public function processValidation() + { + $cart = $this->context->cart; + + if ($cart->id_customer == 0 || $cart->id_address_delivery == 0 || $cart->id_address_invoice == 0 || !$this->module->active) + Tools::redirect('index.php?controller=order&step=1'); + + // Check that this payment option is still available in case the customer changed his address just before the end of the checkout process + $authorized = false; + foreach (Module::getPaymentModules() as $module) + if ($module['name'] == 'cheque') + { + $authorized = true; + break; + } + + if (!$authorized) + die(Tools::displayError('This payment method is not available.')); + + $customer = new Customer($cart->id_customer); + + if (!Validate::isLoadedObject($customer)) + Tools::redirect('index.php?controller=order&step=1'); + + $currency = Tools::isSubmit('currency_payement') ? new Currency(Tools::getValue('currency_payement')) : $this->context->currency; + $total = (float)$cart->getOrderTotal(true, Cart::BOTH); + + $mailVars = array( + '{cheque_name}' => Configuration::get('CHEQUE_NAME'), + '{cheque_address}' => Configuration::get('CHEQUE_ADDRESS'), + '{cheque_address_html}' => str_replace("\n", '
', Configuration::get('CHEQUE_ADDRESS'))); + + $this->module->validateOrder((int)$cart->id, Configuration::get('PS_OS_CHEQUE'), $total, $this->module->displayName, NULL, $mailVars, (int)$currency->id, false, $customer->secure_key); + Tools::redirect('index.php?controller=order-confirmation&id_cart='.(int)$cart->id.'&id_module='.(int)$this->module->id.'&id_order='.$this->module->currentOrder.'&key='.$customer->secure_key); + } + + /** + * @see FrontController::initContent() + */ + public function initContent() + { + parent::initContent(); + + if ($this->process == 'payment') + $this->assignPaymentExecution(); + } + + /** + * Assign cheque payment template + */ + public function assignPaymentExecution() + { + $cart = $this->context->cart; + if (!$this->module->checkCurrency($cart)) + Tools::redirect('index.php?controller=order'); + + $this->context->smarty->assign(array( + 'nbProducts' => $cart->nbProducts(), + 'cust_currency' => $cart->id_currency, + 'currencies' => $this->module->getCurrency((int)$cart->id_currency), + 'total' => $cart->getOrderTotal(true, Cart::BOTH), + 'isoCode' => $this->context->language->iso_code, + 'chequeName' => $this->module->chequeName, + 'chequeAddress' => Tools::nl2br($this->module->address), + 'cheque_path' => $this->module->getPathUri(), + 'cheque_path_ssl' => Tools::getShopDomainSsl(true, true).__PS_BASE_URI__.'modules/'.$this->module->name.'/' + )); + + $this->setTemplate('payment_execution.tpl'); + } +} \ No newline at end of file diff --git a/modules/cheque/payment.php b/modules/cheque/payment.php index f5c391ce5..09c21ff76 100644 --- a/modules/cheque/payment.php +++ b/modules/cheque/payment.php @@ -32,18 +32,11 @@ /* SSL Management */ $useSSL = true; -include(dirname(__FILE__).'/../../config/config.inc.php'); +require('../../config/config.inc.php'); Tools::displayFileAsDeprecated(); -include(dirname(__FILE__).'/../../header.php'); -include(dirname(__FILE__).'/cheque.php'); - -if (!Context::getContext()->customer->isLogged(true)) - Tools::redirect('index.php?controller=authentication&back=order.php'); - -$cheque = new Cheque(); -echo $cheque->execPayment($cart); - -include_once(dirname(__FILE__).'/../../footer.php'); - +// init front controller in order to use Tools::redirect +$controller = new FrontController(); +$controller->init(); +Tools::redirect('index.php?controller=module&module=cheque&process=payment'); \ No newline at end of file