dataRecord. Any unrecognised method calls, for example, Title() * and Content(), will be passed along to the data record, * * Subclasses of ContentController are generally instantiated by ModelAsController; this will create * a controller based on the URLSegment action variable, by looking in the SiteTree table. */ class ContentController extends Controller { protected $dataRecord; /** * The ContentController will take the URLSegment parameter from the URL and use that to look * up a SiteTree record. */ public function __construct($dataRecord) { $this->dataRecord = $dataRecord; $this->failover = $this->dataRecord; parent::__construct(); } public function Link($action = null) { return Director::baseURL() . $this->RelativeLink($action); } public function RelativeLink($action = null) { if($this->URLSegment){ if($action == "index") $action = ""; // '&' in a URL is apparently naughty $action = preg_replace('/&/', '&', $action); return $this->URLSegment . "/$action"; } else { user_error("ContentController::RelativeLink() No URLSegment given on a '$this->class' object. Perhaps you should overload it?", E_USER_WARNING); } } //----------------------------------------------------------------------------------// // These flexible data methods remove the need for custom code to do simple stuff /* * Return the children of the given page. * $parentRef can be a page number or a URLSegment */ public function ChildrenOf($parentRef) { $SQL_parentRef = Convert::raw2sql($parentRef); $parent = DataObject::get_one('SiteTree', "URLSegment = '$SQL_parentRef'"); if(!$parent && is_numeric($parentRef)) $parent = DataObject::get_by_id('SiteTree', $SQL_parentRef); if($parent) { return $parent->Children(); } else { user_error("Error running <% control ChildrenOf($parentRef) %>: page '$parentRef' couldn't be found", E_USER_WARNING); } } public function Page($url) { $SQL_url = Convert::raw2sql($url); return DataObject::get_one('SiteTree', "URLSegment = '$SQL_url'"); } public function init() { parent::init(); //Log page views Statistics::collect(); // If we've accessed the homepage as /home/, then we should redirect to /. if($this->dataRecord && $this->dataRecord instanceof SiteTree && RootURLController::should_be_on_root($this->dataRecord) && !$this->urlParams['Action'] && !$_POST && !$_FILES) { $getVars = $_GET; unset($getVars['url']); if($getVars) $url = "?" . http_build_query($getVars); else $url = ""; Director::redirect($url); return; } singleton('SiteTree')->extend('contentcontrollerInit', $this); Director::set_site_mode('site'); // Check page permissions if($this->dataRecord && $this->URLSegment != 'Security' && !$this->dataRecord->can('View')) { Security::permissionFailure($this); } // Draft/Archive security check - only CMS users should be able to look at stage/archived content if($this->URLSegment != 'Security' && (Versioned::current_archived_date() || (Versioned::current_stage() && Versioned::current_stage() != 'Live'))) { if(!Permission::check('CMS_ACCESS_CMSMain')) { $link = $this->Link(); $message = _t("ContentController.DRAFT_SITE_ACCESS_RESTRICTION", "You must log in with your CMS password in order to view the draft or archived content. Click here to go back to the published site."); Security::permissionFailure($this, sprintf($message, "$link?stage=Live")); return; } } } /** * Get the project name * * @return string */ function project() { global $project; return $project; } /** * Returns the associated database record */ public function data() { return $this->dataRecord; } /*--------------------------------------------------------------------------------*/ /** * Returns a fixed navigation menu of the given level. */ public function getMenu($level) { if($level == 1) { $result = DataObject::get("SiteTree", "ShowInMenus = 1 AND ParentID = 0"); } else { $parent = $this->data(); $stack = array($parent); while($parent = $parent->Parent) array_unshift($stack, $parent); if(isset($stack[$level-2])) $result = $stack[$level-2]->Children(); } $visible = array(); // Remove all entries the can not be viewed by the current user // We might need to create a show in menu permission if(isset($result)) { foreach($result as $page) { if($page->can('view')) { $visible[] = $page; } } } return new DataObjectSet($visible); } public function Menu($level) { return $this->getMenu($level); } public function Section2() { return $this->Level(2)->URLSegment; } /** * Returns the default log-in form. * * @todo Check if here should be returned just the default log-in form or * all available log-in forms (also OpenID...) */ public function LoginForm() { return MemberAuthenticator::get_login_form($this); } public function SilverStripeNavigator() { $member = Member::currentUser(); if(Director::isDev() || Permission::check('CMS_ACCESS_CMSMain')) { Requirements::css('sapphire/css/SilverStripeNavigator.css'); Requirements::javascript('jsparty/behaviour.js'); // Requirements::javascript('jsparty/prototype.js'); Requirements::customScript(<<dataRecord){ $thisPage = $this->dataRecord->Link(); $cmsLink = 'admin/show/' . $this->dataRecord->ID; $cmsLink = "CMS"; } else { /** * HGS: If this variable is missing a notice is raised. Subclasses of ContentController * are required to implement RelativeLink anyway, so this should work even if the * dataRecord isn't set. */ $thisPage = $this->Link(); $cmsLink = ''; } $archiveLink = ""; if($date = Versioned::current_archived_date()) { $dateObj = Object::create('Datetime', $date, null); // $dateObj->setVal($date); $archiveLink = "Archived Site"; $liveLink = "Published Site"; $stageLink = "Draft Site"; $message = "
Archived site from
" . $dateObj->Nice() . "
"; } else if(Versioned::current_stage() == 'Stage') { $stageLink = "Draft Site"; $liveLink = "Published Site"; $message = "
DRAFT SITE
"; } else { $liveLink = "Published Site"; $stageLink = "Draft Site"; $message = "
PUBLISHED SITE
"; } if($member) { $firstname = Convert::raw2xml($member->FirstName); $surname = Convert::raw2xml($member->Surame); $logInMessage = "Logged in as {$firstname} {$surname} - log out"; } else { $logInMessage = "Not logged in - log in"; } /** * HGS: cmsLink is now only set if there is a dataRecord. You can't view the page in the * CMS if there is no dataRecord */ return <<
$logInMessage
View page in:
$cmsLink $stageLink
$liveLink $archiveLink
$message HTML; // On live sites we should still see the archived message } else { if($date = Versioned::current_archived_date()) { Requirements::css('sapphire/css/SilverStripeNavigator.css'); $dateObj = Object::create('Datetime', $date, null); // $dateObj->setVal($date); return "
Archived site from
" . $dateObj->Nice() . "
"; } } } /** * Returns a page comment system */ function PageComments() { if($this->data()->ProvideComments) { return new PageCommentInterface($this, 'PageComments', $this->data()); } else { if(isset($_REQUEST['executeForm']) && $_REQUEST['executeForm'] == 'PageComments.PostCommentForm') { echo "Comments have been disabled for this page"; die(); } } } /** * Returns the xml:lang and lang attributes */ function LangAttributes() { $lang = Translatable::current_lang(); return "xml:lang=\"$lang\" lang=\"$lang\""; } /** * Throw an error to test the error system */ function throwerror() { user_error("This is a test of the error handler - nothing to worry about.", E_USER_ERROR); } /** * Throw a warning to test the error system */ function throwwarning() { user_error("This is a test of the warning handler - nothing to worry about.", E_USER_WARNING); } /** * This action is called by the installation system */ function successfullyinstalled() { // The manifest should be built by now, so it's safe to publish the 404 page $fourohfour = Versioned::get_one_by_stage('ErrorPage', 'Stage', 'ErrorCode = 404'); if($fourohfour) { $fourohfour->Status = "Published"; $fourohfour->write(); $fourohfour->publish("Stage", "Live"); } if(isset($_SESSION['StatsID']) && $_SESSION['StatsID']) { $url = 'http://ss2stat.silverstripe.com/Installation/installed?ID=' . $_SESSION['StatsID']; @file_get_contents($url); } $title = new Varchar("Title"); $content = new HTMLText("Content"); $username = Session::get('username'); $password = Session::get('password'); $title->setValue("Installation Successful"); global $project; $tutorialOnly = ($project == 'tutorial') ? "

This website is a simplistic version of a SilverStripe 2 site. To extend this, please take a look at our new tutorials.

" : ''; $content->setValue(<<Congratulations, SilverStripe has been successfully installed.

$tutorialOnly

You can start editing your site's content by opening the CMS.
    Email: $username
    Password: $password

For security reasons you should now delete the install files, unless you are planning to reinstall later. The web server also now only needs write access to the "assets" folder, you can remove write access from all other folders.

Click here to delete the install files.

HTML ); return array( "Title" => $title, "Content" => $content, ); } function deleteinstallfiles() { $title = new Varchar("Title"); $content = new HTMLText("Content"); $tempcontent = ''; $username = Session::get('username'); $password = Session::get('password'); $installfiles = array( 'index.php', 'install.php', 'rewritetest.php', 'check-php.php', 'config-form.css', 'config-form.html', 'index.html' ); foreach($installfiles as $installfile) { if(file_exists('../' . $installfile)) { @unlink('../' . $installfile); } if(file_exists('../' . $installfile)) { $unsuccessful[] = $installfile; } } if(isset($unsuccessful)) { $title->setValue("Unable to delete installation files"); $tempcontent = "

Unable to delete installation files. Please delete the files below manually:

"; } else { $title->setValue("Deleted installation files"); $tempcontent = <<Installation files have been successfully deleted.

HTML ; } $tempcontent .= <<You can start editing your site's content by opening the CMS.
    Email: $username
    Password: $password

HTML ; $content->setValue($tempcontent); return array( "Title" => $title, "Content" => $content, ); } } ?>