资讯专栏INFORMATION COLUMN

[翻译]Play框架1.2.7版本教程(9) - 自定义编辑区域

tianren124 / 1013人阅读

摘要:自定义编辑区域在前一章,我们给创建了一个关于面板,并准备了我的文章的部分。从文章列表开始我们仅需要查询用户相关的文章并显示出来。如果发生错误,它会刷新表单,显示错误信息。它表示使用的默认模板。这意味着,如果提交了参数,将选择这条路由。

自定义编辑区域

在前一章,我们给yabe创建了一个关于面板,并准备了“我的文章”的部分。每个作者可以在这个部分看到他们发布过的文章,以及进行编辑或者创建新的文章。

我们可以重用CRUD模块来实现这部分。但是这里我们打算从头开始,因为我们需要许多自定义的设置。

从文章列表开始

我们仅需要查询用户相关的文章并显示出来。这很简单。从改进Admin.index action开始吧:

public static void index() {
    String user = Security.connected();
    List posts = Post.find("author.email", user).fetch();
    render(posts);
}

并完成yabe/app/views/Admin/index.html:

#{extends "admin.html" /}

Welcome ${user}, you have written ${posts.size() ?: "no"} ${posts.pluralize("post", "posts")} so far

#{list items:posts, as:"post"}

${post.title}

#{/list}

+ write a new post

看看第一步的成果:

发布文章界面

我们将创建一个用于发布文章的界面。一般对于一个表单,你可以做两件事:显示它,处理它提交的结果。让我们创建Admin.form"和Admin.save`来帮助显示和处理提交结果。

添加新的路由到yabe/conf/routes:

GET     /admin/new                          Admin.form
POST    /admin/new                          Admin.save

接着给Admin.java控制器添加form()save()

public static void form() {
    render();
}

public static void save() {
    // Not implemented yet
}

然后是创建yabe/app/views/Admin/form.html模板:

#{extends "admin.html" /}

Write, a new post

#{form @save()} #{ifErrors}

Please correct these errors.

#{/ifErrors}

#{field "title"} #{error "post.title" /} #{/field}

#{field "content"} #{error "post.content" /} #{/field}

#{field "tags"} #{/field}

#{/form}

最后修改yabe/app/views/Admin/index.html,给表单添加Write a new post的链接:

...

+ write a new post

...

检查成果:

现在我们来完成处理提交结果的。它将创建一个新的Post对象,转换标签列表成真正的Tag列表,并验证所有成员,进行保存。如果发生错误,它会刷新表单,显示错误信息。

public static void save(String title, String content, String tags) {
    // Create post
    User author = User.find("byEmail", Security.connected()).first();
    Post post = new Post(author, title, content);
    // Set tags list
    for(String tag : tags.split("s+")) {
        if(tag.trim().length() > 0) {
            post.tags.add(Tag.findOrCreateByName(tag));
        }
    }
    // Validate
    validation.valid(post);
    if(validation.hasErrors()) {
        render("@form", post);
    }
    // Save
    post.save();
    index();
}
  

这里我们使用render("@form")作为render("Admin/form.html")的缩写。它表示使用form action的默认模板。

测试一下!

重用发布文章的代码

在发布文章的地方,我们已经写了不少的HTML表单和Java action代码。但我们还需要实现编辑现有文章的修改功能。只需改动一下,我们可以重用原来的代码。

首先我们需要Admin.form可以查询到一个现有的Post

public static void form(Long id) {
    if(id != null) {
        Post post = Post.findById(id);
        render(post);
    }
    render();
}

如你所见,我们把查询功能变成可选的,仅当id参数不为空,才会去查询一个现有文章。所以你可以链接主页面的文章列表到编辑表单。修改yabe/app/views/Admin/index.html

#{extends "admin.html" /}

Welcome ${user}, you have written ${posts.size() ?: "no"} ${posts.pluralize("post", "posts")} so far

#{list items:posts, as:"post"}

${post.title}

#{/list}

+ write a new post

非常简单,但是有一个问题。如果你查看这些链接生成的URL,会看到:

/admin/new?id=3

它能用,但是不是很好。我们可以指定另一个路由。如果指定了id参数,就用新的路由。

GET     /admin/myPosts/{id}                 Admin.form
GET     /admin/new                          Admin.form

如你所见,我们在旧的路由之上定义新路由,所以它的优先级更高。这意味着,如果提交了id参数,Play将选择这条路由。如果不是,它就选择原来那条。

刷新My posts页面,你应该能看到URL的变化。

现在我们需要修改yabe/app/views/Admin/form.html

#{extends "admin.html" /}

#{ifnot post?.id}
    

Write, a new post

#{/ifnot} #{else}

Edit, this post

#{/else} #{form @save(post?.id)} #{ifErrors}

Please correct these errors.

#{/ifErrors}

#{field "title"} #{error "post.title" /} #{/field}

#{field "content"} #{error "post.title" /} #{/field}

#{field "tags"} #{/field}

#{/form}

如你所见,如果id参数存在,我们将用它作为提交表单的第一个参数。所以假如这个文章具有id的值(意味着它已经存在在系统中),Admin.save就会被调用。

现在我们改变save()方法,让它同时能处理创建和修改文章的情况:

public static void save(Long id, String title, String content, String tags) {
    Post post;
    if(id == null) {
        // Create post
        User author = User.find("byEmail", Security.connected()).first();
        post = new Post(author, title, content);
    } else {
        // Retrieve post
        post = Post.findById(id);
        // Edit
        post.title = title;
        post.content = content;
        post.tags.clear();
    }
    // Set tags list
    for(String tag : tags.split("s+")) {
        if(tag.trim().length() > 0) {
            post.tags.add(Tag.findOrCreateByName(tag));
        }
    }
    // Validate
    validation.valid(post);
    if(validation.hasErrors()) {
        render("@form", post);
    }
    // Save
    post.save();
    index();
}

一如之前那样,我们需要定义多一个更合适的路由,还是用之前的方式:

POST    /admin/myPosts/{id}                 Admin.save
POST    /admin/new                          Admin.save

完成了!现在我们可以用同一个方法来创建新的文章,或者修改旧的文章,而且管理面板也完成了!

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/64095.html

相关文章

  • [翻译]Play框架1.2.7版本教程(1)

    摘要:确保你的文本编辑器已经做了相应的配置。第一个,会自动监测源代码的改变并在运行时自动重载。检查下面的一行是否出现在应用日志中使用版本控制系统来追踪变化当你开发一个项目时,最好使用版本控制系统来存储你的源代码。 Play是一个Java Web敏捷开发的框架http://www.playframework.com/documentation/1.2.7/home 之所以要翻译这个教程,是因...

    solocoder 评论0 收藏0
  • [翻译]Play框架1.2.7版本教程(7) - 通过CRUD来实现一个基本的管理面板

    摘要:通过来实现一个基本的管理面板目前,我们还没法使用博客的来写新的文章,或修改评论。提供了一个即开即用的模块,可以快速生成一个基本的管理面板。这是因为默认是以的输出来得到一个模型对象的表示。在本教程的最后一章,你会学到关于本地化信息的更多东西。 通过CRUD来实现一个基本的管理面板 目前,我们还没法使用博客的UI来写新的文章,或修改评论。Play提供了一个即开即用的CRUD模块,可以快速...

    骞讳护 评论0 收藏0
  • [翻译]Play框架1.2.7版本教程(8) - 添加验证

    摘要:添加验证既然我们有一个管理面板,自然需要进行验证。自定义验证过程你可以用应用提供的实例来自定义验证过程。通过继承自该类,我们可以指定验证用户的方式。这个将给每个作者发布自己的文章的权限。现在在添加到控制器的链接接下来是创建模板。 添加验证 既然我们有一个管理面板,自然需要进行验证。幸运的是,Play已经提供了一个叫做Secure的模块来帮助我们。 启动Secure模块 在yabe/co...

    My_Oh_My 评论0 收藏0
  • [翻译]Play框架1.2.7版本教程(11) - 部署应用

    摘要:对的详细配置已经超出了本教程的范围,但大体上看上去像这样然后在中加入下面一行,让本地的反向代理能够连接上你的应用这才只是个开始如果一路上你一直跟着本教程,你应该已经懂得如何开发一个应用了。 部署应用 如今我们已经完成了博客引擎了。让我们来看一下一些部署Play应用的步骤。 定义一个框架ID 一般,你需要部署你的应用到一台跟开发时不一样的电脑。这台电脑(很有可能是台服务器)上面的P...

    Binguner 评论0 收藏0
  • [翻译]Play框架1.2.7版本教程(3) - 建立第一个页面

    摘要:所以任务会在第一个请求时同步执行。修改来展示这些对象你可以阅读模板是怎么工作的。标签只有两个参数用于展示的文章对象以及展示的模式可以是全文,全文附评论,预告中的一种现在我们可以将冗余代码替换成标签,重写主页重载页面,检查是否一切安好。 建立第一个页面 既然我们完成了数据模型的初步定义,是时候开始创建应用的页面了。这个页面将仅仅展示最近的博文,以及一个旧文章的列表。 下面是我们想要实...

    inapt 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<