Orm Silverstripe假设SiteTree与父级的关系为?

Orm Silverstripe假设SiteTree与父级的关系为?,orm,silverstripe,Orm,Silverstripe,我的(部分)数据对象: class InternalExternalLink extends DataObject { private static $db = array( 'ExternalLink' => 'VarChar(256)', 'LinkLabel' => 'VarChar(256)', "LinkType" => "Enum(array('Internal', 'External','Attachmen

我的(部分)数据对象:

class InternalExternalLink extends DataObject {

    private static $db = array(
        'ExternalLink' => 'VarChar(256)',
        'LinkLabel' => 'VarChar(256)',
        "LinkType" => "Enum(array('Internal', 'External','Attachment'))"
    );

    private static $has_one = array(
        'InternalLink' => 'SiteTree',
        'Attachment' => 'File'
    );

    function getCMSFields() {
        $fields = new FieldList(array(
            $internal = DropdownField::create("InternalLinkID", "Choose a page", SiteTree::get()->map()->toArray())->setEmptyString("-- choose --"),
        ));
        return $fields;
    }
添加我将此添加到页面:

class Page extends SiteTree {

    private static $has_many = array(
        'Links' => 'InternalExternalLink'
    );

    function getCMSFields() {
        $fields = parent::getCMSFields();
        $gridField = new GridField('Links', 'Links', $this->Links(), GridFieldConfig_RecordEditor::create());
        $fields->addFieldsToTab('Root.Main', $gridField);
        return $fields;
    }
问题是,当通过gridfield添加链接时,它会自动假定Link.InternalLink是父页面,而不是任何页面,并隐藏“页面选择”下拉列表。例如,如果我正在编辑about us页面,那么我通过gridfield添加的每个链接数据对象都会自动将其内部链接设置为about us页面

如何更改此假设以允许我通过下拉菜单选择任何页面?

尝试以下操作:

1) 为数据对象指定一个“父”关系:

class InternalExternalLink extends DataObject {

    private static $has_one = array(
        'Parent' => 'DataObject',    
        'InternalLink' => 'SiteTree',
        'Attachment' => 'File'
    );

    ...
}
2) 在页面的列表中指定“父项”:

class LinkTestPage extends SiteTree {

    private static $has_many = array(
        'Links' => 'InternalExternalLink.Parent'
    );

    ...
}

这里的问题是,
InternalExternalLink
上的关系是到
SiteTree
的,而您正试图在
页面
上重新定义到它的关系。由于没有从
InternalExternalLink
Page
has\u one
,并且您使用的是稍旧的3.1版本,因此会查找
父项的默认
has\u one


要解决此问题,您可以将
InternalLink
关系更改为指向
Page
而不是
SiteTree
,或者使用
DataExtension
has-many
关系添加到
SiteTree

Hi Simon,所以问题是我在InternalExternalLink上没有指向页面的$has_one关系?这就是为什么它使用$has_one“InternalLink”关系来代替?因此,我需要两种关系-父关系和与另一个SiteTree对象的关系。您还可以概述在最近的3.1版本中您所提到的行为发生了哪些变化吗?另外-什么是“默认的已查找父项之一”行为,是否在任何地方进行了记录?谢谢