diff --git a/code/model/SiteTree.php b/code/model/SiteTree.php index 4e16cc70..8f9e1f89 100644 --- a/code/model/SiteTree.php +++ b/code/model/SiteTree.php @@ -2438,6 +2438,36 @@ class SiteTree extends DataObject implements PermissionProvider,i18nEntityProvid } } + /** + * A flag provides the user with additional data about the current page status, + * for example a "removed from draft" status. Each page can have more than one status flag. + * Returns a map of a unique key to a (localized) title for the flag. + * The unique key can be reused as a CSS class. + * Use the 'updateStatusFlags' extension point to customize the flags. + * Example: "deletedonlive" => "Deleted" + * + * @return array + */ + function getStatusFlags() { + $flags = array(); + if($this->IsDeletedFromStage) { + if($this->ExistsOnLive) { + $flags['removedfromdraft'] = _t('SiteTree.REMOVEDFROMDRAFTSHORT', 'Removed from draft'); + } else { + $flags['deletedonlive'] = _t('SiteTree.DELETEDPAGESHORT', 'Deleted'); + } + } else if($this->IsAddedToStage) { + $flags['addedtodraft'] = _t('SiteTree.ADDEDTODRAFTSHORT', 'New'); + } else if($this->IsModifiedOnStage) { + $flags['modified'] = _t('SiteTree.MODIFIEDONDRAFTSHORT', 'Modified'); + } + + $this->extend('updateStatusFlags', $flags); + + return $flags; + } + + /** * @deprecated 3.0 Use getTreeTitle() */ @@ -2447,29 +2477,27 @@ class SiteTree extends DataObject implements PermissionProvider,i18nEntityProvid } /** - * TitleWithStatus will return the title in an , or - * tag depending on its publication status. + * getTreeTitle will return three html DOM elements, an empty with + * the class 'jstree-pageicon' in front, following by a wrapping around its + * MenutTitle, then following by a indicating its publication status. * - * @return string + * @return string a html string ready to be directly used in a template */ function getTreeTitle() { - $text = Convert::raw2xml(str_replace(array("\n","\r"),"",$this->MenuTitle)); - if($this->IsDeletedFromStage) { - if($this->ExistsOnLive) { - $tag ="{$text} " . _t('SiteTree.REMOVEDFROMDRAFTSHORT', 'Removed from draft') . ""; - } else { - $tag ="{$text} ". _t('SiteTree.DELETEDPAGESHORT', 'Deleted') . ""; - } - } elseif($this->IsAddedToStage) { - $tag = "{$text} ". _t('SiteTree.ADDEDTODRAFTSHORT', 'New') . ""; - } elseif($this->IsModifiedOnStage) { - $tag = "{$text} " . _t('SiteTree.MODIFIEDONDRAFTSHORT', 'Modified') . ""; - } else { - $tag = ''; + $flags = $this->getStatusFlags(); + $treeTitle = sprintf( + "%s", + Convert::raw2xml(str_replace(array("\n","\r"),"",$this->MenuTitle)) + ); + foreach($flags as $class => $title) { + $treeTitle .= sprintf( + "%s", + Convert::raw2xml($class), + Convert::raw2xml($title) + ); } - - - return ($tag) ? "". $tag : "". $text; + + return $treeTitle; } /** diff --git a/tests/model/SiteTreeTest.php b/tests/model/SiteTreeTest.php index 04b446f7..abc65192 100644 --- a/tests/model/SiteTreeTest.php +++ b/tests/model/SiteTreeTest.php @@ -17,6 +17,7 @@ class SiteTreeTest extends SapphireTest { 'SiteTreeTest_ClassD', 'SiteTreeTest_ClassCext', 'SiteTreeTest_NotRoot', + 'SiteTreeTest_StageStatusInherit', ); /** @@ -866,7 +867,15 @@ class SiteTreeTest extends SapphireTest { } if(!$isDetected) $this->fail('Fails validation with $can_be_root=false'); + } + + function testModifyStatusFlagByInheritance(){ + $node = new SiteTreeTest_StageStatusInherit(); + $treeTitle = $node->getTreeTitle(); + $this->assertContains('InheritedTitle', $treeTitle); + $this->assertContains('inherited-class', $treeTitle); } + } /**#@+ @@ -928,4 +937,12 @@ class SiteTreeTest_ClassCext extends SiteTreeTest_ClassC implements TestOnly { class SiteTreeTest_NotRoot extends Page implements TestOnly { static $can_be_root = false; +} + +class SiteTreeTest_StageStatusInherit extends SiteTree implements TestOnly { + function getStatusFlags(){ + $flags = parent::getStatusFlags(); + $flags['inherited-class'] = "InheritedTitle"; + return $flags; + } } \ No newline at end of file