Silverstripe假设SiteTree关系是父母?

时间:2014-08-08 02:04:20

标签: orm silverstripe

我的(部分)DataObject:

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;
    }

添加我将此添加到Page:

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;
    }

问题是当通过网格字段添加链接时,它会自动假定Link.InternalLink是父页面而不是任何页面,并隐藏页面选择下拉列表。例如。如果我正在编辑about-us页面,那么我通过gridfield添加的每个Link数据对象都会自动将其InternalLink设置为about-us页面。

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

2 个答案:

答案 0 :(得分:0)

试试这个:

1)给DataObject一个" Parent"关系:

class InternalExternalLink extends DataObject {

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

    ...
}

2)指定" Parent"在页面的has_many:

class LinkTestPage extends SiteTree {

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

    ...
}

答案 1 :(得分:0)

这里的问题是InternalExternalLinkSiteTree之间的关系,而您正尝试在Page上定义与之关系。由于从has_oneInternalExternalLink没有Page,并且您使用的是较旧版本的3.1,因此会查找has_one的默认Parent

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