Liferay新註冊用戶缺省頁面的研究

Liferay新註冊用戶缺省頁面的研究

在Liferay的基礎上進行二次開發,我們都比較困惑的一個問題是:如何控制新註冊用戶登錄後的頁面?
關於新用戶的缺省頁面,最核心的代碼是在com.liferay.portal.events.ServicePreAction類中的addDefaultLayout(User user)和getDefaultLayout(User user, boolean signedIn)。
12.1 源代碼閱讀
這部分代碼,代碼量並不大,大家可以自行閱讀一下。代碼的意思,大致總結如下:
1、在run()中,判斷用戶是否有Power User角色,如果有,則調用addDefaultLayout。
2、在addDefaultLayout中,判斷用戶是否已經有自己的Community,如果沒有,就會讀取參數default.user.layout.name、default.user.layout.template.id等進行創建,並設置各個column_id的portlet。
3、判斷是否已經有自己的Community,實際上是在判斷userGroup的Community。
4、然後,在getDefaultLayout獲取應該顯示的Layout。如果指定了layout,就現實制定的layout;否則,登錄用戶,檢查有權限的私有layout;否則,檢查公共layout。
從這個流程可以看出,可以從幾個角度來入手解決這個問題:
1、 從用戶角色入手,不給新用戶Power User角色。
2、 通過配置文件,設置新用戶的layout,以及各個column的portlet清單。
3、 大動手術,直接重載ServicePreAction類
12.2 從用戶角色着手解決的方案
在Enterprise這個Portlet中,選擇"用戶"這個Tab,然後是Default Community And Roles,裏面,把Power User刪掉,並保存。
然後重新註冊的用戶,缺省就不會創建新的Community。同時,又沒有分配其他Community給他,因此他只有一個Guest這個Community是可用的,登陸之後也會回到缺省頁面。
這種方案適用於:普通登錄用戶沒有其他的功能,主要還是在Guest這個Community。www.liferay.com應該就是採用這種處理方式。
考慮到多數情況下,除了公共頁面,我們還需要給用戶一些私有的頁面。這時,我們可以創建一個私有的Community如Blog,在這個Community中創建若干的Layout,並且添加好portlet。作爲設計的所有註冊用戶的缺省登錄後的頁面。然後,管理員在Enterprise這個Portlet中,選擇"用戶"這個Tab,然後是Default Community And Roles,裏面,在Community這個Textarea裏面,輸入把Blog這個Community名字,並保存。
這樣,新註冊的用戶,登陸之後,就會顯示Blog這個Community。
這個方案的關鍵設置,就是在Default Community And Roles裏面。兩點:一、新註冊用戶缺省沒有Power User權限;二、新註冊用戶,缺省可以訪問設置的私有Community。
12.3 從配置文件着手解決的方案
在portal.properties中有幾個重要的配置參數,分別是
default.user.layout.name=Home
default.user.layout.template.id=2_columns_ii
default.user.layout.column-1=82,23,61,65,
default.user.layout.column-2=8,11,36,33,
default.user.layout.column-3=
default.user.layout.column-4=
default.user.layout.name,暫時沒看其作用,估計沒有太大的影響。我們關心的應該是後面兩類參數:
default.user.layout.template.id:頁面的佈局
default.user.layout.column-?:每一個column中有哪些portlet。具體含義,自己開發過Layout的話,就很容易理解。
我們的工作也就相對簡單了,只需要定製這兩個參數即可。比如,我想在第二欄的最開始,放一個Calculator Portlet,那只需要設置爲
default.user.layout.column-2=13,8,11,36,33,
注意:Liferay不建議我們直接修改portal.properties文件,因此需要把這些參數拷貝到portal-ext.properties中進行修改。
這個方法的問題也比較明顯:對於哪些需要設置Preference才能正常工作的portlet,這種方法就不好使。比如ID爲56的Portlet "Journal Content",是Liferay的使用最頻繁的portlet,但這種方法,不能爲其設置所選擇的文章。這個問題,我沒有找到比較好的解決方法。
曾經嘗試在配置文件中直接寫portlet的實例名,但不成功,仍然是未設置狀態。
這個方案適用於:每個用戶需要有自己的工作臺,並且工作臺的內容並不是以內容呈現爲主。
12.4 重載ServicePreAction類的方案
這個方案,應該是最靈活的一個方案了,當然對開發技術以及對Liferay的底層知識有較高要求。有興趣的可以自行研究,我僅簡單說說如何重載。
1、 在ext環境中創建一個新類,並派生自ServicePreAction。然後重新實現方法addDefaultLayout(User user)。在裏面做自己想做的任何事情。例如新類的全名爲com.ext.portal.events.ServicePreExtAction
2、 在portal-ext.properties中添加一行
servlet.service.events.pre=com.ext.portal.events.ServicePreExtAction
Liferay的案例EducaMadrid,"Germinus was able customize the look and feel of the portal according to the user's hierarchal role and/or grade. Teachers have a "desktop" that displayed classroom materials, and students would see more student oriented UI. As the students progressed to higher grades, the actual interface becomes increasingly more complex",我猜測,應該就是採用了重載ServicePreAction的方法,爲不同的角色或年級,設置不同的頁面樣式。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章