2017-01-24 61 views
1

我必須有與之關聯的價格等級數DataObjects共享。我可以在另一個DataObject中建立這種關係,但是這些層次不會改變,我認爲最好的方法是在config.yml中定義它們。枚舉列表與多個數據對象

理想我想定義DataObject,如:

private static $db = array(
    'Price' => 'Enum(array("Tier 1", "Tier 2"))' 
) 

但是我不能想辦法在SilverStripe正確做到這一點有像yaml維修單點。我也想過把它設置爲Varchar,並在設置之前檢查它是否在數組中,但是這不會允許通過枚舉填充列表等等(可能應該調用配置)。我也可以寫出陣列,但至少有兩個地方可能會難以維護。

什麼做什麼,我試圖實現這幾個對象引用數組在一個地方設置的最佳方式?

回答

3

正如其他答案所示,您可以通過多種方式來實現。在一個項目中我的工作,比如我有類似以下的東西:

// You need to put this into a _config.php. It copies the definition 
// of DataObject2.Field2 into DataObject1.Field1. 
$cfg = Config::inst(); 
$db = $cfg->get('DataObject1', 'db'); 
$db['Field1'] = $cfg->get('DataObject2', 'db')['Field2']; 
$db = $config->update('DataObject1', 'db', $db); 

但在我看來,最好的解決方法是定義一個新的類,類似:

class MyEnum extends Enum 
{ 
    /** 
    * Enum values. 
    * @config 
    */ 
    private static $values; 

    public function __construct($name = null, $default = null) 
    { 
     parent::__construct($name, $this->config()->get('values'), $default); 
    } 
} 

後你可以在普通的YAML定義的值:

MyEnum: 
    values: 
    - First 
    - Second 
    ... 
+0

我認爲我喜歡你的延伸,這是所有可能的答案中最重要的。看起來非常可重用。我想在我的分貝然後我只有「價格」=>「MyEnum」? – Rudiger

+0

是的。我想你也可以指定默認值,如果相關,例如'MyEnum( 「默認值」)'。 – ntd

1

我不是100%肯定你問什麼,但如果它是類的標題,你就問你是否能在YAML定義枚舉數據庫字段值是 - 您可以:

MyDataObject: 
    db: 
    Price: Enum("Tier 1,Tier 2") 

什麼你不能做是從其他配置源(包括私人靜態)來枚舉增加更多的價值,因爲枚舉值作爲一個字符串,而不是一個YAML陣列處理。


如果你的問題是「我可以定義一個通用配置$db和使用多個數據對象」,那麼YAML辦法(配置一般)將行不通,因爲配置值與類並且在此過程中被解析的時間早於DataObject::database_fields告訴數據庫模式要做什麼。

+0

是的,我想我的問題是:「我可以定義一個通用配置$ DB和使用多個數據對象」 – Rudiger

+1

呀,沒有:)至於@w mk建議,最好給所有對象一個has_one給包含該公共配置的模型,然後根據您在* config中預定義的值驗證任何寫入* model –

1

當然,你可以添加和在你的配置陽明像覆蓋$db鍵:

MyDataObject: 
    db: 
    Price: "Enum('Tier 1,Tier 2,Tier 3', 'Tier 3')" 

只是一定要使用right syntax for Enum,很容易與舊的逗號分隔的語法。在上面的例子中,「Tier 3」是默認的。

隨着陽明當您使用腳手架這就可能打破順序定義它,還沒有測試過這個。

您也可以考慮使用一個HAS_ONE關係到一個簡單的數據對象來代替。您可以在ModelAdmin中進行管理,並且稍後可能更容易進行翻譯。 QuickAddNew module也是在下拉菜單下飛行時添加新DO的好幫手。

+0

數據對象仍然會有一個表雖然不是嗎? – Rudiger

+1

當然,這是另一個(非常簡單)的表,但我認爲這不是性能殺手。聽起來有點複雜,但稍後會變得方便。當你試圖讓它「可配置/靈活」時,這可能是值得的。使用PopulateDefaults(),你也可以預先填充表格。如果枚舉的值是「內容」類型,它也可能在數據庫中。 – wmk

+0

是啊,我在一個表不希望它的理由是,對於一線的價格將在轉換表中定義(如層將直接關係到國家,他們都在)。由於價格是在陽明定義我認爲這將是反有層次的名單在DB – Rudiger

2

你可以通過創建一個DataExtension並將其應用到所有你想添加的字段的數據對象應用相同的數據庫字段到多個數據對象。

+0

好點,而且可以用YAML完成 –