页面DropDownField自动默认为Silverstripe中的父对象页面

时间:2014-05-14 02:14:04

标签: php silverstripe

我想在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时,我得到以下选项: enter image description here

页面此块链接到 | Home”我希望看到一个下拉菜单,但它似乎默认/锁定到“Home”,它是“Home”的父级NavBlock对象。

创建新的NavBlock并强烈检查数据库表明情况如此 - “Home”的PageID为1。 enter image description here

如何获取,以便我可以从“LinksToID”下拉列表中选择任何页面?

3 个答案:

答案 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。如果你想拥有很多,那么你应该使用多于一个的东西,它会为你提供一个下拉列表。