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

Ste*_*ano 6 crud playframework

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

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

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

class public A extends Model {
    public String name;
    @ManyToOne
    public A a;
    @ManyToOne
    public B b;
}
Run Code Online (Sandbox Code Playgroud)

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

/A/{id}/B/               somecontroller
/A/{id}/C/               some(other?)controller
Run Code Online (Sandbox Code Playgroud)

甚至更好:

/A/{id}/{submodel}/      somecontroller
Run Code Online (Sandbox Code Playgroud)

并在相应的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}
Run Code Online (Sandbox Code Playgroud)

当"对象"不是"B"或"C"的实例,但"一",我可以告诉#{crud.form /}它应该映射哪个模型(在这种情况下,"B")

有没有办法实现类似的东西?

问题可以解决:

  • 有没有简单的#{form MODEL} #{/form}标签?!

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

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

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

相关:如何在playframework中为模型创建html表单

我也刚刚发现这个google邮件线程似乎进入了custom-crud方向.我希望能为这种典型需求提供更加开箱即用的解决方案......

Ste*_*ano 10

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

它就像使用一样简单:

显示Model类的创建形式.

#{crud.form class:'models.ModelName' /} 
Run Code Online (Sandbox Code Playgroud)

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

#{curd.form object:anyInstance /} 
Run Code Online (Sandbox Code Playgroud)

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

在您的模板中

#{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}
Run Code Online (Sandbox Code Playgroud)

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

在你的Controller.Action中

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

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

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

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