labelField = $labelField; $this->parentID = $parentID; $this->useCache = $cache; parent::__construct($name, $title, null, $value, $form, $emptyString); //so that we mimic the behaviour of TreeDropDownField, // if you pass an array, we will treat it as the source. if (is_array($sourceClass)) { $this->source = $sourceClass; } else { $this->sourceClass = $sourceClass; } } public function setLabelField($field) { $this->labelField = $field; } public function setFilter($filter) { $this->filter = $filter; } function getSource() { if (!$this->source) { if ($this->useCache) { $this->source = $this->getCachedHierarchy((int)$this->parentID); } else { $this->source = $this->getHierarchy((int)$this->parentID); } } return parent::getSource(); } private function getCachedHierarchy($parentID) { $class = ($this->sourceClass == "SiteTree" || is_subclass_of($this->sourceClass, "SiteTree")) ? "SiteTree" : $this->sourceClass; if (!isset(self::$cache[$class][$parentID])) { if (!isset(self::$cache[$class])) { self::$cache[$class] = array(); } self::$cache[$class][$parentID] = $this->getHierarchy($parentID); } return self::$cache[$class][$parentID]; } private function getHierarchy($parentID, $level = 0) { $options = array(); $class = ($this->sourceClass == "SiteTree" || is_subclass_of($this->sourceClass, "SiteTree")) ? "SiteTree" : $this->sourceClass; $filter = ($this->filter) ? "ParentID = $parentID AND $this->filter" : "ParentID = $parentID"; if($children = DataObject::get($class, $filter)) { foreach($children as $child) { $indent=""; for($i=0;$i<$level;$i++) $indent .= "  "; if($child->ClassName == $this->sourceClass || is_subclass_of($child, $this->sourceClass)) { $text = $child->__get($this->labelField); $options[$child->ID] = empty($text) ? "$indent Untitled" : $indent.$text; } $options += $this->getHierarchy($child->ID, $level+1); } } return $options; } }