我想在Silverstripe网站中制作简单的可配置“导航块”。它们包含文本,图像和指向站点中其他页面的链接。
这是我的(简化)代码:
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;
}
}
目前,HomePage页面类型与NavBlock具有 $ has_one 关系:
class HomePage extends Page {
private static $has_many = array(
'NavBlocks' => 'NavBlock'
);
当我在CMS中查看NavBlock时,我得到以下选项:
“页面此块链接到 | Home”我希望看到一个下拉菜单,但它似乎默认/锁定到“Home”,它是“Home”的父级NavBlock对象。
创建新的NavBlock并强烈检查数据库表明情况如此 - “Home”的PageID为1。
如何获取,以便我可以从“LinksToID”下拉列表中选择任何页面?
答案 0 :(得分:1)
这是对我有用的补充:
private static $has_one = array(
'NavBlockPhoto' => 'Image',
'ParentPage' => 'Page',
'LinksTo' => 'SiteTree'
);
ParentPage自动默认为只读的HomePage。
然后可以在CMS中编辑LinksTo。
答案 1 :(得分:0)
不应该HomePage
上的代码读取:
class HomePage extends Page {
private static $has_one = array(
'NavBlocks' => 'NavBlock'
);
...意味着HomePage有一个块,每个块包含一个多页菜单?
答案 2 :(得分:0)
下拉列表中的第二项应该是什么? 这是一种预期的行为,因为您只有一个主页,并且您设置它可以有一个主页。如果您愿意,可以使用删除
删除 public function getCMSFields() {
$fields=parent::getCMSFields();
$fields->removeByName('HomePageID');
}
它仍然会在幕后将其保存为HomePage。如果你想拥有很多,那么你应该使用多于一个的东西,它会为你提供一个下拉列表。