Liferay 模板檔案的解析

2021-09-21 19:54:34 字數 3555 閱讀 4150

為了解決這個問題,我們找到了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...