Reputation: 4424
I am wanting to make simple configurable "Navigation Blocks" in a Silverstripe site. These have text, image, and link to another Page in the site.
Here's my (simplified) code:
class NavBlock extends DataObject {
private static $db = array(
'Text' => 'Text'
);
private static $has_one = array(
'NavBlockPhoto' => 'Image',
'LinksTo' => 'Page'
);
public function getCMSFields() {
$linksToField = new DropdownField('LinksToID', 'Page this block links to', Page::get()->map('ID', 'Title'));
$fields->addFieldToTab('Root.Main', $linksToField);
return $fields;
}
}
Currently the HomePage page type has a $has_one relationship with NavBlock:
class HomePage extends Page {
private static $has_many = array(
'NavBlocks' => 'NavBlock'
);
When I view a NavBlock in the CMS I get the following options:
Where "Page this block links to | Home" is I'd expect to see a drop down menu, but it seems to have defaulted/ locked to "Home" which is the parent of the NavBlock object.
Creating a new NavBlock and checking the database strongly suggests this is the case - the PageID of "Home" is 1.
How do I get it so I can select any page from the "LinksToID" dropdown?
Upvotes: 1
Views: 868
Reputation: 4424
This was the addition that worked for me:
private static $has_one = array(
'NavBlockPhoto' => 'Image',
'ParentPage' => 'Page',
'LinksTo' => 'SiteTree'
);
ParentPage automatically defaults to the HomePage as read-only.
LinksTo is then editable in the CMS.
Upvotes: 1
Reputation: 1746
Shouldn't the code on HomePage
read:
class HomePage extends Page {
private static $has_one = array(
'NavBlocks' => 'NavBlock'
);
...meaning HomePage has one block, with each block comprising one menu of many pages?
Upvotes: 0
Reputation: 6464
What should be the second item in the dropdown? It is an expected behavior because you have one HomePage only and you are setting that it can have one home page. You can remove if you like by using remove
public function getCMSFields() {
$fields=parent::getCMSFields();
$fields->removeByName('HomePageID');
}
It will still save it as HomePage behind the scenes. If you want to have many, then you should use something which is more than one and it will offer you a dropdown.
Upvotes: 0