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