如何在 SilverStripe 中动态更改字段的类型

How to dynamically change a Field's Type in SilverStripe

我正在尝试根据 SilverStripe 中的一些条件动态更改字段的类型。

我有一个字段,例如CheckboxField() 我需要复制并将其类型更改为其他内容,例如DropdownField() 或任何其他类型的字段。

有没有办法在将对象推送到表单之前执行此操作,这里的最佳做法是什么?

您可以使用 replaceField http://api.silverstripe.org/3.1/class-FieldList.html#_replaceField

function getCMSFields() {
  $fields = parent::getCMSFields();
  $fields->replaceField('MyField', DropdownField::create('MyField', 'My field'));
  return $fields;
}

您可以在 getCMSField 中添加条件

function getCMSFields() {
    $fields = parent::getCMSFields();
    $source = SomeDataObject::get();
    $fields->removeByName('MyField');
    if($source->count() > 1) {
        $fields->addFieldToTab('MyTab', DropdownField::create('MyField', 'My field', $source->map()->toArray()));
    } else {
        $fields->addFieldToTab('MyTab', CheckboxField::create('MyField', 'My field', $source->first()->Name));
    }
    return $fields;
}

希望对您有所帮助。