我正在寻找的是快速(干!)为给定模型生成表单的能力,但是使用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代码(我正在做)之外,官方文档对于哪些方法有点限制可以被覆盖以及如何......
相关:how to create an html form for a model in playframework
我还发现this google mail thread似乎是在自定义方向上。我希望能为这种典型的需求提供更加开箱即用的解决方案......
答案 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”字段,以便:
function static void Action(routeParams, MyModel object) {
some validation;
object.save();
render or renderTemplate or other action for redirect;
}
这当然是一个简化的代码,但我真的很喜欢这种模式,因为我很快就需要将一个表单嵌入到视图中而不能/不想使用整个CRUD系统!
crud标签实际上不需要crud模块。
这么多,我最终将它们全部复制到我的项目中,攻击它们以添加其他很酷的功能,例如能够从默认的“对象”更改表单中对象的名称(我决定覆盖原件,但是您可以使用与tags/crud
不同的文件夹来创建自己的文件夹