Skip to main content

This site requires you to update your browser. Your browsing experience maybe affected by not having the most up to date version.

General Questions

General questions about getting started with SilverStripe that don't fit in any of the categories above.

Moderators: martimiz, Sean, biapar, Willr, Ingo, swaiba, simon_w

Choosing a URL from sitetree


30 Posts   6880 Views


19 March 2013 at 2:15am Community Member, 11 Posts


Im using the SiteTree to allow the user to choose a page on the site to create a link.

The Page.php has this code

public static $has_one = array(
      "CaptionOneLink" => "SiteTree"

public function getCMSFields() {
$fields = parent::getCMSFields();
$fields->addFieldToTab("Root.SliderText", new TreeDropdownField('CaptionOneLink', 'Caption 1 Link', 'SiteTree'));
return $fields;

The template file has the following:

<a href="$CaptionOneLink.Link">Link to page</a>

In the admin section I can see the dropdown, with the pages in their. However when I select one and save it display "(Choose One)" rather than the selected page name.

When I load the page there is no link in the <a> anchor tag. I checked the database and the ID it has entered for CaptionOneLink is 0.

Is there something I'm missing? Or Documentation you can link to?


19 April 2013 at 8:53am Community Member, 65 Posts


I have been able to add a SiteTree dropdown to my DataObject pop up however I only want to show specific page types.

Is it possible to filter the pages displayed in the dropdown based on $ClassName?

This is what I have so far:

$fields->push( new TreeDropdownField('PackageType','Package Page', 'SiteTree', 'ID'));

There are many different packages available and these are split up into various types of packages which I want to be displayed on the pages of the site. Because packages can only be displayed on pages with a $ClassName of 'PackagePage' these are the only pages I want to display in the dropdown, make it easier for my client.

Any help greatly appreciated.



19 August 2013 at 2:02am Community Member, 21 Posts

Marc, this is what I need to know too. Did you find the answer?


19 August 2013 at 8:15pm (Last edited: 19 August 2013 8:16pm), Community Member, 146 Posts

Assuming you're on 3.x, not sure about 2.x:

$tree = new TreeDropdownField('PackageType','Package Page', 'SiteTree', 'ID');
$tree->setFilterFunction(function($obj) {
   if ($obj->ClassName == "MyClass") {
      return false;
   } else {
      return true;

This will hide any options with the class name 'MyClass'. Note that if you hide the 'MyClass' page type, its child pages will also be hidden. I've submitted a pull request to disable instead of hide them, so that child pages will still be accessible - though it'd only make it in to 3.1.1 at the earliest:


19 August 2013 at 11:30pm Community Member, 21 Posts

Oops no sorry, I am using 2.4. Is it doable in there?


20 August 2013 at 3:51am Community Member, 146 Posts

Looking at the API ( it should work in the exact same way