為了解決這個問題,我們找到了portal-impl.jar中的velocityvariableimpl類檔案,於是一目了然。因為portal-normal.vm中的第一行會解析其他檔案,被解析的檔案在變數init中,如下:
>
#parse ($init)
<
html
class
="#lang
uage("lang.dir")"
dir="#
lang
uage("lang.dir")"
lang
="$w3c_language_id"
>
<
head
>
<
title
>
$the_title - $company_name
title
>
$theme.include($top_head_include)
head
>
...
見03行,而被解析的這個檔案,就定義了絕大多數模板中用到的變數,那麼這個檔案在**呢?我們可以參見velocityvariableimpl中的定義:
velocitycontext.put("init"
, themedisplay.getpathcontext() +
"_servlet_context_"
+ "/html/themes/_unstyled/templates/init.vm"
); velocitycontext.put(
"portletgroupid"
, new
long(themedisplay.getscopegroupid()));
} theme theme = (theme)request.getattribute("theme"
); 所以,被parse的init變數 代表的檔案是在 root 應用下的/html/themes/_unstyled/templates/init.vm,我們開啟看下,果然這裡面都是變數定義:
因為這個檔案很長,所以這裡略去
##---------- common variables ---------- ##
#set
($theme_display = $themedisplay)
#set
($portlet_display = $portletdisplay)
#set
($theme_timestamp = $themedisplay.gettheme().gettimestamp())
#set
($theme_settings = $themedisplay.getthemesettings())
...
結論:
在liferay框架中的模板檔案中的變數,大多數是在init.vm中定義的,少量是直接定義在velocityvariableimpl類中的
實戰:
比如,同事問我,在portal-normal.vm的第47-53行中的$content_include變數定義在**:
#if ($selectable)$theme.include($content_include)
#else
$portletdisplay.recycle()
$portletdisplay.settitle($the_title)
,$content_include)
#end
我們在init.vm中進行查詢,不難發現這個變數定義為:
#set($bottom_include =
"$dir_include/common/themes/bottom.jsp"
) #set
($bottom_ext_include = $bottom_include)
#set ($content_include = "$dir_include$tilescontent")
#set
($top_head_include =
"$dir_include/common/themes/top_head.jsp"
) #set
($top_messages_include =
"$dir_include/common/themes/top_messages.jsp"
) 是$dir_include$tilescontent,所以我們還需要遞迴的繼續解析下去:
我們在init.vm中繼續查詢,不難找到$dir_include的變數定義:
#if ($is_portlet_page && $theme_display.iswaptheme())#set
($dir_include =
"/wap"
) #else
#set
($dir_include =
"/html"
)
#end
所以,因為我們的官方預設例子不是被wap的,所以$dir_include為/html
接下來我們找$tilescontent的定義。很可惜,它沒有被定義在init.vm中,所以我們回到velocityvariableimpl類中,再這裡,我們找到了定義:
string tilescontent = (string)componentcontext.getattribute("content"
); themedisplay.settilescontent(tilescontent);
velocitycontext.put("tilescontent"
, tilescontent);
所以,$tilescontent是乙個程式執行期間動態傳遞過來的變數:
綜上所述:同事問我的portal-normal.vm檔案中$content_include的變數的值,是在程式執行中動態解析的,預設情況下,它是 「/html」 與程式執行時候動態獲取content屬性值,然後這2個值拼接起來得到的值。
Liferay 對Liferay框架的幾點分析總結
一 jsp中如何使用tab liferay的jsp頁面中,如果用了tab的選項,則tab1為第一層,tab2為第二層,tab3為第三層,從上到下,為父子關係。如何開發乙個帶選擇框的列表應用?1 建立資料庫模型 廢話 2 建立dao及相關portlet.service服務框架,介面和util 3 實現...
liferay初始配置檔案
管理員使用者,當建立使用者是必須填管理員id,hook修改登入時 admin.email.from.name test test jdbc.default.password root liferayhome是動態得到的有用 liferay.home d liferay bundles admin.e...
liferay 4 liferay的許可權體系
liferay中有幾個概念 1 user 表存放liferay的使用者 2 usergroup 使用者組 3 角色 4 組織,組織可以是站點的成員 5 站點 6 團隊 liferay中所有的東西都被視為是資源 而許可權和資源掛鉤 在liferay裡面儲存許可權的表主要涉及兩個表,乙個叫resourc...