我在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
模块解决了这个问题。