摘要:自定義編輯區(qū)域在前一章,我們給創(chuàng)建了一個(gè)關(guān)于面板,并準(zhǔn)備了我的文章的部分。從文章列表開(kāi)始我們僅需要查詢(xún)用戶(hù)相關(guān)的文章并顯示出來(lái)。如果發(fā)生錯(cuò)誤,它會(huì)刷新表單,顯示錯(cuò)誤信息。它表示使用的默認(rèn)模板。這意味著,如果提交了參數(shù),將選擇這條路由。
自定義編輯區(qū)域
在前一章,我們給yabe創(chuàng)建了一個(gè)關(guān)于面板,并準(zhǔn)備了“我的文章”的部分。每個(gè)作者可以在這個(gè)部分看到他們發(fā)布過(guò)的文章,以及進(jìn)行編輯或者創(chuàng)建新的文章。
我們可以重用CRUD模塊來(lái)實(shí)現(xiàn)這部分。但是這里我們打算從頭開(kāi)始,因?yàn)槲覀冃枰S多自定義的設(shè)置。
從文章列表開(kāi)始我們僅需要查詢(xún)用戶(hù)相關(guān)的文章并顯示出來(lái)。這很簡(jiǎn)單。從改進(jìn)Admin.index action開(kāi)始吧:
public static void index() { String user = Security.connected(); Listposts = 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"} #{/list}
看看第一步的成果:
發(fā)布文章界面我們將創(chuàng)建一個(gè)用于發(fā)布文章的界面。一般對(duì)于一個(gè)表單,你可以做兩件事:顯示它,處理它提交的結(jié)果。讓我們創(chuàng)建Admin.form"和Admin.save`來(lái)幫助顯示和處理提交結(jié)果。
添加新的路由到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 }
然后是創(chuàng)建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的鏈接:
... ...
檢查成果:
現(xiàn)在我們來(lái)完成處理提交結(jié)果的。它將創(chuàng)建一個(gè)新的Post對(duì)象,轉(zhuǎn)換標(biāo)簽列表成真正的Tag列表,并驗(yàn)證所有成員,進(jìn)行保存。如果發(fā)生錯(cuò)誤,它會(huì)刷新表單,顯示錯(cuò)誤信息。
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")的縮寫(xiě)。它表示使用form action的默認(rèn)模板。
測(cè)試一下!
重用發(fā)布文章的代碼在發(fā)布文章的地方,我們已經(jīng)寫(xiě)了不少的HTML表單和Java action代碼。但我們還需要實(shí)現(xiàn)編輯現(xiàn)有文章的修改功能。只需改動(dòng)一下,我們可以重用原來(lái)的代碼。
首先我們需要Admin.form可以查詢(xún)到一個(gè)現(xiàn)有的Post:
public static void form(Long id) { if(id != null) { Post post = Post.findById(id); render(post); } render(); }
如你所見(jiàn),我們把查詢(xún)功能變成可選的,僅當(dāng)id參數(shù)不為空,才會(huì)去查詢(xún)一個(gè)現(xiàn)有文章。所以你可以鏈接主頁(yè)面的文章列表到編輯表單。修改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"} #{/list}
非常簡(jiǎn)單,但是有一個(gè)問(wèn)題。如果你查看這些鏈接生成的URL,會(huì)看到:
/admin/new?id=3
它能用,但是不是很好。我們可以指定另一個(gè)路由。如果指定了id參數(shù),就用新的路由。
GET /admin/myPosts/{id} Admin.form GET /admin/new Admin.form
如你所見(jiàn),我們?cè)谂f的路由之上定義新路由,所以它的優(yōu)先級(jí)更高。這意味著,如果提交了id參數(shù),Play將選擇這條路由。如果不是,它就選擇原來(lái)那條。
刷新My posts頁(yè)面,你應(yīng)該能看到URL的變化。
現(xiàn)在我們需要修改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}
如你所見(jiàn),如果id參數(shù)存在,我們將用它作為提交表單的第一個(gè)參數(shù)。所以假如這個(gè)文章具有id的值(意味著它已經(jīng)存在在系統(tǒng)中),Admin.save就會(huì)被調(diào)用。
現(xiàn)在我們改變save()方法,讓它同時(shí)能處理創(chuàng)建和修改文章的情況:
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(); }
一如之前那樣,我們需要定義多一個(gè)更合適的路由,還是用之前的方式:
POST /admin/myPosts/{id} Admin.save POST /admin/new Admin.save
完成了!現(xiàn)在我們可以用同一個(gè)方法來(lái)創(chuàng)建新的文章,或者修改舊的文章,而且管理面板也完成了!
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/64095.html
摘要:確保你的文本編輯器已經(jīng)做了相應(yīng)的配置。第一個(gè),會(huì)自動(dòng)監(jiān)測(cè)源代碼的改變并在運(yùn)行時(shí)自動(dòng)重載。檢查下面的一行是否出現(xiàn)在應(yīng)用日志中使用版本控制系統(tǒng)來(lái)追蹤變化當(dāng)你開(kāi)發(fā)一個(gè)項(xiàng)目時(shí),最好使用版本控制系統(tǒng)來(lái)存儲(chǔ)你的源代碼。 Play是一個(gè)Java Web敏捷開(kāi)發(fā)的框架http://www.playframework.com/documentation/1.2.7/home 之所以要翻譯這個(gè)教程,是因...
摘要:通過(guò)來(lái)實(shí)現(xiàn)一個(gè)基本的管理面板目前,我們還沒(méi)法使用博客的來(lái)寫(xiě)新的文章,或修改評(píng)論。提供了一個(gè)即開(kāi)即用的模塊,可以快速生成一個(gè)基本的管理面板。這是因?yàn)槟J(rèn)是以的輸出來(lái)得到一個(gè)模型對(duì)象的表示。在本教程的最后一章,你會(huì)學(xué)到關(guān)于本地化信息的更多東西。 通過(guò)CRUD來(lái)實(shí)現(xiàn)一個(gè)基本的管理面板 目前,我們還沒(méi)法使用博客的UI來(lái)寫(xiě)新的文章,或修改評(píng)論。Play提供了一個(gè)即開(kāi)即用的CRUD模塊,可以快速...
摘要:添加驗(yàn)證既然我們有一個(gè)管理面板,自然需要進(jìn)行驗(yàn)證。自定義驗(yàn)證過(guò)程你可以用應(yīng)用提供的實(shí)例來(lái)自定義驗(yàn)證過(guò)程。通過(guò)繼承自該類(lèi),我們可以指定驗(yàn)證用戶(hù)的方式。這個(gè)將給每個(gè)作者發(fā)布自己的文章的權(quán)限。現(xiàn)在在添加到控制器的鏈接接下來(lái)是創(chuàng)建模板。 添加驗(yàn)證 既然我們有一個(gè)管理面板,自然需要進(jìn)行驗(yàn)證。幸運(yùn)的是,Play已經(jīng)提供了一個(gè)叫做Secure的模塊來(lái)幫助我們。 啟動(dòng)Secure模塊 在yabe/co...
摘要:對(duì)的詳細(xì)配置已經(jīng)超出了本教程的范圍,但大體上看上去像這樣然后在中加入下面一行,讓本地的反向代理能夠連接上你的應(yīng)用這才只是個(gè)開(kāi)始如果一路上你一直跟著本教程,你應(yīng)該已經(jīng)懂得如何開(kāi)發(fā)一個(gè)應(yīng)用了。 部署應(yīng)用 如今我們已經(jīng)完成了博客引擎了。讓我們來(lái)看一下一些部署Play應(yīng)用的步驟。 定義一個(gè)框架ID 一般,你需要部署你的應(yīng)用到一臺(tái)跟開(kāi)發(fā)時(shí)不一樣的電腦。這臺(tái)電腦(很有可能是臺(tái)服務(wù)器)上面的P...
摘要:所以任務(wù)會(huì)在第一個(gè)請(qǐng)求時(shí)同步執(zhí)行。修改來(lái)展示這些對(duì)象你可以閱讀模板是怎么工作的。標(biāo)簽只有兩個(gè)參數(shù)用于展示的文章對(duì)象以及展示的模式可以是全文,全文附評(píng)論,預(yù)告中的一種現(xiàn)在我們可以將冗余代碼替換成標(biāo)簽,重寫(xiě)主頁(yè)重載頁(yè)面,檢查是否一切安好。 建立第一個(gè)頁(yè)面 既然我們完成了數(shù)據(jù)模型的初步定義,是時(shí)候開(kāi)始創(chuàng)建應(yīng)用的頁(yè)面了。這個(gè)頁(yè)面將僅僅展示最近的博文,以及一個(gè)舊文章的列表。 下面是我們想要實(shí)...
閱讀 2022·2023-04-25 23:30
閱讀 1452·2021-11-24 10:18
閱讀 3069·2021-10-09 09:54
閱讀 2017·2021-10-08 10:05
閱讀 3431·2021-09-23 11:21
閱讀 3161·2019-08-30 15:52
閱讀 1560·2019-08-30 13:05
閱讀 1056·2019-08-30 13:02