mirror of
https://github.com/yiisoft/yii2.git
synced 2025-11-21 00:54:53 +08:00
Support ajax redirection.
This commit is contained in:
@@ -163,12 +163,22 @@ yii = (function ($) {
|
||||
init: function () {
|
||||
var $document = $(document);
|
||||
|
||||
// automatically send CSRF token for all AJAX requests
|
||||
$.ajaxPrefilter(function (options, originalOptions, xhr) {
|
||||
if (!options.crossDomain && pub.getCsrfVar()) {
|
||||
xhr.setRequestHeader('X-CSRF-TOKEN', pub.getCsrfToken());
|
||||
xhr.setRequestHeader('X-CSRF-Token', pub.getCsrfToken());
|
||||
}
|
||||
});
|
||||
|
||||
// handle AJAX redirection
|
||||
$document.ajaxComplete(function (event, xhr, settings) {
|
||||
var url = xhr.getResponseHeader('X-Redirect');
|
||||
if (url) {
|
||||
window.location = url;
|
||||
}
|
||||
});
|
||||
|
||||
// handle data-confirm and data-method for clickable elements
|
||||
$document.on('click.yii', pub.clickableSelector, function (event) {
|
||||
var $this = $(this);
|
||||
if (pub.allowAction($this)) {
|
||||
@@ -178,6 +188,8 @@ yii = (function ($) {
|
||||
return false;
|
||||
}
|
||||
});
|
||||
|
||||
// handle data-confirm and data-method for changeable elements
|
||||
$document.on('change.yii', pub.changeableSelector, function (event) {
|
||||
var $this = $(this);
|
||||
if (pub.allowAction($this)) {
|
||||
|
||||
@@ -126,8 +126,7 @@ class Controller extends \yii\base\Controller
|
||||
* Any relative URL will be converted into an absolute one by prepending it with the host info
|
||||
* of the current request.
|
||||
*
|
||||
* @param integer $statusCode the HTTP status code. If null, it will use 302
|
||||
* for normal requests, and [[ajaxRedirectCode]] for AJAX requests.
|
||||
* @param integer $statusCode the HTTP status code. If null, it will use 302.
|
||||
* See [[http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html]]
|
||||
* for details about HTTP status code
|
||||
* @return Response the current response object
|
||||
|
||||
@@ -73,7 +73,7 @@ class Request extends \yii\base\Request
|
||||
/**
|
||||
* The name of the HTTP header for sending CSRF token.
|
||||
*/
|
||||
const CSRF_HEADER = 'X-CSRF-TOKEN';
|
||||
const CSRF_HEADER = 'X-CSRF-Token';
|
||||
|
||||
/**
|
||||
* @var boolean whether to enable CSRF (Cross-Site Request Forgery) validation. Defaults to true.
|
||||
|
||||
@@ -111,13 +111,6 @@ class Response extends \yii\base\Response
|
||||
* the value of [[Application::charset]].
|
||||
*/
|
||||
public $charset;
|
||||
/**
|
||||
* @var integer the HTTP status code that should be used when redirecting in AJAX mode.
|
||||
* This is used by [[redirect()]]. A 2xx code should normally be used for this purpose
|
||||
* so that the AJAX handler will treat the response as a success.
|
||||
* @see redirect
|
||||
*/
|
||||
public $ajaxRedirectCode = 278;
|
||||
/**
|
||||
* @var string
|
||||
*/
|
||||
@@ -565,17 +558,22 @@ class Response extends \yii\base\Response
|
||||
|
||||
/**
|
||||
* Redirects the browser to the specified URL.
|
||||
*
|
||||
* This method will send out a "Location" header to achieve the redirection.
|
||||
*
|
||||
* In AJAX mode, this normally will not work as expected unless there are some
|
||||
* client-side JavaScript code handling the redirection. To help achieve this goal,
|
||||
* this method will use [[ajaxRedirectCode]] as the HTTP status code when performing
|
||||
* redirection in AJAX mode. The following JavaScript code may be used on the client
|
||||
* side to handle the redirection response:
|
||||
* this method will send out a "X-Redirect" header instead of "Location".
|
||||
*
|
||||
* If you use the "yii" JavaScript module, it will handle the AJAX redirection as
|
||||
* described above. Otherwise, you should write the following JavaScript code to
|
||||
* handle the redirection:
|
||||
*
|
||||
* ~~~
|
||||
* $(document).ajaxSuccess(function(event, xhr, settings) {
|
||||
* if (xhr.status == 278) {
|
||||
* window.location = xhr.getResponseHeader('Location');
|
||||
* $document.ajaxComplete(function (event, xhr, settings) {
|
||||
* var url = xhr.getResponseHeader('X-Redirect');
|
||||
* if (url) {
|
||||
* window.location = url;
|
||||
* }
|
||||
* });
|
||||
* ~~~
|
||||
@@ -597,8 +595,7 @@ class Response extends \yii\base\Response
|
||||
* Any relative URL will be converted into an absolute one by prepending it with the host info
|
||||
* of the current request.
|
||||
*
|
||||
* @param integer $statusCode the HTTP status code. If null, it will use 302
|
||||
* for normal requests, and [[ajaxRedirectCode]] for AJAX requests.
|
||||
* @param integer $statusCode the HTTP status code. If null, it will use 302.
|
||||
* See [[http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html]]
|
||||
* for details about HTTP status code
|
||||
* @return Response the response object itself
|
||||
@@ -613,11 +610,14 @@ class Response extends \yii\base\Response
|
||||
if (strpos($url, '/') === 0 && strpos($url, '//') !== 0) {
|
||||
$url = Yii::$app->getRequest()->getHostInfo() . $url;
|
||||
}
|
||||
if ($statusCode === null) {
|
||||
$statusCode = Yii::$app->getRequest()->getIsAjax() ? $this->ajaxRedirectCode : 302;
|
||||
|
||||
if (Yii::$app->getRequest()->getIsAjax()) {
|
||||
$this->getHeaders()->set('X-Redirect', $url);
|
||||
} else {
|
||||
$this->getHeaders()->set('Location', $url);
|
||||
}
|
||||
$this->getHeaders()->set('Location', $url);
|
||||
$this->setStatusCode($statusCode);
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user