2007-07-19 10:40:28 +00:00
< ? php
/**
2008-01-08 06:37:50 +00:00
* @ package cms
2007-07-19 10:40:28 +00:00
*/
/**
* ErrorPage holds the content for the page of an error response .
2008-01-09 04:18:36 +00:00
* @ package cms
2007-07-19 10:40:28 +00:00
*/
class ErrorPage extends Page {
2007-09-14 23:21:35 +00:00
2007-07-19 10:40:28 +00:00
static $db = array (
" ErrorCode " => " Int " ,
);
2007-09-14 23:21:35 +00:00
2007-07-19 10:40:28 +00:00
static $defaults = array (
" ShowInMenus " => 0 ,
);
/**
* Ensures that there is always a 404 page .
*/
function requireDefaultRecords () {
parent :: requireDefaultRecords ();
2007-08-15 06:38:41 +00:00
2007-07-19 10:40:28 +00:00
if ( ! DataObject :: get_one ( " ErrorPage " , " ErrorCode = '404' " )) {
$errorpage = new ErrorPage ();
$errorpage -> ErrorCode = 404 ;
2008-01-10 03:28:13 +00:00
$errorpage -> Title = _t ( 'ErrorPage.DEFAULTERRORPAGETITLE' , 'Page not found' );
2007-07-19 10:40:28 +00:00
$errorpage -> URLSegment = " page-not-found " ;
$errorpage -> ShowInMenus = false ;
2008-01-10 03:28:13 +00: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>' );
2007-08-20 04:23:51 +00:00
$errorpage -> Status = " New page " ;
2007-07-19 10:40:28 +00:00
$errorpage -> write ();
2007-08-20 04:23:51 +00:00
// Don't publish, as the manifest may not be built yet
// $errorpage->publish("Stage", "Live");
2007-07-19 10:40:28 +00:00
2007-08-24 03:31:14 +00:00
Database :: alteration_message ( " 404 page created " , " created " );
2007-07-19 10:40:28 +00:00
}
}
2007-09-14 23:21:35 +00:00
2007-07-19 10:40:28 +00:00
function getCMSFields () {
$fields = parent :: getCMSFields ();
$fields -> addFieldToTab (
" Root.Content.Main " ,
new DropdownField (
" ErrorCode " ,
2007-10-25 02:47:45 +00:00
_t ( 'ErrorPage.CODE' , " Error code " ),
2007-07-19 10:40:28 +00:00
array (
2008-02-06 23:13:53 +00: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 10:40:28 +00: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 ) {
// Temporarily log out when producing this page
$loggedInMember = Member :: currentUser ();
Session :: clear ( " loggedInAs " );
2007-07-19 23:15:05 +00:00
$alc_enc = isset ( $_COOKIE [ 'alc_enc' ]) ? $_COOKIE [ 'alc_enc' ] : null ;
Cookie :: set ( 'alc_enc' , null );
2007-08-16 06:35:02 +00:00
$oldStage = Versioned :: current_stage ();
2007-07-19 10:40:28 +00:00
// Run the page
Requirements :: clear ();
$controller = new ErrorPage_Controller ( $this );
2007-08-28 22:27:13 +00:00
$errorContent = $controller -> run ( array () ) -> getBody ();
2007-10-28 08:14:49 +00:00
if ( ! file_exists ( " ../assets " )) {
mkdir ( " ../assets " , 02775 );
}
2007-07-19 10:40:28 +00:00
if ( $fh = fopen ( " ../assets/error- $this->ErrorCode .html " , " w " )) {
2007-10-03 00:10:49 +00:00
fwrite ( $fh , $errorContent );
2007-07-19 10:40:28 +00:00
fclose ( $fh );
}
2007-08-16 06:35:02 +00:00
// Restore the version we're currently connected to.
Versioned :: reading_stage ( $oldStage );
2007-07-19 10:40:28 +00:00
// Log back in
2007-08-16 06:35:02 +00:00
if ( $loggedInMember ) Session :: set ( " loggedInAs " , $loggedInMember -> ID );
if ( isset ( $alc_enc )) Cookie :: set ( 'alc_enc' , $alc_enc );
2007-07-19 10:40:28 +00:00
return $this -> extension_instances [ 'Versioned' ] -> publish ( $fromStage , $toStage , $createNewVersion );
}
}
/**
* Controller for ErrorPages .
2008-01-10 00:34:18 +00:00
* @ package cms
2007-07-19 10:40:28 +00:00
*/
class ErrorPage_Controller extends Page_Controller {
2007-12-02 21:33:59 +00:00
public function init () {
parent :: init ();
Director :: set_status_code ( $this -> failover -> ErrorCode ? $this -> failover -> ErrorCode : 404 );
}
2007-07-19 10:40:28 +00:00
}
2007-09-14 23:21:35 +00:00
2007-12-02 21:24:12 +00:00
?>