在Play中高级自定义CRUD表单和控制器

时间:2011-12-31 00:31:25

标签: playframework crud

我正在寻找的是快速(干!)为给定模型生成表单的能力,但是使用CRUD表单/模型的控制方式较少;例如,通过能够使用没有完整的crud控制器/路由的crud标签,或通过强烈定制它们。

让我通过一个例子来解释。

我有一个模型A而不是链接(ManyToOne)到2个模型,B和C

class public A extends Model {
    public String name;
    @ManyToOne
    public A a;
    @ManyToOne
    public B b;
}

我希望能够写出以下路线:

/A/{id}/B/               somecontroller
/A/{id}/C/               some(other?)controller

甚至更好:

/A/{id}/{submodel}/      somecontroller

在相应的html视图中可以执行以下操作:

<div>object.name</div>

#{form action:@save(object.b._key()), enctype:'multipart/form-data'}
    #{crud.form object.b /}
    <p class="crudButtons">
        <input type="submit" name="_save" value="&{'crud.save', type.modelName}" />
        <input type="submit" name="_saveAndContinue" value="&{'crud.saveAndContinue', type.modelName}" />
    </p>
#{/form}

'object'不是“b”或“c”实例,而是“a”,我可以告诉#{crud.form /}它应该映射哪个模型(在这种情况下,'b')

有没有办法实现类似的目标?

问题可以解决:

  • 是否有任何简单的#{form MODEL} #{/form}代码?!

或者,通过能够以某种方式定制更多的CRUD,例如。

  • 有没有办法修改主crud模块并只覆盖所需的方法(不复制所有方法!)?

恐怕我无法通过简单地覆盖模型CRUD控制器来实现这个目标,也许我错了但是除了阅读CRUD代码(我正在做)之外,官方文档对于哪些方法有点限制可以被覆盖以及如何......

相关:how to create an html form for a model in playframework

我还发现this google mail thread似乎是在自定义方向上。我希望能为这种典型的需求提供更加开箱即用的解决方案......

1 个答案:

答案 0 :(得分:10)

我在play! google group thread找到了我正在寻找的答案......一切都已经存在,虽然没有记载!

就像使用一样简单:

显示Model类的创建形式。

#{crud.form class:'models.ModelName' /} 

显示任何现有实例的版本形式

#{curd.form object:anyInstance /} 

然后你可以按照自己的意愿去,但这是我编辑现有对象的模式:

在您的模板中

#{form @Controller.Action, method="POST" ... }

<input type="hidden" name="object.id" value="${myobject.ID}" />
#{crud.form object:gun.gunEngraving}
#{/crud.form}
<p>
<input type="submit" value="Save Changes" />
</p>
#{/form}

隐藏输入设置特殊的“id”字段,以便:

在您的Controller.Action

function static void Action(routeParams, MyModel object) {
    some validation;
    object.save();
    render or renderTemplate or other action for redirect;
}

这当然是一个简化的代码,但我真的很喜欢这种模式,因为我很快就需要将一个表单嵌入到视图中而不能/不想使用整个CRUD系统!

[编辑]更高级的自定义CRUD善良

crud标签实际上不需要crud模块。 这么多,我最终将它们全部复制到我的项目中,攻击它们以添加其他很酷的功能,例如能够从默认的“对象”更改表单中对象的名称(我决定覆盖原件,但是您可以使用与tags/crud不同的文件夹来创建自己的文件夹

相关问题