mirror of
https://github.com/silverstripe/silverstripe-framework
synced 2024-10-22 14:05:37 +02:00
API CHANGE: Decoupled ErrorPage::response_for() from the request and updated it so it will only return a response if an appropriate error page can be found.
MINOR: Updated ContentController->httpError() to use Controller->httpError() if there is no error page. From: Andrew Short <andrewjshort@gmail.com> git-svn-id: svn://svn.silverstripe.com/silverstripe/open/modules/sapphire/trunk@88507 467b73ca-7a2a-4603-9d3b-597d59a354a9
This commit is contained in:
parent
53450e1221
commit
06fbb96f88
@ -115,6 +115,54 @@ class ContentController extends Controller {
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This acts the same as {@link Controller::handleRequest()}, but if an action cannot be found this will attempt to
|
||||||
|
* fall over to a child controller in order to provide functionality for nested URLs.
|
||||||
|
*
|
||||||
|
* @return HTTPResponse
|
||||||
|
*/
|
||||||
|
public function handleRequest(HTTPRequest $request) {
|
||||||
|
$child = null;
|
||||||
|
$action = $request->param('Action');
|
||||||
|
|
||||||
|
// If nested URLs are enabled, and there is no action handler for the current request then attempt to pass
|
||||||
|
// control to a child controller. This allows for the creation of chains of controllers which correspond to a
|
||||||
|
// nested URL.
|
||||||
|
if($action && SiteTree::nested_urls() && !$this->hasAction($action)) {
|
||||||
|
Translatable::disable_locale_filter();
|
||||||
|
|
||||||
|
$child = DataObject::get_one('SiteTree', sprintf (
|
||||||
|
"\"ParentID\" = %s AND \"URLSegment\" = '%s'", $this->ID, Convert::raw2sql($action)
|
||||||
|
));
|
||||||
|
|
||||||
|
Translatable::enable_locale_filter();
|
||||||
|
}
|
||||||
|
|
||||||
|
if($child) {
|
||||||
|
$request->shiftAllParams();
|
||||||
|
$request->shift();
|
||||||
|
|
||||||
|
$response = ModelAsController::controller_for($child)->handleRequest($request);
|
||||||
|
} else {
|
||||||
|
Director::set_current_page($this->data());
|
||||||
|
$response = parent::handleRequest($request);
|
||||||
|
Director::set_current_page(null);
|
||||||
|
}
|
||||||
|
|
||||||
|
return $response;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @uses ErrorPage::response_for()
|
||||||
|
*/
|
||||||
|
public function httpError($code, $message = null) {
|
||||||
|
if($this->request->isMedia() || !$response = ErrorPage::response_for($code)) {
|
||||||
|
parent::httpError($code, $message);
|
||||||
|
} else {
|
||||||
|
throw new HTTPResponse_Exception($response);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Handles widgets attached to a page through one or more {@link WidgetArea} elements.
|
* Handles widgets attached to a page through one or more {@link WidgetArea} elements.
|
||||||
* Iterated through each $has_one relation with a {@link WidgetArea}
|
* Iterated through each $has_one relation with a {@link WidgetArea}
|
||||||
@ -161,51 +209,6 @@ class ContentController extends Controller {
|
|||||||
return new $controllerClass($widget);
|
return new $controllerClass($widget);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* This acts the same as {@link Controller::handleRequest()}, but if an action cannot be found this will attempt to
|
|
||||||
* fall over to a child controller in order to provide functionality for nested URLs.
|
|
||||||
*
|
|
||||||
* @return HTTPResponse
|
|
||||||
*/
|
|
||||||
public function handleRequest(HTTPRequest $request) {
|
|
||||||
$child = null;
|
|
||||||
$action = $request->param('Action');
|
|
||||||
|
|
||||||
// If nested URLs are enabled, and there is no action handler for the current request then attempt to pass
|
|
||||||
// control to a child controller. This allows for the creation of chains of controllers which correspond to a
|
|
||||||
// nested URL.
|
|
||||||
if($action && SiteTree::nested_urls() && !$this->hasAction($action)) {
|
|
||||||
Translatable::disable_locale_filter();
|
|
||||||
|
|
||||||
$child = DataObject::get_one('SiteTree', sprintf (
|
|
||||||
"\"ParentID\" = %s AND \"URLSegment\" = '%s'", $this->ID, Convert::raw2sql($action)
|
|
||||||
));
|
|
||||||
|
|
||||||
Translatable::enable_locale_filter();
|
|
||||||
}
|
|
||||||
|
|
||||||
if($child) {
|
|
||||||
$request->shiftAllParams();
|
|
||||||
$request->shift();
|
|
||||||
|
|
||||||
$response = ModelAsController::controller_for($child)->handleRequest($request);
|
|
||||||
} else {
|
|
||||||
Director::set_current_page($this->data());
|
|
||||||
$response = parent::handleRequest($request);
|
|
||||||
Director::set_current_page(null);
|
|
||||||
}
|
|
||||||
|
|
||||||
return $response;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @uses ErrorPage::response_for()
|
|
||||||
* @return HTTPResponse
|
|
||||||
*/
|
|
||||||
public function httpError($code, $message = null) {
|
|
||||||
return ($resp = ErrorPage::response_for($code, $this->request)) ? $resp : parent::httpError($code, $message);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get the project name
|
* Get the project name
|
||||||
*
|
*
|
||||||
|
@ -88,7 +88,7 @@ class ModelAsController extends Controller implements NestedController {
|
|||||||
return $this->response;
|
return $this->response;
|
||||||
}
|
}
|
||||||
|
|
||||||
if($response = ErrorPage::response_for(404, $this->request)) {
|
if($response = ErrorPage::response_for(404)) {
|
||||||
return $response;
|
return $response;
|
||||||
} else {
|
} else {
|
||||||
$this->httpError(404, 'The requested page could not be found.');
|
$this->httpError(404, 'The requested page could not be found.');
|
||||||
|
@ -25,19 +25,18 @@ class ErrorPage extends Page {
|
|||||||
protected static $static_filepath = ASSETS_PATH;
|
protected static $static_filepath = ASSETS_PATH;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get a {@link HTTPResponse} that is suitable for responding to a reques that has thrown a specific error code.
|
* Get a {@link HTTPResponse} to response to a HTTP error code if an {@link ErrorPage} for that code is present.
|
||||||
*
|
*
|
||||||
* @param int $statusCode The HTTP error code.
|
* @param int $statusCode
|
||||||
* @param HTTPRequest $request The request object that triggered the error.
|
|
||||||
* @return HTTPResponse
|
* @return HTTPResponse
|
||||||
*/
|
*/
|
||||||
public static function response_for($statusCode, HTTPRequest $request = null) {
|
public static function response_for($statusCode) {
|
||||||
$errorPage = null;
|
// first attempt to dynamically generate the error page
|
||||||
|
if($errorPage = DataObject::get_one('ErrorPage', "\"ErrorCode\" = $statusCode")) {
|
||||||
|
return ModelAsController::controller_for($errorPage)->handleRequest(new HTTPRequest('GET', ''));
|
||||||
|
}
|
||||||
|
|
||||||
// First attempt to dynamically generate the error page, then fall back on using a cached version.
|
// then fall back on a cached version
|
||||||
if (
|
|
||||||
(!$request || !$request->isMedia()) && !$errorPage = DataObject::get_one('ErrorPage', "\"ErrorCode\" = $statusCode")
|
|
||||||
) {
|
|
||||||
$cachedPath = self::get_filepath_for_errorcode($statusCode, Translatable::get_current_locale());
|
$cachedPath = self::get_filepath_for_errorcode($statusCode, Translatable::get_current_locale());
|
||||||
|
|
||||||
if(file_exists($cachedPath)) {
|
if(file_exists($cachedPath)) {
|
||||||
@ -50,20 +49,6 @@ class ErrorPage extends Page {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// If the request is for a simple media type, or there was no matching dynamic or cached error page just return
|
|
||||||
// a simple error string to avoid clogging up server resources.
|
|
||||||
if(!$errorPage) {
|
|
||||||
$response = new HTTPResponse();
|
|
||||||
|
|
||||||
$response->setStatusCode($statusCode);
|
|
||||||
$response->setBody(sprintf('Error %s: %s', $response->getStatusCode(), $response->getStatusDescription()));
|
|
||||||
|
|
||||||
return $response;
|
|
||||||
}
|
|
||||||
|
|
||||||
return ModelAsController::controller_for($errorPage)->handleRequest(new HTTPRequest('GET', ''));
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Ensures that there is always a 404 page
|
* Ensures that there is always a 404 page
|
||||||
* by checking if there's an instance of
|
* by checking if there's an instance of
|
||||||
|
Loading…
Reference in New Issue
Block a user