Playframework CRUD表单和控制器的高级定制

Playframework CRUD表单和控制器的高级定制,playframework,crud,Playframework,Crud,我要寻找的是能够快速(干式!)为给定模型生成表单,但控制方式不如使用CRUD表单/模型;例如,能够在没有完整crud控制器/路由的情况下使用crud标记,或者通过强烈自定义它们 让我通过一个例子来解释 我有一个模型a而不是链接(多通)到2个模型B和C class public A extends Model { public String name; @ManyToOne public A a; @ManyToOne public B b; } 我希望能

我要寻找的是能够快速(干式!)为给定模型生成表单,但控制方式不如使用CRUD表单/模型;例如,能够在没有完整crud控制器/路由的情况下使用crud标记,或者通过强烈自定义它们

让我通过一个例子来解释

我有一个模型a而不是链接(多通)到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.name
#{表单操作:@save(object.b._key()),enctype:'multipart/form data'}
#{crud.form object.b/}

#{/form}
其中“object”不是“b”或“c”实例,而是“a”,我可以告诉
{crud.form/}
它应该映射哪个模型(在本例中为“b”)

有没有办法达到类似的效果

这个问题可以通过以下方式解决:

  • 有没有简单的
    {formmodel}{/form}
    标记
或者,通过某种方式定制更多的积垢,例如

  • 有没有办法修改主crud模块并只覆盖所需的方法(而不复制所有方法!)
我担心我不能通过简单地重写模型CRUD控制器来实现这个目标,也许我错了,但是除了阅读CRUD代码(我正在这么做)之外,官方文档对哪些方法可以被重写以及如何

相关的:

我还发现,这似乎是在自定义积垢的方向。我希望能有一个更现成的解决方案来满足这种典型的需求…

我从中找到了我想要的答案。。所有的东西都已经存在了,尽管没有记录

它与使用一样简单:

显示模型类的创建窗体

#{crud.form class:'models.ModelName' /} 
显示任何现有实例的编辑表单

#{curd.form object:anyInstance /} 
然后您可以随心所欲,但这是我编辑现有对象的模式:

在模板中 这当然是一个简化的代码,但是当我快速地需要将表单嵌入到视图中并且不能/不想使用整个CRUD系统时,我真的很喜欢这种模式

[编辑]更高级的自定义积垢 crud标签实际上不需要crud模块。
如此之多,我最终将它们复制到了我的项目中,对它们进行了黑客攻击,以添加额外的酷功能,例如能够将表单中的对象名称从默认的“对象”更改为“对象”(我决定覆盖原始对象,但您可以使用不同于
tags/crud
的文件夹来进行名称空间设置)

我想使用网格系统对齐表单。我可以通过在crud表单中的字段中添加类似于
class=“span4”
的内容来进行更深入的研究吗?@thangguyen当然可以!我通常会根据需要修改这个简单的代码片段,并且我有一组基于Twitter引导表单的模板,所以只需满足您的需要!如果你正确地构造它们,你可以得到一个漂亮的
bootstrap.crud.*
vs
crud.*
vs
sencha.crud.
等等…亲爱的Stefano。非常感谢您的回复。但请原谅我的愚蠢,因为我对Java和Play相当业余!。您能告诉我如何在不使用CRUD控制器的情况下一步一步地将类添加到表单中吗?在视图中,我调用了
#{crud.form类:'models.MyModel'/}
,它看起来是标准表单。如何自定义此表单?我使用的是Play 1.2.5。@ThangNguyen这完全超出了评论的范围,因此我建议你问一个新问题;但简而言之,请遵循我最后一段中的建议:将crud模块HTML文件从Play项目复制到您自己的项目(或模块)中,然后您可以编辑表单和每个单独的小部件模板,完全按照您的需要定制HTML
#{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}
function static void Action(routeParams, MyModel object) {
    some validation;
    object.save();
    render or renderTemplate or other action for redirect;
}