如何在SilverStripe ModelAdmin中动态显示/隐藏字段


How to dynamically show/hide field in SilverStripe ModelAdmin

我在ModelAdmin中有一个数据对象,包含以下字段:

class NavGroup extends DataObject {
    private static $db = array(
        'GroupType' => 'Enum("Standard,NotStandard","Standard")',
        'NumberOfBlocks' => 'Int'
    );
    public function getCMSFields() {
        $groupTypeOptions = singleton('NavGroup')->dbObject('GroupType')->enumValues();
        $fields = parent::getCMSFields();
        $fields->addFieldToTab('Root.Main', new Dropdownfield('GroupType', 'Group Type', $groupTypeOptions));
        $fields->addFieldToTab('Root.Main', new Numericfield('NumberOfBlocks', 'Number of Blocks'));
        return $fields;
    }
}

如果GroupType == "Standard",我希望NumberOfBlocks字段自动隐藏,以便对用户隐藏。这应该是动态发生的。

这个功能在SilverStripe中可用吗?还是我需要添加一些自定义JavaScript?

您需要使用DisplayLogic模块。。。

https://github.com/unclecheese/silverstripe-display-logic

然后你的函数可以写成…

public function getCMSFields() {
    $fields = parent::getCMSFields();
    $fields->addFieldsToTab('Root.Main',array(
        Dropdownfield::create('GroupType', 'Group Type', singleton('NavGroup')->dbObject('GroupType')->enumValues())),
        Numericfield::create('NumberOfBlocks', 'Number of Blocks')
            ->displayIf('GroupType')->isEqualTo('Standard')
    ));
    return $fields;
}

每个对getCMSFields()的请求都使用当前对象状态,因此您可以对这种情况执行简单的if statement

public function getCMSFields() {
    $groupTypeOptions =  singleton('NavGroup')->dbObject('GroupType')->enumValues();
    $fields = parent::getCMSFields();
    $fields->addFieldToTab('Root.Main', new Dropdownfield('GroupType', 'Group Type', $groupTypeOptions));
    if ($this->GroupType === 'Standard') {
        $fields->addFieldToTab('Root.Main', new Numericfield('NumberOfBlocks', 'Number of Blocks'));
    } else {
        $fields->addFieldToTab('Root.Main', new HiddenField('NumberOfBlocks', $this->NumberOfBlocks);
    }
    return $fields;
}

但是,更改GroupType不会更新字段,您需要保存表单才能触发更新。unclecheese/silverstripe-display-logic模块解决了这个问题。