mirror of
https://github.com/silverstripe/silverstripe-framework
synced 2024-10-22 14:05:37 +02:00
new added hide_from_cms_tree and hide_from_hierarchy
This commit is contained in:
parent
2aec495a7c
commit
c401d9daff
@ -38,6 +38,32 @@ class Hierarchy extends DataExtension {
|
|||||||
*/
|
*/
|
||||||
private static $node_threshold_leaf = 250;
|
private static $node_threshold_leaf = 250;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A list of classnames to exclude from display in both the CMS and front end
|
||||||
|
* displays. ->Children() and ->AllChildren affected.
|
||||||
|
* Especially useful for big sets of pages like listings
|
||||||
|
* If you use this, and still need the classes to be editable
|
||||||
|
* then add a model admin for the class
|
||||||
|
* Note: Does not filter subclasses (non-inheriting)
|
||||||
|
*
|
||||||
|
* @var array
|
||||||
|
* @config
|
||||||
|
*/
|
||||||
|
private static $hide_from_hierarchy = array();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A list of classnames to exclude from display in the page tree views of the CMS,
|
||||||
|
* unlike $hide_from_hierarchy above which effects both CMS and front end.
|
||||||
|
* Especially useful for big sets of pages like listings
|
||||||
|
* If you use this, and still need the classes to be editable
|
||||||
|
* then add a model admin for the class
|
||||||
|
* Note: Does not filter subclasses (non-inheriting)
|
||||||
|
*
|
||||||
|
* @var array
|
||||||
|
* @config
|
||||||
|
*/
|
||||||
|
private static $hide_from_cms_tree = array();
|
||||||
|
|
||||||
public static function get_extra_config($class, $extension, $args) {
|
public static function get_extra_config($class, $extension, $args) {
|
||||||
return array(
|
return array(
|
||||||
'has_one' => array('Parent' => $class)
|
'has_one' => array('Parent' => $class)
|
||||||
@ -605,6 +631,18 @@ class Hierarchy extends DataExtension {
|
|||||||
return $this->_cache_numChildren;
|
return $this->_cache_numChildren;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Checks if we're on a controller where we should filter. ie. Are we loading the SiteTree?
|
||||||
|
*
|
||||||
|
* @return bool
|
||||||
|
*/
|
||||||
|
public function showingCMSTree() {
|
||||||
|
if (!Controller::has_curr()) return false;
|
||||||
|
$controller = Controller::curr();
|
||||||
|
return $controller instanceof LeftAndMain
|
||||||
|
&& in_array($controller->getAction(), array("treeview", "listview", "getsubtree"));
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Return children from the stage site
|
* Return children from the stage site
|
||||||
*
|
*
|
||||||
@ -614,9 +652,17 @@ class Hierarchy extends DataExtension {
|
|||||||
*/
|
*/
|
||||||
public function stageChildren($showAll = false) {
|
public function stageChildren($showAll = false) {
|
||||||
$baseClass = ClassInfo::baseDataClass($this->owner->class);
|
$baseClass = ClassInfo::baseDataClass($this->owner->class);
|
||||||
|
$hide_from_hierarchy = $this->owner->config()->hide_from_hierarchy;
|
||||||
|
$hide_from_cms_tree = $this->owner->config()->hide_from_cms_tree;
|
||||||
$staged = $baseClass::get()
|
$staged = $baseClass::get()
|
||||||
->filter('ParentID', (int)$this->owner->ID)
|
->filter('ParentID', (int)$this->owner->ID)
|
||||||
->exclude('ID', (int)$this->owner->ID);
|
->exclude('ID', (int)$this->owner->ID);
|
||||||
|
if ($hide_from_hierarchy) {
|
||||||
|
$staged = $staged->exclude('ClassName', $hide_from_hierarchy);
|
||||||
|
}
|
||||||
|
if ($hide_from_cms_tree && $this->showingCMSTree()) {
|
||||||
|
$staged = $staged->exclude('ClassName', $hide_from_cms_tree);
|
||||||
|
}
|
||||||
if (!$showAll && $this->owner->db('ShowInMenus')) {
|
if (!$showAll && $this->owner->db('ShowInMenus')) {
|
||||||
$staged = $staged->filter('ShowInMenus', 1);
|
$staged = $staged->filter('ShowInMenus', 1);
|
||||||
}
|
}
|
||||||
@ -638,6 +684,8 @@ class Hierarchy extends DataExtension {
|
|||||||
}
|
}
|
||||||
|
|
||||||
$baseClass = ClassInfo::baseDataClass($this->owner->class);
|
$baseClass = ClassInfo::baseDataClass($this->owner->class);
|
||||||
|
$hide_from_hierarchy = $this->owner->config()->hide_from_hierarchy;
|
||||||
|
$hide_from_cms_tree = $this->owner->config()->hide_from_cms_tree;
|
||||||
$children = $baseClass::get()
|
$children = $baseClass::get()
|
||||||
->filter('ParentID', (int)$this->owner->ID)
|
->filter('ParentID', (int)$this->owner->ID)
|
||||||
->exclude('ID', (int)$this->owner->ID)
|
->exclude('ID', (int)$this->owner->ID)
|
||||||
@ -645,8 +693,13 @@ class Hierarchy extends DataExtension {
|
|||||||
'Versioned.mode' => $onlyDeletedFromStage ? 'stage_unique' : 'stage',
|
'Versioned.mode' => $onlyDeletedFromStage ? 'stage_unique' : 'stage',
|
||||||
'Versioned.stage' => 'Live'
|
'Versioned.stage' => 'Live'
|
||||||
));
|
));
|
||||||
|
if ($hide_from_hierarchy) {
|
||||||
if(!$showAll) $children = $children->filter('ShowInMenus', 1);
|
$children = $children->exclude('ClassName', $hide_from_hierarchy);
|
||||||
|
}
|
||||||
|
if ($hide_from_cms_tree && $this->showingCMSTree()) {
|
||||||
|
$children = $children->exclude('ClassName', $hide_from_cms_tree);
|
||||||
|
}
|
||||||
|
if(!$showAll && $this->owner->db('ShowInMenus')) $children = $children->filter('ShowInMenus', 1);
|
||||||
|
|
||||||
return $children;
|
return $children;
|
||||||
}
|
}
|
||||||
|
@ -5,11 +5,13 @@ class HierarchyTest extends SapphireTest {
|
|||||||
protected static $fixture_file = 'HierarchyTest.yml';
|
protected static $fixture_file = 'HierarchyTest.yml';
|
||||||
|
|
||||||
protected $requiredExtensions = array(
|
protected $requiredExtensions = array(
|
||||||
'HierarchyTest_Object' => array('Hierarchy', 'Versioned')
|
'HierarchyTest_Object' => array('Hierarchy', 'Versioned'),
|
||||||
|
'HierarchyHideTest_Object' => array('Hierarchy', 'Versioned'),
|
||||||
);
|
);
|
||||||
|
|
||||||
protected $extraDataObjects = array(
|
protected $extraDataObjects = array(
|
||||||
'HierarchyTest_Object'
|
'HierarchyTest_Object',
|
||||||
|
'HierarchyHideTest_Object'
|
||||||
);
|
);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -482,6 +484,35 @@ class HierarchyTest extends SapphireTest {
|
|||||||
$this->assertEquals('unexpanded jstree-closed closed', $nodeClass, 'obj2 should have children in the sitetree');
|
$this->assertEquals('unexpanded jstree-closed closed', $nodeClass, 'obj2 should have children in the sitetree');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function testNoHideFromHeirarchy() {
|
||||||
|
$obj4 = $this->objFromFixture('HierarchyHideTest_Object', 'obj4');
|
||||||
|
$obj4->publish("Stage", "Live");
|
||||||
|
|
||||||
|
foreach($obj4->stageChildren() as $child) {
|
||||||
|
$child->publish("Stage", "Live");
|
||||||
|
}
|
||||||
|
$this->assertEquals($obj4->stageChildren()->Count(), 2);
|
||||||
|
$this->assertEquals($obj4->liveChildren()->Count(), 2);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function testHideFromHeirarchy() {
|
||||||
|
HierarchyHideTest_Object::config()->hide_from_hierarchy = array('HierarchyHideTest_SubObject');
|
||||||
|
$obj4 = $this->objFromFixture('HierarchyHideTest_Object', 'obj4');
|
||||||
|
$obj4->publish("Stage", "Live");
|
||||||
|
|
||||||
|
// load without using stage children otherwise it'll bbe filtered before it's publish
|
||||||
|
// we need to publish all of them, and expect liveChildren to return some.
|
||||||
|
$children = HierarchyHideTest_Object::get()
|
||||||
|
->filter('ParentID', (int)$obj4->ID)
|
||||||
|
->exclude('ID', (int)$obj4->ID);
|
||||||
|
|
||||||
|
foreach($children as $child) {
|
||||||
|
$child->publish("Stage", "Live");
|
||||||
|
}
|
||||||
|
$this->assertEquals($obj4->stageChildren()->Count(), 1);
|
||||||
|
$this->assertEquals($obj4->liveChildren()->Count(), 1);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param String $html [description]
|
* @param String $html [description]
|
||||||
* @param array $nodes Breadcrumb path as array
|
* @param array $nodes Breadcrumb path as array
|
||||||
@ -543,3 +574,22 @@ class HierarchyTest_Object extends DataObject implements TestOnly {
|
|||||||
return $this->markingClasses();
|
return $this->markingClasses();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
class HierarchyHideTest_Object extends DataObject implements TestOnly {
|
||||||
|
private static $db = array(
|
||||||
|
'Title' => 'Varchar'
|
||||||
|
);
|
||||||
|
|
||||||
|
private static $extensions = array(
|
||||||
|
'Hierarchy',
|
||||||
|
"Versioned('Stage', 'Live')",
|
||||||
|
);
|
||||||
|
|
||||||
|
public function cmstreeclasses() {
|
||||||
|
return $this->markingClasses();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
class HierarchyHideTest_SubObject extends HierarchyHideTest_Object {
|
||||||
|
|
||||||
|
}
|
||||||
|
@ -32,3 +32,15 @@ HierarchyTest_Object:
|
|||||||
obj3ab:
|
obj3ab:
|
||||||
Parent: =>HierarchyTest_Object.obj3a
|
Parent: =>HierarchyTest_Object.obj3a
|
||||||
Title: Obj 3ab
|
Title: Obj 3ab
|
||||||
|
|
||||||
|
HierarchyHideTest_Object:
|
||||||
|
obj4:
|
||||||
|
Title: Obj 4
|
||||||
|
obj4a:
|
||||||
|
Parent: =>HierarchyHideTest_Object.obj4
|
||||||
|
Title: Obj 4a
|
||||||
|
|
||||||
|
HierarchyHideTest_SubObject:
|
||||||
|
obj4b:
|
||||||
|
Parent: =>HierarchyHideTest_Object.obj4
|
||||||
|
Title: Obj 4b
|
||||||
|
Loading…
Reference in New Issue
Block a user