我在ModelAdmin中有一个Dataobject,其中包含以下字段:
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?
答案 0 :(得分:6)
您需要使用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;
}
答案 1 :(得分:1)
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
模块解决了这个问题。