如何在 SilverStripe ModelAdmin 中动态 show/hide 字段
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
模块解决了这个问题。
我在 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
模块解决了这个问题。