Silverstripe CMS:如何为BlogPost的Enum字段配置下拉选择字段?
解决SilverStripe中BlogPost标题颜色下拉字段配置问题
问题分析
SelectField是抽象类,无法直接实例化,所以注释的代码本身不可行。- 直接实例化
DropdownField时未传入枚举选项,导致下拉框为空;且push方法会把字段加到CMS字段列表末尾,不符合“标题下方添加”的需求。
两种可行解决方案
方案一:手动配置DropdownField选项并插入到标题下方
给DropdownField传入和Enum一致的选项数组,用insertAfter方法将字段放在Title字段后面:
class BlogPostExtension extends DataExtension { private static $db = [ 'ArchiveDate' => 'Date', 'TitleColor' => "Enum(array('black','red','green'))" ]; private static $defaults = [ 'TitleColor' => 'black' ]; public function updateCMSFields(FieldList $fields) { $fields->push(new DateField('ArchiveDate', 'Archive date')); // 配置下拉选项并插入到Title字段下方 $titleColorField = new DropdownField( 'TitleColor', 'Color', [ 'black' => '黑色', 'red' => '红色', 'green' => '绿色' // 可自定义选项的友好显示名称 ] ); $fields->insertAfter($titleColorField, 'Title'); } }
方案二:使用EnumField(推荐)
SilverStripe提供的EnumField会自动读取Enum字段定义的选项,无需手动配置,同样用insertAfter控制位置:
use SilverStripe\Forms\EnumField; // 引入对应命名空间 class BlogPostExtension extends DataExtension { private static $db = [ 'ArchiveDate' => 'Date', 'TitleColor' => "Enum(array('black','red','green'))" ]; private static $defaults = [ 'TitleColor' => 'black' ]; public function updateCMSFields(FieldList $fields) { $fields->push(new DateField('ArchiveDate', 'Archive date')); // 自动关联Enum选项,插入到Title字段下方 $titleColorField = new EnumField('TitleColor', 'Color'); $fields->insertAfter($titleColorField, 'Title'); } }
关键说明
- 若要给选项设置友好显示名称,方案一可直接自定义键值对;方案二则需修改Enum定义,例如
"Enum(array('black' => '黑色','red' => '红色','green' => '绿色'))"。 insertAfter($field, 'TargetFieldName')是将字段插入到指定字段之后的正确方法,push会把字段加到所有字段末尾,无法满足“标题下方添加”的需求。
内容的提问来源于stack exchange,提问作者user805528
相关产品推荐
相关产品推荐

