3

我正在尝试获得更好的设置来更新具有嵌套属性的模型。

现在在我的编辑视图中,我手动定义 textFieldTag 以通过将名称设置为来创建 params 结构"myModel[myNestedProperty][#modelID#,#key2id#][name]"

在更新行动中...

如果我只是使用myModel.update(params.myModel),如果有任何需要删除的元素,我将无法使更新工作

所以我销毁了与 myModel 具有相同 id 的嵌套属性的所有模型,在这种情况下它可以工作。

缺点是如果更新失败,嵌套的属性就全部消失了。

在删除它们并对其进行 ing 之前,我尝试先获取所有模型.save,但由于某种原因,这不起作用。

看起来 cfwheel 是为这种与复选框的关系设置的,但我需要它来处理文本字段并在我的表单中选择项目。


更新

我意识到我还有另一个问题。本质上,我想对此进行扩展,以便能够在多个嵌套属性和关系中使用它。

问题在于我设置名称的方式,特别是对于选择下拉菜单:

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

问题是无法声明第二个 id,因为它将被分配为 id 而不是使用我选择的值。

老实说,这是我一直在努力解决的一个问题。我通过在控制器中重新生成模型来处理它,我只是忘记了我还没有解决这个问题。

有没有办法让这些值根本不被使用,并让它们从结构中动态填充?

假设我有(截断)一个名称tcat[34,0][catID]tcat[34,][catID],(其中 catID 应该是第二个 ID)。

生成的参数的 tcat 结构是

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

或者

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

我希望参数的 tcat 结构具有多个结构,例如:

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

有没有解决的办法?

我正在使用许多复合键嵌套属性,如果我可以让这部分单独工作,它会更容易。我知道一种方法是使用 javascript 更新名称,但我认为这将是(非常非常)最后的手段。

4

1 回答 1

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>

在我们找到解决方案之前,我将继续编辑我的答案。希望这能给你一个好的开始。

于 2012-05-18T13:04:02.797 回答