silverstripe-framework/core/model/RedirectorPage.php
Ingo Schommer 97263cd09c ENHANCEMENT Using HTTP Status 301 for RedirectorPage class, to be nice to search engines and improve SEO (with 200 page rank gets split between pages, with 301 its all transferred to the target page)
git-svn-id: svn://svn.silverstripe.com/silverstripe/open/modules/sapphire/trunk@63181 467b73ca-7a2a-4603-9d3b-597d59a354a9
2008-09-28 19:50:53 +00:00

131 lines
3.6 KiB
PHP
Executable File

<?php
/**
* A redirector page redirects when the page is visited.
* @package cms
* @subpackage content
*/
class RedirectorPage extends Page {
static $add_action = "Redirector to another page";
static $icon = array("cms/images/treeicons/page-shortcut","file");
static $db = array(
"RedirectionType" => "Enum('Internal,External','Internal')",
"ExternalURL" => "Varchar(255)",
);
static $has_one = array(
"LinkTo" => "SiteTree",
);
static $many_many = array(
);
/**
* Returns this page if the redirect is external, otherwise
* returns the target page.
* @return SiteTree
*/
function ContentSource() {
if($this->RedirectionType == 'Internal') {
return $this->LinkTo();
} else {
return $this;
}
}
function Link() {
if($this->RedirectionType == 'External') {
return Convert::raw2att($this->ExternalURL);
} else {
$linkTo = $this->LinkToID ? DataObject::get_by_id("SiteTree", $this->LinkToID) : null;
if($linkTo) {
return $linkTo->Link();
}
}
}
function getCMSFields() {
Requirements::javascript(SAPPHIRE_DIR . "/javascript/RedirectorPage.js");
$fields = new FieldSet(
new TabSet("Root",
$tabContent = new Tab("Content",
new TextField("Title", _t('SiteTree.PAGETITLE')),
new TextField("MenuTitle", _t('SiteTree.MENUTITLE')),
new FieldGroup(_t('SiteTree.URL'),
new LabelField(Director::absoluteBaseURL()),
new UniqueRestrictedTextField("URLSegment",
"URLSegment",
"SiteTree",
_t('SiteTree.VALIDATIONURLSEGMENT1', "Another page is using that URL. URL must be unique for each page"),
"[^A-Za-z0-9-]+",
"-",
_t('SiteTree.VALIDATIONURLSEGMENT2', "URLs can only be made up of letters, digits and hyphens."),
"",
"",
"",
50
),
new LabelField("/")
),
new HeaderField(_t('RedirectorPage.HEADER', "This page will redirect users to another page")),
new OptionsetField(
"RedirectionType",
_t('RedirectorPage.REDIRECTTO', "Redirect to"),
array(
"Internal" => _t('RedirectorPage.REDIRECTTOPAGE', "A page on your website"),
"External" => _t('RedirectorPage.REDIRECTTOEXTERNAL', "Another website"),
),
"Internal"
),
new TreeDropdownField(
"LinkToID",
_t('RedirectorPage.YOURPAGE', "Page on your website"),
"SiteTree"
),
new TextField("ExternalURL", _t('RedirectorPage.OTHERURL', "Other website URL")),
new TextareaField("MetaDescription", _t('SiteTree.METADESC'))
),
$tabBehaviour = new Tab("Behaviour",
new DropdownField("ClassName", _t('SiteTree.PAGETYPE'), $this->getClassDropdown()),
new CheckboxField("ShowInMenus", _t('SiteTree.SHOWINMENUS')),
new CheckboxField("ShowInSearch", _t('SiteTree.SHOWINSEARCH'))
)
)
);
$tabContent->setTitle(_t('SiteTree.TABCONTENT'));
$tabBehaviour->setTitle(_t('SiteTree.TABBEHAVIOUR'));
return $fields;
}
}
/**
* Controller for the {@link RedirectorPage}.
* @package cms
* @subpackage content
*/
class RedirectorPage_Controller extends Page_Controller {
function init() {
if($this->RedirectionType == 'External') {
if($this->ExternalURL) {
Director::redirect($this->ExternalURL);
} else {
echo "<p>" .
_t('RedirectorPage.HASBEENSETUP', 'A redirector page has been set up without anywhere to redirect to.') .
"</p>";
}
} else {
$linkTo = DataObject::get_by_id("SiteTree", $this->LinkToID);
if($linkTo) {
Director::redirect($linkTo->Link(), 301);
} else {
echo "<p>" . _t('RedirectorPage.HASBEENSETUP') . "</p>";
}
}
parent::init();
}
}
?>