'Title' ); static $template_fields = array( "URLSegment", "Title", "MenuTitle", "Content", "MetaTitle", "MetaDescription", "MetaKeywords", ); /** * Set the fields that will be copied from the template. * Note that ParentID and Sort are implied. */ static function set_template_fields($fieldList) { self::$template_fields = $fieldList; } function extraStatics() { if(!method_exists('DataObjectDecorator', 'load_extra_statics')) { if($this->owner->class != 'SiteTree') return null; } return array( 'has_one' => array( 'Subsite' => 'Subsite', // The subsite that this page belongs to 'MasterPage' => 'SiteTree',// Optional; the page that is the content master ), 'has_many' => array( 'RelatedPages' => 'SiteTree' ) ); } /** * Check if we're currently looking at the main site. * @return boolean TRUE main site | FALSE sub-site */ function isMainSite() { if($this->owner->SubsiteID == 0) return true; return false; } /** * Update any requests to limit the results to the current site */ function augmentSQL(SQLQuery &$query) { if(Subsite::$disable_subsite_filter) return; if(defined('DB::USE_ANSI_SQL')) $q="\""; else $q='`'; // If you're querying by ID, ignore the sub-site - this is a bit ugly... if (!$query->where || (!preg_match('/\.(\'|"|`|)ID(\'|"|`|)( ?)=/', $query->where[0]))) { $context = DataObject::context_obj(); if($context && is_numeric($context->SubsiteID)) $subsiteID = (int) $context->SubsiteID; else $subsiteID = (int) Subsite::currentSubsiteID(); // The foreach is an ugly way of getting the first key :-) foreach($query->from as $tableName => $info) { $where = "{$q}$tableName{$q}.{$q}SubsiteID{$q} IN ($subsiteID)"; // The tableName should be SiteTree or SiteTree_Live... if(strpos($tableName,'SiteTree') === false) break; $query->where[] = $where; break; } } } /** * Call this method before writing; the next write carried out by the system won't * set the CustomContent value */ function nextWriteDoesntCustomise() { $this->nextWriteDoesntCustomise = true; } protected $nextWriteDoesntCustomise = false; function augmentBeforeWrite() { // if the page hasn't been written to a database table yet and no subsite has been set, then give it a subsite if((!is_numeric($this->owner->ID) || $this->owner->ID == 0) && !$this->owner->SubsiteID) { $this->owner->SubsiteID = Subsite::currentSubsiteID(); } // If the content has been changed, then the page should be marked as 'custom content' if(!$this->nextWriteDoesntCustomise && $this->owner->ID && $this->owner->MasterPageID && !$this->owner->CustomContent) { $changed = $this->owner->getChangedFields(); foreach(self::$template_fields as $field) { if(isset($changed[$field]) && $changed[$field]) { $this->owner->CustomContent = true; FormResponse::add("if($('Form_EditForm_CustomContent')) $('Form_EditForm_CustomContent').checked = true;"); break; } } } $this->nextWriteDoesntCustomise = false; } function onAfterWrite(&$original) { // Update any subsite virtual pages that might need updating Subsite::$disable_subsite_filter = true; $linkedPages = DataObject::get("SubsitesVirtualPage", "CopyContentFromID = {$this->owner->ID}"); if($linkedPages) foreach($linkedPages as $page) { $page->copyFrom($page->CopyContentFrom()); $page->write(); } Subsite::$disable_subsite_filter = false; } function onAfterPublish(&$original) { // Publish any subsite virtual pages that might need publishing Subsite::$disable_subsite_filter = true; $linkedPages = DataObject::get("SubsitesVirtualPage", "CopyContentFromID = {$this->owner->ID}"); if($linkedPages) foreach($linkedPages as $page) { $page->copyFrom($page->CopyContentFrom()); $page->doPublish(); } Subsite::$disable_subsite_filter = false; } function updateCMSFields(&$fields) { if($this->owner->MasterPageID) { $fields->insertFirst(new HeaderField('This page\'s content is copied from a master page: ' . $this->owner->MasterPage()->Title, 2)); } // replace readonly link prefix $subsite = $this->owner->Subsite(); if($subsite && $subsite->ID) { $baseUrl = 'http://' . $subsite->domain() . '/'; $fields->removeByName('BaseUrlLabel'); $fields->addFieldToTab( 'Root.Content.Metadata', new LabelField('BaseUrlLabel',$baseUrl), 'URLSegment' ); } // Related pages $fields->addFieldToTab( 'Root.Related', new LiteralField('RelatedNote', '
You can list pages here that are related to this page.
When this page is updated, you will get a reminder to check whether these related pages need to be updated as well.