Silverstripe删除CMS选项卡中不相关的has_one关系字段

时间:2014-12-03 16:13:12

标签: silverstripe

我有一个名为ContentSection的DataObject,它有2个has_one关系:到页面类型LandingPage和另一个DataObject Person

class ContentSection extends DataObject {
    protected static $has_one = array(
        'Person'        => 'Person',
        'LandingPage'   => 'LandingPage'
    );
}

LandingPage和Person都定义了与ContentSection的has_many关系。

class LandingPage extends Page {
    protected static $has_many = array(
        'ContentSections'   => 'ContentSection'
    );
}

class Person extends DataObject {
    protected static $has_many = array(
        'ContentSections'   => 'ContentSection'
    );
}

ContentSections可通过LandingPage和具有GridFieldConfig_RelationEditor的人进行编辑,例如:

function getCMSFields() {
    $fields = parent::getCMSFields();
    $config = GridFieldConfig_RelationEditor::create(10);
    $fields->addFieldToTab('Root.Content', new GridField('ContentSections', 'Content Sections', $this->ContentSections(), $config));
    return $fields;
}

我的问题是如何隐藏/删除CMS编辑器标签中不相关的has_one字段?编辑ContentSection时,Person和LandingPage关系下拉字段都会显示,无论是Person还是LandingPage。我只想显示相关的has_one关系字段。我尝试在has_many关系上使用点表示法:

class Person extends DataObject {
    protected static $has_many = array(
        'ContentSections'   => 'ContentSection.Person'
    );
}

我还尝试在removeFieldFromTab类的getCMSFields方法中使用ContentSection方法,我在其中定义了ContentSection的其他CMS字段:

$fields->removeFieldFromTab('Root.Main', 'Person');

1 个答案:

答案 0 :(得分:7)

而不是removeFieldFromTab使用removeByName功能。如果没有removeFieldFromTab标签,'Root.Main'将无效。

我们还删除了PersonID,而不是Personhas_one个变量的ID附加在变量名的末尾。

function getCMSFields() {
    $fields = parent::getCMSFields();

    $fields->removeByName('PersonID');
    $fields->removeByName('LandingPageID');

    return $fields;
}

如果您想有选择地隐藏或显示这些字段,可以在if函数中添加一些getCMSFields语句。

function getCMSFields() {
    $fields = parent::getCMSFields();

    if (!$this->PersonID) {
        $fields->removeByName('PersonID');
    }

    if (!$this->LandingPageID) {
        $fields->removeByName('LandingPageID');
    }

    return $fields;
}