2012-05-04 53 views
3

我試圖得到一個更好的設置用於更新與嵌套屬性的模型工作。cfwheels - 更新嵌套屬性與複合鍵表

現在在我的編輯視圖我定義textFieldTag手動創建通過設置名稱"myModel[myNestedProperty][#modelID#,#key2id#][name]"

在更新動作

的PARAMS結構...

如果我只是用myModel.update(params.myModel)我不能如果有任何需要刪除的元素,則可以使更新工作

因此,我銷燬了與myModel具有相同標識的嵌套屬性的所有模型,在這種情況下它可以工作。

的缺點是,如果更新失敗,嵌套的屬性都消失了。

我試過在刪除它們之前先抓住所有模型,然後將它們加入.save,但由於某些原因,這不起作用。

看起來像cfwheel是爲這種類型的複選框的關係設置,但我需要它與文本字段並選擇我的表單中的項目。


更新

我意識到,我有另外一個問題。從本質上講,我想在這個擴大到能夠跨越多個嵌套的屬性和關係使用它。

的問題是在我的方式設置的名稱特別是對於選擇下拉菜單:

name="myModel[myNestedProperty][#modelID#, ][nestedID]"

的問題是,第二個ID不能聲明,因爲它會被指定爲ID,而不是使用我選擇的價值。

說實話,這是我一直與我一直爭鬥的一個問題。我處理它通過在控制器再生的模型,我只是忘了我還沒有解決這個問題呢。

有沒有一種方法,我可以讓這些值根本不被使用,並讓它們從結構動態填充?

比方說,我有(截斷)名稱tcat[34,0][catID]tcat[34,][catID](其中catID應該是第二個ID)。

的PARAMS'獲取生成TCAT結構是

[34,0]{catID = 12,14,18} 

[34,]{catID = 12,14,18} 

我想要PARAMS' TCAT結構具有多個結構喜歡:

[34,12]{tID = 34; catID = 12} 
[34,14]{tID = 34; catID = 14} 
[34,18]{tID = 34; catID = 18} 

有沒有解決的辦法?

我正在處理大量的複合鍵嵌套屬性,如果我可以單獨使用這個部分,它會使它更容易。我知道一種方法是用javascript更新名稱,但我認爲這將是(非常非常)最後的手段。

+0

丹尼爾 - 對不起,你還沒有回答你的問題。我會與Stack Overflow之外的CF Wheels人員聯繫,看看我能否讓他暗示。你的問題相當複雜,但:) –

+0

用戶如何表示刪除?通過複選框?你使用什麼界面元素?需要更多關於您的具體情況的例子。 –

+0

如果一個字段留空'EQ'''那麼它不會被添加 – Daniel

回答

1

你可以試試這個嗎?

在父模型中設置一個回調,檢查name是否爲空,如果爲空,則標記爲刪除。

<cffunction name="init"> 
    ... 

    <!--- This could also be `beforeValidation` if you want to make `name` required for the child model ---> 
    <cfset beforeSave("$provisionMyNestedProperty")> 
</cffunction> 

<cffunction name="$provisionMyNestedProperty"> 
    <cfscript> 
     if (StructKeyExists(this, "myNestedProperty") && IsArray(this.myNestedProperty)) 
     { 
      for (local.i = 1; local.i <= ArrayLen(this.myNestedProperty); local.i++) 
      { 
       if (!StructKeyExists(this.myNestedProperty[local.i], "name") || !Len(Trim(this.myNestedProperty[local.i].name))) 
        this.myNestedProperty[local.i]._delete = true; 
      } 
     } 
    </cfscript> 
</cffunction> 

我會繼續編輯我的答案,直到我們可以敲出解決方案。希望這能給你一個好的開始。

+0

嗨克里斯,謝謝你幫我解決我的問題。我開始實施建議的解決方案,但事實證明我在這之前還有另一個相關的問題,我已經更新了我的問題。 – Daniel