摘要:通過來實現一個基本的管理面板目前,我們還沒法使用博客的來寫新的文章,或修改評論。提供了一個即開即用的模塊,可以快速生成一個基本的管理面板。這是因為默認是以的輸出來得到一個模型對象的表示。在本教程的最后一章,你會學到關于本地化信息的更多東西。
通過CRUD來實現一個基本的管理面板
目前,我們還沒法使用博客的UI來寫新的文章,或修改評論。Play提供了一個即開即用的CRUD模塊,可以快速生成一個基本的管理面板。
啟動CRUD模塊一個Play應用可以由幾個模塊組裝起來。這使得你可以在不同應用間重用組件或分割一個大應用到幾個小的。
CRUD模塊是一個通用的應用,可以對模型類進行內省生成簡單的列表和表單。
要啟動CRUD模塊,在/conf/dependencies.yml的require后面添加一行:(注意play后面的箭頭兩邊需要留空格!)
require: - play - play -> crud
現在運行play dependencies命令,來解決新的模塊依賴關系。如果正用著IDE,你應該更新項目配置,來包括新的模塊依賴:比如,運行play eclipsify,在Eclipse里重新導入項目,然后按F5刷新項目。
然后這個模塊提供一系列現在就能用上的路由。要導入這些路由,在/yabe/conf/routes加入:
# Import CRUD routes * /admin module:crud
這將導入所有的CRUD路由,并以/admin作為URL前綴。
你需要重啟應用來使得新模塊的導入生效。
聲明CRUD控制器對于每個想集成到管理面板的模型,我們得聲明一個繼承自controllers.CRUD的控制器。這很簡單。
給每個模型創建各創建一個控制器。比如,對于Post類,在/yabe/app/controllers/Posts.java創建一個Posts控制器。
package controllers; import play.*; import play.mvc.*; public class Posts extends CRUD { }
默認控制器的命名,是其對應的模型的復數。這樣,Play就能自動搭配每個控制器和對應的模型。如果你需要指定特別的名字,你可以使用@CRUD.For注解。閱讀CRUD文檔。
同樣創建其他的控制器:
package controllers; import play.*; import play.mvc.*; public class Users extends CRUD { } package controllers; import play.*; import play.mvc.*; public class Comments extends CRUD { } package controllers; import play.*; import play.mvc.*; public class Tags extends CRUD { }
現在打開http://localhost:9000/admin/,你應該看到管理面板。
如果仔細看,你將注意到列表中對象的名字有點奇怪。這是因為默認是以toString()的輸出來得到一個模型對象的表示。
所以,通過提供定制的toString(),我們就能解決這個問題。舉個例子,對于User類:
… public String toString() { return email; } …添加驗證
通常使用管理面板的問題是,提交的表單沒有經過恰當的驗證。但因為CRUD模塊可以從驗證注解提取出驗證規則,所以如果模型類得到正確注解,就不會有問題。
讓我們給User類添加一些注解。
package models; import java.util.*; import javax.persistence.*; import play.db.jpa.*; import play.data.validation.*; @Entity public class User extends Model { @Email @Required public String email; @Required public String password; public String fullname; public boolean isAdmin; …
現在如果你來到User模型的編輯或創建表單,你將看到驗證規則已經魔法般添加進去了。
接下來是Post類:
package models; import java.util.*; import javax.persistence.*; import play.db.jpa.*; import play.data.validation.*; @Entity public class Post extends Model { @Required public String title; @Required public Date postedAt; @Lob @Required @MaxSize(10000) public String content; @Required @ManyToOne public User author; @OneToMany(mappedBy="post", cascade=CascadeType.ALL) public Listcomments; @ManyToMany(cascade=CascadeType.PERSIST) public Set tags; …
然后檢查結果:
這里你會看到一個有趣的副作用:@MaxSize驗證規則改變了Play顯示Post表單的方式。現在它給內容域準備的是textarea。
最后是給Comment和Tag類添加驗證規則。
package models; import java.util.*; import javax.persistence.*; import play.db.jpa.*; import play.data.validation.*; @Entity public class Tag extends Model implements Comparable{ @Required public String name; … package models; import java.util.*; import javax.persistence.*; import play.db.jpa.*; import play.data.validation.*; @Entity public class Comment extends Model { @Required public String author; @Required public Date postedAt; @Lob @Required @MaxSize(10000) public String content; @ManyToOne @Required public Post post; …
如你所見,表單標簽有點奇怪。Play使用Java成員變量作為表單標簽。要想自定義它,我們僅需在/yabe/conf/messages中提供一組標簽名。
事實上,你可以用一個多帶帶的messages文件對應應用支持的每種語言。比如,你可以把中文信息放入/yabe/conf/messages.zh。你將會在最后一章讀到如何進行本地化。
添加這些標簽到messages文件:
title=Title content=Content postedAt=Posted at author=Author post=Related post tags=Tags set name=Common name email=Email password=Password fullname=Full name isAdmin=User is admin
然后刷新表單,你將看到新的表單標簽:
自定義Comments列表你可以隨心所欲地自定義CRUD模塊。舉個例子,你不大可能覺得評論列表長得符合你的期望。我們還需要添加更多列,特別是“相關文章”列來幫助我們過濾評論。
事實上,由于你的應用才是老大,你可以覆蓋掉CRUD模塊提供的任意action和模板。舉個例子,如果我們想自定義評論列表,我們僅需提供/yabe/app/views/Comments/list.html模板。
在CRUD模塊啟動后,你就能使用更多的play命令。crud:ov命令幫助你覆蓋掉任意模板。在命令行里。輸入:
$ play crud:ov --template Comments/list
現在你有一個新的模板/yabe/app/views/Comments/list.html:
#{extends "CRUD/layout.html" /}&{"crud.list.title", type.name}
#{crud.search /}#{crud.table /}#{crud.pagination /}
首先看看&{"crud.list.title", type.name},這里輸出了鍵名為crud.list.title的本地化信息,使用type.name作為信息參數。CRUD模塊的conf/messages包括條目crud.list.title=&{%s},其中的參數作為另一個參數查找時的鍵,比如這里的&{"Comments"},因為type是一個models.Comments對應的CRUD.ObjectType。既然我們沒有定義對應的信息文件條目,默認會輸出信息鍵 - Comments。在本教程的最后一章,你會學到關于本地化信息的更多東西。
#{crud.table /}是生成表格的標簽。我們可以使用fields參數添加更多列。試一下這個:
#{crud.table fields:["content", "post", "author"] /}
現在我們有三列信息了:
有個問題,content域可能容不下有些過長的評論。我們需要指定#{crud.table /}能夠在需要的時候截短它。
使用#{crud.custom /}標簽,我們可以自定義每個域的展示方式:
#{crud.table fields:["content", "post", "author"]} #{crud.custom "content"} ${object.content.length() > 50 ? object.content[0..50] + "…" : object.content} #{/crud.custom} #{/crud.table}
自定義Posts表單是的,這里撒了些Groovy的語法糖。
我們也可以自定義生成的表單。舉個例子,原本我們在Post表單中輸入標簽并不容易。我們需要改善體驗。讓我們來重載掉Posts/show模板:
$ play crud:ov --template Posts/show
現在你有了/yabe/app/views/Posts/show.html:
#{extends "CRUD/layout.html" /}&{"crud.show.title", type.modelName}
#{form action:@save(object.id), enctype:"multipart/form-data"} #{crud.form /}#{form @delete(object.id)}#{/form}
#{/form}
你可以通過給#{crud.form /}標簽添加一個crud.custom標簽來自定義tags域:
#{crud.form} #{crud.custom "tags"}&{"tags"} #{list items:models.Tag.findAll(), as:"tag"} ${tag} #{/list}#{/crud.custom} #{/crud.form}
通過使用Javascript,我們實現了一個簡單的標簽選擇器:
要想自定義標簽列表的外觀,以下面的內容創建public/stylesheets/tags.css:
.tags-list .tag { cursor: pointer; padding: 1px 4px; } .crudField .tags-list .selected { background: #222; color: #fff; }
然后,在views/CRUD/layout.html,改變#{set "moreStyles"}塊成這樣:
#{set "moreStyles"} #{/set}
管理面板的工作暫告一段落。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/64098.html
摘要:添加驗證既然我們有一個管理面板,自然需要進行驗證。自定義驗證過程你可以用應用提供的實例來自定義驗證過程。通過繼承自該類,我們可以指定驗證用戶的方式。這個將給每個作者發布自己的文章的權限?,F在在添加到控制器的鏈接接下來是創建模板。 添加驗證 既然我們有一個管理面板,自然需要進行驗證。幸運的是,Play已經提供了一個叫做Secure的模塊來幫助我們。 啟動Secure模塊 在yabe/co...
摘要:國際化和本地化完成了博客引擎后,我們來考慮額外的一件事應用的國際化和語言的本地化。國際化和本地化我們將分兩步討論,先是國際化,再是本地化。實際上,兩者是同步進行的你在國際化的同時,往往也是在本地化。 國際化和本地化 完成了博客引擎后,我們來考慮額外的一件事:Web應用的國際化和語言的本地化。雖然我們可以一開始就做這件事,但是最好還是先完成該應用的單一語言版本,然后再添加其他語言的支持...
摘要:自定義編輯區域在前一章,我們給創建了一個關于面板,并準備了我的文章的部分。從文章列表開始我們僅需要查詢用戶相關的文章并顯示出來。如果發生錯誤,它會刷新表單,顯示錯誤信息。它表示使用的默認模板。這意味著,如果提交了參數,將選擇這條路由。 自定義編輯區域 在前一章,我們給yabe創建了一個關于面板,并準備了我的文章的部分。每個作者可以在這個部分看到他們發布過的文章,以及進行編輯或者創建新...
摘要:確保你的文本編輯器已經做了相應的配置。第一個,會自動監測源代碼的改變并在運行時自動重載。檢查下面的一行是否出現在應用日志中使用版本控制系統來追蹤變化當你開發一個項目時,最好使用版本控制系統來存儲你的源代碼。 Play是一個Java Web敏捷開發的框架http://www.playframework.com/documentation/1.2.7/home 之所以要翻譯這個教程,是因...
摘要:完成應用測試我們已經完成了我們想要創建的博客引擎。當然我們已經完成了測試所有模型層的功能。評估代碼覆蓋率當然我們還沒有完成應用所需的所有測試用例。如你所見,我們遠遠沒有完成對應用的全面測試。 完成應用測試 我們已經完成了我們想要創建的博客引擎。不過這個項目尚未完全結束。為了保證代碼的質量,我們需要添加更多的測試。 當然我們已經完成了測試所有模型層的功能。所以博客引擎的核心功能已經被...
閱讀 2461·2021-11-22 09:34
閱讀 3068·2021-10-25 09:43
閱讀 1986·2021-10-11 10:59
閱讀 3388·2021-09-22 15:13
閱讀 2332·2021-09-04 16:40
閱讀 425·2019-08-30 15:53
閱讀 3193·2019-08-30 11:13
閱讀 2608·2019-08-29 17:30