2015-09-05 42 views
0

我试图根据SilverStripe中的几个条件动态更改字段的类型。如何动态更改SilverStripe中字段的类型

我有一个字段,例如CheckboxField()我需要复制和改变其他类型的东西,例如DropdownField()或任何其他类型的字段。

有没有办法做到这一点之前,对象被推到窗体和最佳做法是什么?

+1

这是用于后端SilverStripe CMS(又名'getCMSFields')还是其他?它应该像'CheckboxField'的removeByName一样简单,然后'addFieldToTab'(或'push')你想要的任何新字段。如果它是'getCMSFields',你能告诉我们你现在有什么,所以我们可以创建一个适合你的问题的答案吗? – Turnerj

+0

当你回到我之前的问题时,你打算如何存储不同的数据?我打算假设你的意图是将数据存储为不同的数据库或'has_one'属性?只需向我们提供一点信息:) – Turnerj

+0

@Turnerj它是一个前端用户表单...表单。我创建了一个自定义字段,可以更改为任何其他类型的字段,但我不确定如何正确执行此部分。 – Mediabeastnz

回答

1

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

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

这样做的一个问题是'CheckboxField'从根本上存储了不同于DropdownField的数据。他很可能需要使用不同的DB属性。所以尽管他仍然可以利用'replaceField'函数,他可能需要为'DropdownField'命名一个不同的名称。 – Turnerj

+0

您可能更适合使用显示逻辑https://github.com/unclecheese/silverstripe-display-logic您可以根据特定条件隐藏和显示字段,例如,如果选中复选框,则可以显示下拉字段。 –

0

你可以在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; 
} 

希望它能帮助。

+0

虽然这是一个潜在的解决方案,但如果这是针对'ModelAdmin'中的'DataObject',则该字段实际上已经存在,原因是脚手架,因此您的示例将再次添加该字段。也正如我在其他答案中提到的那样,它存在一个根本的存储缺陷,即DropdownField存储的数据不是“CheckboxField”。你的CheckboxField将值转换为“0”或“1”,所以即使从源列表中传递第一个名字,它也不会按照预期存储在MyField属性中。 – Turnerj

+0

我现在正在这样做(请参阅上面的链接),但不确定这是否是最佳实践方式? – Mediabeastnz

+0

@Turnerj您可以在条件之前使用'removeByName'删除该字段。 'DropdownField'不存储任何数据,它不是'DBField',而是'FormField'。 'MyField'可以继承'TextField'并用于保存从下拉列表或复选框中选择的值。在写入数据库之前,您甚至可以使用函数'onBeforeWrite'来操作该值。 – cbarberis

相关问题