2015-09-05 100 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

相關問題