diff --git a/core/model/SiteTree.php b/core/model/SiteTree.php index 4e0aad35e..f66c60873 100644 --- a/core/model/SiteTree.php +++ b/core/model/SiteTree.php @@ -7,8 +7,8 @@ /** * Basic data-object representing all pages within the site tree. * This data-object takes care of the heirachy. All page types that live within the heirachy - * should inherit from this. - * + * should inherit from this. + * * In addition, it contains a number of static methods for querying the site tree. */ class SiteTree extends DataObject { @@ -20,7 +20,7 @@ class SiteTree extends DataObject { public function Link($action = null) { if($action == "index") { $action = ""; - } + } return Director::baseURL() . $this->URLSegment . "/$action"; } @@ -41,7 +41,7 @@ class SiteTree extends DataObject { public function LinkOrCurrent() { return $this->isCurrent() ? "current" : "link"; } - + /** * Returns link/section, depending on whether you're on the current section. * This is useful for css styling of menus. @@ -50,7 +50,7 @@ class SiteTree extends DataObject { public function LinkOrSection() { return $this->isSection() ? "section" : "link"; } - + /** * Returns link/current/section, depending if you're not in the current section, * you're on the current page, or you're in the current section @@ -59,7 +59,7 @@ class SiteTree extends DataObject { */ public function LinkingMode() { $this->prepareCurrentAndSection(); - + if($this->ID == self::$currentPageID) { return "current"; } else if(in_array($this->ID, self::$currentSectionIDs)) { @@ -68,7 +68,7 @@ class SiteTree extends DataObject { return "link"; } } - + /** * Get the URL segment for this page, eg 'home' * @return string The URL segment @@ -90,7 +90,7 @@ class SiteTree extends DataObject { } return false; } - + /** * Returns comments on this page. This will only show comments that * have been marked as spam if "?showspam=1" is appended to the URL. @@ -103,7 +103,7 @@ class SiteTree extends DataObject { return $comments ? $comments : new DataObjectSet(); } - + /** * Create a duplicate of this node. Doesn't affect joined data - create a custom overloading of this * if you need such behaviour. @@ -114,7 +114,7 @@ class SiteTree extends DataObject { $page->CheckedPublicationDifferences = $page->AddedToStage = true; return $page; } - + /** * Duplicates each child of this node recursively and returns the duplicate node. * @return SiteTree The duplicated object. @@ -130,10 +130,10 @@ class SiteTree extends DataObject { $childClone->write(); } } - + return $clone; } - + /** * Duplicate this node and its children as a child of the node with the given id * @param int $id ID of the new node's new parent @@ -143,7 +143,7 @@ class SiteTree extends DataObject { $newSiteTree->ParentID = $id; $newSiteTree->write(); } - + /** * An array of this pages URL segment and it's parents. * This is generated by prepareCurrentAndSection for use by @@ -158,7 +158,7 @@ class SiteTree extends DataObject { * @var int */ protected static $currentPageID; - + /** * This function is used for isCurrent() and isSection() to prepare * the cached answers. @@ -172,7 +172,7 @@ class SiteTree extends DataObject { } else { $nextID = SiteTree::$currentPageID; } - + $table = (Versioned::current_stage() == "Live") ? "SiteTree_Live" : "SiteTree"; SiteTree::$currentSectionIDs = array(); @@ -182,7 +182,7 @@ class SiteTree extends DataObject { } } } - + /** * Check if this is the currently viewed page. * @return boolean True if this is the current page. @@ -191,7 +191,7 @@ class SiteTree extends DataObject { $this->prepareCurrentAndSection(); return $this->ID == SiteTree::$currentPageID; } - + /** * Check if the currently viewed page is in this section. * @return boolean True if the currently viewed page is in this section. @@ -200,7 +200,7 @@ class SiteTree extends DataObject { $this->prepareCurrentAndSection(); return in_array($this->ID, self::$currentSectionIDs); } - + /** * Return a breadcrumb trail to this page. * @param int $maxDepth The maximum depth to traverse. @@ -221,10 +221,10 @@ class SiteTree extends DataObject { } $page = $page->Parent; } - + return implode(" » ", array_reverse($parts)); } - + /** * Get the parent of this page. * @return SiteTree Parent of this page. @@ -233,7 +233,7 @@ class SiteTree extends DataObject { if($this->getField("ParentID")) return DataObject::get_one("SiteTree", "`SiteTree`.ID = " . $this->getField("ParentID")); } - + /** * Make this page a child of another page. * @param SiteTree|int $item Either the parent object, or the parent id @@ -245,7 +245,7 @@ class SiteTree extends DataObject { $this->setField("ParentID", $item); } } - + /** * Return a string of the form "parent - page" or "grandparent - parent - page". * @param int $level The maximum amount of levels to traverse. @@ -313,25 +313,25 @@ class SiteTree extends DataObject { public function canAddChildren() { return $this->canEdit() && $this->stat('allowed_children') != 'none'; } - + /** * This function should return true if the current user can delete this page. * It can be overloaded to customise the security model for an application. * @return boolean True if the current user can delete this page. */ public function canDelete() { - return $this->stat('can_create') != false; + return $this->stat('can_create') != false; } - + /** * This function should return true if the current user can create new pages of this class. * It can be overloaded to customise the security model for an application. * @return boolean True if the current user can create pages on this class. */ public function canCreate() { - return $this->stat('can_create') != false || Director::isDev(); + return $this->stat('can_create') != false || Director::isDev(); } - + /** * This function should return true if the current user can edit this page. * It can be overloaded to customise the security model for an application. @@ -349,9 +349,9 @@ class SiteTree extends DataObject { public function canPublish() { return $this->canEdit(); } - + /** - * Collate selected descendants of this page. + * Collate selected descendants of this page. * $condition will be evaluated on each descendant, and if it is succeeds, that item will be added * to the $collator array. * @param string $condition The PHP condition to be evaluated. The page will be called $item @@ -366,7 +366,7 @@ class SiteTree extends DataObject { return true; } } - + /** * Return the title, description and keywords metatags. * @param boolean|string $includeTitle Show default -tag, set to false for custom templating @@ -378,7 +378,7 @@ class SiteTree extends DataObject { $tags .= "<title>" . Convert::raw2xml($this->MetaTitle ? $this->MetaTitle : $this->Title) . "\n"; } $tags .= "\n"; - + $charset = ContentNegotiator::get_encoding(); $tags .= "\n"; if($this->MetaKeywords) { @@ -393,7 +393,7 @@ class SiteTree extends DataObject { return $tags; } - + /** * Returns the object that contains the content that a user would associate with this page. * Ordinarily, this is just the page itself, but for example on RedirectorPages or VirtualPages @@ -403,7 +403,7 @@ class SiteTree extends DataObject { public function ContentSource() { return $this; } - + function requireDefaultRecords() { parent::requireDefaultRecords(); @@ -450,11 +450,11 @@ class SiteTree extends DataObject { if(!$this->Sort && $this->ParentID) { $this->Sort = DB::query("SELECT MAX(Sort) + 1 FROM SiteTree WHERE ParentID = $this->ParentID")->value(); } - + // Auto-set URLSegment if((!$this->URLSegment || $this->URLSegment == 'new-page') && $this->Title) { $this->URLSegment = $this->generateURLSegment($this->Title); - + // Keep it clean } else if(isset($this->changed['URLSegment']) && $this->changed['URLSegment']) { $segment = ereg_replace('[^A-Za-z0-9]+','-',$this->URLSegment); @@ -489,7 +489,7 @@ class SiteTree extends DataObject { } } } - + parent::onBeforeWrite(); } @@ -510,11 +510,11 @@ class SiteTree extends DataObject { } return $t; } - + function makelinksunique() { $badURLs = "'" . implode("', '", DB::query("SELECT URLSegment, count(*) FROM SiteTree GROUP BY URLSegment HAVING count(*) > 1")->column()) . "'"; $pages = DataObject::get("SiteTree", "URLSegment IN ($badURLs)"); - + foreach($pages as $page) { echo "
  • $page->Title: "; $urlSegment = $page->URLSegment; @@ -522,13 +522,13 @@ class SiteTree extends DataObject { if($urlSegment != $page->URLSegment) echo " changed $urlSegment -> $page->URLSegment"; else echo " $urlSegment is already unique"; die(); - } + } } - + function makelinksuniquequick() { $badURLs = "'" . implode("', '", DB::query("SELECT URLSegment, count(*) FROM SiteTree GROUP BY URLSegment HAVING count(*) > 1")->column()) . "'"; $pages = DB::query("SELECT *, SiteTree.ID FROM SiteTree LEFT JOIN Page ON Page.ID = SiteTree.ID WHERE URLSegment IN ($badURLs)"); - + foreach($pages as $page) { echo "
  • $page[Title]: "; $urlSegment = $page['URLSegment']; @@ -536,10 +536,10 @@ class SiteTree extends DataObject { DB::query("UPDATE SiteTree SET URLSegment = '$newURLSegment' WHERE ID = $page[ID]"); if($urlSegment != $newURLSegment) echo " changed $urlSegment -> $newURLSegment"; else echo " $urlSegment is already unique"; - } + } echo "

    done"; } - + /** * Replace a URL in html content with a new URL. * @param string $old The old URL @@ -556,7 +556,7 @@ class SiteTree extends DataObject { } } } - + //------------------------------------------------------------------------------------// /** @@ -603,7 +603,7 @@ class SiteTree extends DataObject { if(!isset($backlinks)) { $backlinks = "

    This page hasn't been linked to from any pages.

    "; } - + // Status / message // Create a status message for multiple parents if($this->ID && is_numeric($this->ID)) { @@ -614,34 +614,34 @@ class SiteTree extends DataObject { foreach($linkedPages as $linkedPage) { $parentPage = $linkedPage->Parent; $parentPageTitle = $parentPage->Title; - + if($parentPage->ID) { $parentPageLinks[] = "ID\">{$parentPage->Title}"; } else { $parentPageLinks[] = "ID\">Site Content (Top Level)"; } } - + $lastParent = array_pop($parentPageLinks); $parentList = "'$lastParent'"; - + if(count( $parentPageLinks ) > 0) { $parentList = "'" . implode("', '", $parentPageLinks) . "' and " . $parentList; } - + $statusMessage[] = "This content also appears on the virtual pages in the $parentList sections."; } - + if($this->HasBrokenLink || $this->HasBrokenFile) { $statusMessage[] = "This page has broken links."; } - + $message = "STATUS: $this->Status
    "; if(isset($statusMessage)) { $message .= "NOTE: " . implode("
    ", $statusMessage); } - // Lay out the fields + // Lay out the fields $fields = new FieldSet( new TabSet("Root", new TabSet("Content", @@ -713,7 +713,7 @@ class SiteTree extends DataObject { ), new NamedLabelField("Status", $message, "pageStatusMessage", true) ); - + foreach(self::$cms_additions as $extension) { $fields = call_user_func($extension,$fields); @@ -744,7 +744,7 @@ class SiteTree extends DataObject { return new DataObjectSet($actions); } - + /** * Check if this page is new - that is, if it has yet to have been written * to the database. @@ -757,13 +757,13 @@ class SiteTree extends DataObject { */ if(empty($this->ID)) return true; - + if(is_numeric($this->ID)) return false; - + return stripos($this->ID, 'new') === 0; } - + /** * Check if this page has been published. * @return boolean True if this page has been published. @@ -772,7 +772,7 @@ class SiteTree extends DataObject { if($this->isNew()) return false; return DB::query("SELECT ID FROM `SiteTree_Live` WHERE ID = $this->ID")->value() ? true : false; } - + /** * Look for ghost parents */ @@ -787,7 +787,7 @@ class SiteTree extends DataObject { } return $parents; } - + /** * Get the class dropdown used in the CMS to change the class of a page. * This returns the list of options in the drop as a Map from class name @@ -809,7 +809,7 @@ class SiteTree extends DataObject { return $result; } - + /** * Returns an array of the class names of classes that are allowed * to be children of this class. @@ -831,7 +831,7 @@ class SiteTree extends DataObject { return $allowedChildren; } } - + /** * Returns the class name of the default class for children * of this page. @@ -846,7 +846,7 @@ class SiteTree extends DataObject { return $default; } } - + /** * Returns the class name of the default class for the parent * of this page. @@ -855,7 +855,7 @@ class SiteTree extends DataObject { function defaultParent() { return $this->stat('default_parent'); } - + /** * Function to clean up the currently loaded page after a reorganise has been called. * It should return a piece of JavaScript to be executed on the client side, to clean @@ -863,9 +863,9 @@ class SiteTree extends DataObject { */ function cmsCleanup_parentChanged() { } - - /** + + /** * Get the title for use in menus for this page. If the MenuTitle * field is set it returns that, else it returns the Title field. * @return string @@ -877,7 +877,7 @@ class SiteTree extends DataObject { return $this->getField("Title"); } } - + /** * Set the menu title for this page. * @param string $value @@ -889,7 +889,7 @@ class SiteTree extends DataObject { $this->setField("MenuTitle", $value); } } - + /** * TitleWithStatus will return the title in an , or tag * depending on its publication status. @@ -900,24 +900,24 @@ class SiteTree extends DataObject { if(!$this->CheckedPublicationDifferences && $this->ID) { $stageVersion = DB::query("SELECT Version FROM SiteTree WHERE ID = $this->ID")->value(); $liveVersion = DB::query("SELECT Version FROM SiteTree_Live WHERE ID = $this->ID")->value(); - + if($stageVersion && !$liveVersion) $this->AddedToStage = true; else if(!$stageVersion && $liveVersion) $this->DeletedFromStage = true; else if($stageVersion != $liveVersion) $this->ModifiedOnStage = true; } - - $tag = - ($this->DeletedFromStage ? "del title=\"Removed from stage site\"" : - ($this->AddedToStage ? "ins title=\"Added to stage site\"" : + + $tag = + ($this->DeletedFromStage ? "del title=\"Removed from stage site\"" : + ($this->AddedToStage ? "ins title=\"Added to stage site\"" : ($this->ModifiedOnStage ? "span title=\"Modified on stage site\" class=\"modified\"" : ""))); - + if($tag) { return "<$tag>" . $this->Title . ""; } else { return $this->Title; } } - + /** * Return the CSS classes to apply to this node in the CMS tree * @param Controller $controller The controller object that the tree appears on @@ -929,12 +929,12 @@ class SiteTree extends DataObject { if(!$this->canAddChildren()) $classes .= " nochildren"; if(!$this->canDelete()) $classes .= " nodelete"; if($controller->isCurrentPage($this)) $classes .= " current"; - + $classes .= $this->markingClasses(); - + return $classes; } - + /** * Indicates what kind of children this page type can have. * This can be an array of allowed child classes, or the string "none" - indicating that @@ -944,13 +944,13 @@ class SiteTree extends DataObject { * @var array */ static $allowed_children = array("SiteTree"); - + /** * The default child class for this page. * @var string */ static $default_child = "Page"; - + /** * The default parent class for this page. * @var string @@ -962,14 +962,14 @@ class SiteTree extends DataObject { * @var bool */ static $can_be_root = true; - + /** * List of permission codes a user can have to allow a user to create a page * of this type. * @var array */ static $need_permission = null; - + /** * If you extend a class, and don't want to be able to select the old class * in the cms, set this to the old class name. Eg, if you extended Product to @@ -977,7 +977,7 @@ class SiteTree extends DataObject { * @var string */ static $hide_ancestor = null; - + static $db = array( "URLSegment" => "Varchar(255)", "Title" => "Varchar(255)", @@ -1003,25 +1003,25 @@ class SiteTree extends DataObject { "EditorsGroup" => "Int", "Priority" => "Float" ); - + static $indexes = array( "SearchFields" => "fulltext (Title, MenuTitle, Content, MetaTitle, MetaDescription, MetaKeywords)", "TitleSearchFields" => "fulltext (Title)" ); - + static $has_many = array( "Comments" => "PageComment" ); - + static $many_many = array( "LinkTracking" => "SiteTree", "ImageTracking" => "File" ); - + static $belongs_many_many = array( "BackLinkTracking" => "SiteTree" ); - + static $many_many_extraFields = array( "LinkTracking" => array("FieldName" => "Varchar"), "ImageTracking" => array("FieldName" => "Varchar") @@ -1032,7 +1032,7 @@ class SiteTree extends DataObject { "LastEdited" => "Datetime", "Created" => "Datetime", ); - + static $defaults = array( "ShowInMenus" => 1, "ShowInSearch" => 1, @@ -1046,26 +1046,26 @@ class SiteTree extends DataObject { static $has_one = array( "Parent" => "SiteTree" ); - + static $versioning = array( "Stage", "Live" ); - + static $default_sort = "Sort"; - + /** * The text shown in the create page dropdown. If * this is not set, default to "Create a ClassName". * @var string */ static $add_action = null; - + /** * If this is false, the class cannot be created in the CMS. * @var boolean */ static $can_create = true; - + /** * Icon to use in the CMS * This should be the base filename. The suffixes -file.gif, -openfolder.gif and -closedfolder.gif will