2007-07-19 12:40:28 +02:00
< ? php
/**
* ErrorPage holds the content for the page of an error response .
2008-10-01 16:57:06 +02:00
* Renders the page on each publish action into a static HTML file
* within the assets directory , after the naming convention
* / assets / error -< statuscode >. html .
* This enables us to show errors even if PHP experiences a recoverable error .
* ErrorPages
2008-10-01 16:43:43 +02:00
*
2008-10-19 00:31:04 +02:00
* @ see Debug :: friendlyError ()
*
2008-02-25 03:10:37 +01:00
* @ package cms
2007-07-19 12:40:28 +02:00
*/
class ErrorPage extends Page {
2007-09-15 01:21:35 +02:00
2007-07-19 12:40:28 +02:00
static $db = array (
" ErrorCode " => " Int " ,
);
2007-09-15 01:21:35 +02:00
2007-07-19 12:40:28 +02:00
static $defaults = array (
" ShowInMenus " => 0 ,
2008-08-20 06:48:44 +02:00
" ShowInSearch " => 0
2007-07-19 12:40:28 +02:00
);
2009-01-19 02:25:23 +01:00
protected static $static_filepath = ASSETS_PATH ;
2007-07-19 12:40:28 +02:00
/**
2008-10-19 00:31:04 +02:00
* Ensures that there is always a 404 page
* by checking if there ' s an instance of
* ErrorPage with a 404 error code . If there
* is not , one is created when the DB is built .
2007-07-19 12:40:28 +02:00
*/
function requireDefaultRecords () {
parent :: requireDefaultRecords ();
2007-08-15 08:38:41 +02:00
2008-11-24 00:28:16 +01:00
if ( ! DataObject :: get_one ( 'ErrorPage' , " \" ErrorCode \" = '404' " )) {
2007-07-19 12:40:28 +02:00
$errorpage = new ErrorPage ();
$errorpage -> ErrorCode = 404 ;
2008-02-25 03:10:37 +01:00
$errorpage -> Title = _t ( 'ErrorPage.DEFAULTERRORPAGETITLE' , 'Page not found' );
2008-10-19 00:31:04 +02:00
$errorpage -> URLSegment = 'page-not-found' ;
2008-02-25 03:10:37 +01:00
$errorpage -> Content = _t ( 'ErrorPage.DEFAULTERRORPAGECONTENT' , '<p>Sorry, it seems you were trying to access a page that doesn\'t exist.</p><p>Please check the spelling of the URL you were trying to access and try again.</p>' );
2008-10-19 00:31:04 +02:00
$errorpage -> Status = 'New page' ;
2007-07-19 12:40:28 +02:00
$errorpage -> write ();
2008-10-19 00:31:04 +02:00
Database :: alteration_message ( '404 page created' , 'created' );
2007-07-19 12:40:28 +02:00
}
}
2007-09-15 01:21:35 +02:00
2007-07-19 12:40:28 +02:00
function getCMSFields () {
$fields = parent :: getCMSFields ();
$fields -> addFieldToTab (
" Root.Content.Main " ,
new DropdownField (
" ErrorCode " ,
2008-11-02 21:04:10 +01:00
$this -> fieldLabel ( 'ErrorCode' ),
2007-07-19 12:40:28 +02:00
array (
2008-02-25 03:10:37 +01:00
400 => _t ( 'ErrorPage.400' , '400 - Bad Request' ),
401 => _t ( 'ErrorPage.401' , '401 - Unauthorized' ),
403 => _t ( 'ErrorPage.403' , '403 - Forbidden' ),
404 => _t ( 'ErrorPage.404' , '404 - Not Found' ),
405 => _t ( 'ErrorPage.405' , '405 - Method Not Allowed' ),
406 => _t ( 'ErrorPage.406' , '406 - Not Acceptable' ),
407 => _t ( 'ErrorPage.407' , '407 - Proxy Authentication Required' ),
408 => _t ( 'ErrorPage.408' , '408 - Request Timeout' ),
409 => _t ( 'ErrorPage.409' , '409 - Conflict' ),
410 => _t ( 'ErrorPage.410' , '410 - Gone' ),
411 => _t ( 'ErrorPage.411' , '411 - Length Required' ),
412 => _t ( 'ErrorPage.412' , '412 - Precondition Failed' ),
413 => _t ( 'ErrorPage.413' , '413 - Request Entity Too Large' ),
414 => _t ( 'ErrorPage.414' , '414 - Request-URI Too Long' ),
415 => _t ( 'ErrorPage.415' , '415 - Unsupported Media Type' ),
416 => _t ( 'ErrorPage.416' , '416 - Request Range Not Satisfiable' ),
417 => _t ( 'ErrorPage.417' , '417 - Expectation Failed' ),
500 => _t ( 'ErrorPage.500' , '500 - Internal Server Error' ),
501 => _t ( 'ErrorPage.501' , '501 - Not Implemented' ),
502 => _t ( 'ErrorPage.502' , '502 - Bad Gateway' ),
503 => _t ( 'ErrorPage.503' , '503 - Service Unavailable' ),
504 => _t ( 'ErrorPage.504' , '504 - Gateway Timeout' ),
505 => _t ( 'ErrorPage.505' , '505 - HTTP Version Not Supported' ),
2007-07-19 12:40:28 +02:00
)
),
" Content "
);
return $fields ;
}
/**
* When an error page is published , create a static HTML page with its
* content , so the page can be shown even when SilverStripe is not
* functioning correctly before publishing this page normally .
* @ param string | int $fromStage Place to copy from . Can be either a stage name or a version number .
* @ param string $toStage Place to copy to . Must be a stage name .
* @ param boolean $createNewVersion Set this to true to create a new version number . By default , the existing version number will be copied over .
*/
function publish ( $fromStage , $toStage , $createNewVersion = false ) {
2007-08-16 08:35:02 +02:00
$oldStage = Versioned :: current_stage ();
2007-07-19 12:40:28 +02:00
// Run the page
2008-12-04 23:38:32 +01:00
$response = Director :: test ( Director :: makeRelative ( $this -> Link ()));
2008-11-22 04:33:00 +01:00
$errorContent = $response -> getBody ();
2007-10-28 09:14:49 +01:00
ENHANCEMENT Introduced constants for system paths like /sapphire in preparation for a more flexible directory reorganisation. Instead of hardcoding your path, please use the following constants: BASE_PATH, BASE_URL, SAPPHIRE_DIR, SAPPHIRE_PATH, CMS_DIR, CMS_PATH, THIRDPARTY_DIR, THIRDPARTY_PATH, ASSETS_DIR, ASSETS_PATH, THEMES_DIR, THEMES_PATH
git-svn-id: svn://svn.silverstripe.com/silverstripe/open/modules/sapphire/trunk@63154 467b73ca-7a2a-4603-9d3b-597d59a354a9
2008-09-27 18:02:38 +02:00
if ( ! file_exists ( ASSETS_PATH )) {
mkdir ( ASSETS_PATH , 02775 );
2007-10-28 09:14:49 +01:00
}
2007-07-19 12:40:28 +02:00
2009-01-19 02:25:23 +01:00
// if the page is published in a language other than default language,
// write a specific language version of the HTML page
$filePath = self :: get_filepath_for_errorcode ( $this -> ErrorCode , $this -> Lang );
if ( $fh = fopen ( $filePath , " w " )) {
2007-10-03 02:10:49 +02:00
fwrite ( $fh , $errorContent );
2007-07-19 12:40:28 +02:00
fclose ( $fh );
}
2007-08-16 08:35:02 +02:00
// Restore the version we're currently connected to.
Versioned :: reading_stage ( $oldStage );
2007-07-19 12:40:28 +02:00
return $this -> extension_instances [ 'Versioned' ] -> publish ( $fromStage , $toStage , $createNewVersion );
}
2008-11-02 21:04:10 +01:00
function fieldLabels () {
$labels = parent :: fieldLabels ();
$labels [ 'ErrorCode' ] = _t ( 'ErrorPage.CODE' , " Error code " );
return $labels ;
}
2009-01-19 02:25:23 +01:00
/**
* Returns an absolute filesystem path to a static error file
* which is generated through { @ link publish ()} .
*
* @ param int $statusCode A HTTP Statuscode , mostly 404 or 500
* @ param String $lang A language code in short locale format , e . g . 'de' ( Optional )
* @ return String
*/
static function get_filepath_for_errorcode ( $statusCode , $lang = null ) {
if ( Translatable :: is_enabled () && $lang && $lang != Translatable :: default_lang ()) {
return self :: $static_filepath . " /error- { $statusCode } - { $lang } .html " ;
} else {
return self :: $static_filepath . " /error- { $statusCode } .html " ;
}
}
/**
* Set the path where static error files are saved through { @ link publish ()} .
* Defaults to / assets .
*
* @ param string $path
*/
static function set_static_filepath ( $path ) {
self :: $static_filepath = $path ;
}
/**
* @ return string
*/
static function get_static_filepath ( $path ) {
return self :: $static_filepath ;
}
2007-07-19 12:40:28 +02:00
}
/**
* Controller for ErrorPages .
2008-02-25 03:10:37 +01:00
* @ package cms
2007-07-19 12:40:28 +02:00
*/
class ErrorPage_Controller extends Page_Controller {
2007-12-02 22:33:59 +01:00
public function init () {
parent :: init ();
2008-12-04 23:38:32 +01:00
2007-12-02 22:33:59 +01:00
Director :: set_status_code ( $this -> failover -> ErrorCode ? $this -> failover -> ErrorCode : 404 );
}
2007-07-19 12:40:28 +02:00
}
2007-09-15 01:21:35 +02:00
2007-12-02 22:24:12 +01:00
?>