【问题标题】:Silverstripe assumes SiteTree relation is to Parent?Silverstripe 假设 SiteTree 关系是父级?
【发布时间】:2014-10-01 10:27:09
【问题描述】:

我的(部分)数据对象:

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

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

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

【问题讨论】:

    标签: orm silverstripe


    【解决方案1】:

    试试这个:

    1) 给 DataObject 一个“父”关系:

    class InternalExternalLink extends DataObject {
    
        private static $has_one = array(
            'Parent' => 'DataObject',    
            'InternalLink' => 'SiteTree',
            'Attachment' => 'File'
        );
    
        ...
    }
    

    2) 在页面的 has_many 中指定“Parent”:

    class LinkTestPage extends SiteTree {
    
        private static $has_many = array(
            'Links' => 'InternalExternalLink.Parent'
        );
    
        ...
    }
    

    【讨论】:

      【解决方案2】:

      这里的问题是InternalExternalLink 上的关系是与SiteTree 的关系,而您试图在Page 上定义与它的关系。由于没有从InternalExternalLinkPagehas_one,并且您使用的是稍旧的3.1 版本,因此将查找Parent 的默认has_one

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

      【讨论】:

      • 嗨 Simon,所以问题是我在 InternalExternalLink 上没有指向 Page 的 $has_one 关系?这就是为什么它改用 $has_one 'InternalLink' 关系的原因?所以我需要两者 - 父关系和与另一个 SiteTree 对象的关系。您能否概述一下您提到的最近的 3.1 版本中发生了哪些行为变化?
      • 另外 - 什么是“寻找 Parent 的默认 has_one”行为,这在任何地方都有记录吗?谢谢!
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-11-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多