diff --git a/classes/module/ModuleHandler.class.php b/classes/module/ModuleHandler.class.php index 32cdbfad3..2c0ccc5b8 100644 --- a/classes/module/ModuleHandler.class.php +++ b/classes/module/ModuleHandler.class.php @@ -742,6 +742,7 @@ class ModuleHandler extends Handler //for xml response $oModule->setError(-1); $oModule->setMessage($errorMsg); + $oModule->setRedirectUrl($returnUrl); //for html redirect $this->error = $errorMsg; $_SESSION['XE_VALIDATOR_ERROR'] = -1; @@ -807,13 +808,12 @@ class ModuleHandler extends Handler $procResult = $oModule->proc(); $methodList = array('XMLRPC' => 1, 'JSON' => 1, 'JS_CALLBACK' => 1); - if(!$oModule->stop_proc && (!isset($methodList[Context::getRequestMethod()]) || isset($_POST['_rx_ajax_form']))) + if(!$oModule->stop_proc && !isset($methodList[Context::getRequestMethod()]) && !isset($_POST['_rx_ajax_form'])) { $error = $oModule->getError(); $message = $oModule->getMessage(); $messageType = $oModule->getMessageType(); $redirectUrl = $oModule->getRedirectUrl(); - if(!$procResult) { $this->error = $message; @@ -823,7 +823,6 @@ class ModuleHandler extends Handler } self::_setInputValueToSession(); } - if($error != 0) { $_SESSION['XE_VALIDATOR_ERROR'] = $error; @@ -837,9 +836,14 @@ class ModuleHandler extends Handler $_SESSION['XE_VALIDATOR_MESSAGE'] = $message; $_SESSION['XE_VALIDATOR_MESSAGE_TYPE'] = $messageType; } - if(Context::get('xeVirtualRequestMethod') != 'xml' && $redirectUrl) + if(Context::get('xeVirtualRequestMethod') === 'xml') + { + $oModule->setRedirectUrl(null); + } + elseif($redirectUrl) { $_SESSION['XE_VALIDATOR_RETURN_URL'] = $redirectUrl; + $oModule->setRedirectUrl($redirectUrl); } } @@ -943,37 +947,44 @@ class ModuleHandler extends Handler // Handle iframe form submissions. if(isset($_POST['_rx_target_iframe']) && starts_with('_rx_temp_', $_POST['_rx_target_iframe'])) { - if($this->error && $this->error !== 'success') + $script = ''; + if(!$oModule->toBool()) { - ob_end_clean(); - echo sprintf('', json_encode($this->error), json_encode($_POST['_rx_target_iframe'])); - return; + $script .= sprintf('window.parent.alert(%s);', json_encode($oModule->getMessage())); } - if($_SESSION['XE_VALIDATOR_RETURN_URL']) + else { - ob_end_clean(); - echo sprintf('', json_encode($_SESSION['XE_VALIDATOR_RETURN_URL'])); - return; + if($oModule->getMessage() && $oModule->getMessage() !== 'success') + { + $script .= sprintf('window.parent.rhymix_alert(%s, %s);', json_encode($oModule->getMessage()), json_encode($oModule->getRedirectUrl())); + } + if($oModule->getRedirectUrl()) + { + $script .= sprintf('window.parent.redirect(%s);', json_encode($oModule->getRedirectUrl())); + } } + ob_end_clean(); + echo sprintf('', $script, json_encode($_POST['_rx_target_iframe'])); + return; } // Handle redirects. - if($_SESSION['XE_VALIDATOR_RETURN_URL']) + if($oModule->getRedirectUrl()) { if ($_SESSION['is_new_session']) { ob_end_clean(); - echo sprintf('', escape($_SESSION['XE_VALIDATOR_RETURN_URL'])); + echo sprintf('', escape($oModule->getRedirectUrl())); return; } else { ob_end_clean(); - header('location: ' . $_SESSION['XE_VALIDATOR_RETURN_URL']); + header('location: ' . $oModule->getRedirectUrl()); return; } } - + // If error occurred, handle it if($this->error) { diff --git a/common/js/xml_handler.js b/common/js/xml_handler.js index 3e3a08f3f..5515d92a3 100644 --- a/common/js/xml_handler.js +++ b/common/js/xml_handler.js @@ -377,10 +377,9 @@ callback_success = window[callback_success]; } else { callback_success = function(data) { - if (data.message === 'success') { - return; + if (data.message && data.message !== 'success') { + rhymix_alert(data.message, data.redirect_url); } - rhymix_alert(data.message, data.redirect_url); if (data.redirect_url) { redirect(data.redirect_url); } @@ -392,6 +391,13 @@ } else { callback_error = null; } + // Set _rx_ajax_form flag + if (!form.find('input[name=_rx_ajax_form]').size()) { + form.append(''); + setTimeout(function() { + form.find('input[name=_rx_ajax_form]').remove(); + }, 1000); + } // If the form has file uploads, use a hidden iframe to submit. Otherwise use exec_json. var has_files = form.find('input[type=file][name!=Filedata]').size(); if (has_files) { @@ -410,7 +416,7 @@ }, 1000); form.submit(); } else { - window.exec_json('raw', form.serialize() + '&_rx_ajax_form=1', callback_success, callback_error); + window.exec_json('raw', form.serialize(), callback_success, callback_error); } });