您當前的位置:首頁 > 產品 > 企業信息化 

Expsoft CMS內容管理系統標簽使用手冊2009

 

Expsoft CMS內容管理系統... 1

 

標簽使用手冊2009. 1

1、簡要介紹... 3

2、Velocity模板語言(VTL):說明... 3

21、 Hello Velocity World! 4

22、注釋... 4

23、References 4

2.3.1變量... 5

2.3.2屬性... 5

2.3.3方法... 5

24、正式reference標記... 5

25、轉義... 6

26、賦值... 6

27、條件語句If / ElseIf / Else. 8

28、關系、邏輯運算符... 9

29、 循環... 10

210、 子模板parse. 10

211、 包含include. 11

212、 停止... 11

3、CMS系統提供標簽對象... 11

3.1公共對象... 11

3.1.1  站點編號${SiteID}. 11

3.1.2  站點目錄名${SiteFolder}. 12

3.1.3  站點域名${SiteDomain}. 12

3.1.4  站點編碼方式${SiteCode}. 12

3.1.5  站點創建日期${SiteCreateDate}. 12

3.2 模板解析對象ExpValue. 12

3.2.1取得欄目列表ExpGetCategoryList 12

3.2.2 取得指定欄目下的內容列表ExpGetContentInfoList 12

3.2.3取得欄目最新信息的詳細內容ExpCategoryNewInfoContent 13

3.2.3取得指定信息的詳細內容ExpGetInfoContent 14

3.2.4取得指定欄目的訪問地址ExpGetCategoryLinkURL. 14

3.2.5取得指定信息的訪問地址ExpContentLink. 14

3.2.6首頁面flash新聞控件ExpFlashPic. 14

3.2.7取得當前頁面位置GetPosition. 15

3.3私有對象... 15

3.3.1首頁面... 15

3.3.2欄目頁面... 15

3.3.3內容頁面... 15

4、常見問題... 16

 

 

 

 

1、簡要介紹

Expsoft CMS內容管理系統采用Nvelocity語言構造網站模板。Nvelocity是一個基于.NET的模板引擎(template engine)。它允許任何人僅僅簡單的使用模板語言(template language)來引用由.NET代碼定義的對象。當Nvelocity 應用于web開發時,界面設計人員可以和.NET程序開發人員同步開發一個遵循MVC架構的web站點,也就是說,頁面設計人員可以只關注頁面的顯示效果,而由.NET程序開發人員關注業務邏輯編碼。Nvelocity.NET代碼從web頁面中分離出來,這樣為web站點的長期維護提供了便利。

Expsoft CMS內容管理系統使用Nvelocityweb開發架構提供模板服務(template service)。我們的系統就提供一個模板服務的方式允許一個web應用以一個真正的MVC模型進行開發。

2、Velocity模板語言(VTL):說明

VTL意味著提供最簡單、最容易并且最整潔的方式合并頁面動態內容。VTL使用references來在web site內嵌套動態內容,一個變量就是一種類型的reference。變量是某種類型的refreence,它可以指向java代碼中的定義,或者從當前頁面內定義的VTL statement得到值。下面是一個VTL statement的例子,它可以被嵌套到HTML代碼中:

#set( $a = "Velocity" ),和所有的VTL statement一樣,這個statement以#字符開始并且包含一個directiveset。當一個在線用戶請求你的頁面時,Velocity 模板引擎將查詢整個頁面以便發現所有#字符,然后確定哪些是VTL statement,哪些不需要VTL作任何事情。

#字符后緊跟一個directiveset時,這個set directive使用一個表達式(使用括號封閉)――一個方程式分配一個值給變量。變量被列在左邊,而它的值被列在右邊,最后他們之間使用=號分割。在上面的例子中,變量是$a,而它的值是Velocity。和其他的references一樣以$字符開始,而值總是以雙引號封閉。Velocity中僅有String可以被賦值給變量。

使用$字符開始的references用于得到什么;使用#字符開始的directives用于作些什么。在上面的例子中,#set是分配一個值給變量。變量$a 在模板中輸出 "Velocity"。

21、 Hello Velocity World!

一旦某個變量被分配了一個值,那么你就可以在HTML文件的任何地方引用它。在下面的例子中,一個值被分配給$foo變量,并在其后被引用。

<html>

<body>

#set( $foo = "Velocity" )

Hello $foo World!

</body>

<html>

上面的實現結果是在頁面上打印“Hello Velocity World!”

為了使包含VTL directivesstatement更具有可讀性,我們鼓勵你在新行開始每個VTL statement,盡管你不是必須這么作。Set的用法將在后面詳細描述。

 

22、注釋

注釋是描述文本是不會出現在模板引擎生成頁面中的。注釋一個主要用處是提醒自己和解釋出現在VTL中的聲明,或是其他用途。下面是一個在VLT中的注釋例子。

## This is a single line comment.

單行注釋以##開始,結束在這行的結尾。如果你要寫幾行注釋,這沒有必要寫幾個單行注釋。

多行注釋,以#*開始*#結束,可以解決這個問題。

This is text that is outside the multi-line comment.

Online visitors can see it.

 

#*

 Thus begins a multi-line comment. Online visitors won't

 see this text because the Velocity Templating Engine will

 ignore it.

*#

23、References

VTL中有三種類型的references:變量(variables)、屬性(properties)、方法(methods)。作為一個使用VTL的頁面設計者,你和你的工程師必須就references的名稱達成共識,以便你可以在你的template中使用它們。

所有的  reference被作為一個String對象處理。如果有一個對象$foo是一個Integer對象,那么Velocity將調用它的toString()方法將這個對象轉型為String類型。

2.3.1變量

非正式變量是由“$”開頭,接著是VTL標識符。VLT標識符必須以字母(a..z,A..Z)開頭。剩下的部分限于以下幾種:

?    字母(a..z,A..Z)

?    數字(0..9)

?    連字符(“-”)

?    下劃線(“_”)

這里是幾個在VTL中有效的變量reference。

$foo

$mudSlinger

$mud-slinger

$mud_slinger

$mudSlinger1

VLT定義一個變量,例如$foo,變量能或者通過模板中的set 方法,或者通過Java 代碼獲得值。

例如,Java 變量 $foo 的值是 bar ,在這個模板被請求時,在網頁上 bar 會替代所有 $foo 。選擇地,假如包括了下面的聲明:

#set( $foo = "bar" )

按照這樣的設置,輸出就會跟之前的一樣。

2.3.2屬性

第二種有趣的VTL reference就是屬性,而且屬性有一種與眾不同的格式。非正式變量是由“$”開頭,接著是VTL標識符,再接著就是字符(.)和其他的VLT標識符。這里是一些在VLT中有效屬性的定義:

$customer.Address

2.3.3方法

一個方法就是系統提供的數據訪問的訪求,并且它有完成某些有用工作的能力,例如一個執行計算和判斷條件是否成立、滿足等。方法是一個由$開始并跟隨VTL標識符組成的References,一般還包括一個VTL方法體。一個VTL方法體包括一個VLT標識接著一個左括號((),接著是參數列表,再接著是右括號())。這里是一些在VTL中有效的方法定義:

${ExpValue.ExpGetContentInfoList(${SiteID},"018","",1,0,"","",10)},其中ExpValue就是系統提供的對象,ExpGetContentInfoList就是方法,表示取得欄目下面的內容信息列表。

24、正式reference標記

非正式references用于上述的例子中。但是同樣有正式的references,如下面所示:

${mudSlinger}

${customer.Address}

${purchase.getTotal()}

在幾乎所有場合你都可以使用非正式references,但是在某些場合,只能使用正式reference 才能正確處理。

設想你創建一個句子:$vice 作為句子的名詞 。目標是為了使某些人選擇不同的詞,產生下面兩種結果之一:"Jack is a pyromaniac." 或者 "Jack is a kleptomaniac."。使用非正式定義不太適合用于這種情況??匆幌孪旅娴睦樱?/span>

Jack is a $vicemaniac.

本來變量是$vice現在卻變成了$vicemaniac,這樣Veloctiy就不知道您到底要什么了。所以,應該使用正是格式書寫

Jack is a ${vice}maniac.

現在Nvelocity就知道reference $vice,而不是$vicemaniac。正式定義經常用于模板中refernces與文本連接在一起的情況。

 

25、轉義

某些情況使用Nvelocity可能會覺得很煩惱。逃避特殊符是處理出現在你的模板中VTL特殊符有效方法,就是使用反斜杠(\)。

#set( $email = "foo" )

$email

假如Velocity在你的模板中遇到 $email ,它會搜索上下文,得到相應的值。這里的輸出是 foo ,因為 $email 被定義了。假如  $email 沒有被定義,輸出會是 $email 。

設想 $email 被定義了(例如,它的值是 foo ),而且你想輸出 $email 。最簡單的是使用轉義符,例:\$email,Nvelocity就不會解析$email,而直接輸出。

26、賦值

Reference允許設計者使用動態的內容,而directive使得你可以應用java代碼來控制你的顯示邏輯,從而達到你所期望的顯示效果。

#set

#set標志是用于對一個reference賦值。值會賦給一個變量或者一個屬性,而且賦值會在括號里出現:

#set( $primate = "monkey" )

#set( $customer.Behavior = $primate )

左邊(LHS) 一定是一個變量或者一個屬性。右邊(RHS)可以是下面中的一個類型:

?    變量

?    字符串

?    屬性

?    方法

?    數字

?    數組

這些例子顯示上述的每一種類型:

#set( $monkey = $bill ) ## variable reference

#set( $monkey.Friend = "monica" ) ## string literal

#set( $monkey.Blame = $whitehouse.Leak ) ## property reference

#set( $monkey.Plan = $spindoctor.weave($web) ) ## method reference

#set( $monkey.Number = 123 ) ##number literal

#set( $monkey.Say = ["Not", $my, "fault"] ) ## ArrayList

注意:最后一個例子的取值方法為:$monkey.Say.get(0)。

RHS也可以是一個簡單的算術表達式:

#set( $value = $foo + 1 )

#set( $value = $bar - 1 )

#set( $value = $foo * $bar )

#set( $value = $foo / $bar )

如果你的RHS是一個null,VTL的處理將比較特殊:它將指向一個已經存在的reference,這對初學者來講可能是比較費解的。例如:

#set( $result = $query.criteria("name") )

The result of the first query is $result

 

#set( $result = $query.criteria("address") )

The result of the second query is $result

如果$query.criteria(name)返回一個“bill”,而$query.criteria(address)返回的是null,則顯示的結果如下:

The result of the first query is bill

 

The result of the second query is bill

這容易使新手糊涂:創建一個#foreach循環,企圖想通過一個屬性或者一個方法 #set一個reference,然后馬上就用 #if 測試。例如:

#set( $criteria = ["name", "address"] )

 

#foreach( $criterion in $criteria )

 

    #set( $result = $query.criteria($criterion) )

 

    #if( $result )

        Query was successful

    #end

 

#end

在上面的例子中,程序將不能智能的根據$result的值決定查詢是否成功。在$result#set后(added to the context),它不能被設置回nullremoved from the context)。打印的結果將顯示兩次查詢結果都成功了,但是實際上有一個查詢是失敗的。

為了解決以上問題我們可以通過預先定義的方式:

#set( $criteria = ["name", "address"] )

 

#foreach( $criterion in $criteria )

 

    #set( $result = false )

    #set( $result = $query.criteria($criterion) )

 

    #if( $result )

        Query was successful

    #end

 

#end

不像其他Velocity指示符號,#set 沒有一個#end 結束。

 

27、條件語句If / ElseIf / Else

當一個web頁面被生成時使用Velocity#if directrive,如果條件成立的話可以在頁面內嵌入文字。例如:

#if( $foo )

   <strong>Velocity!</strong>

#end

上例中的條件語句將在以下兩種條件下成立:(i)$foo是一個boolean型的變量,且它的值為true;(ii)$foo變量的值不為null。這里需要注意一點:Velocity context僅僅能夠包含對象,所以當我們說“boolean”時實際上代表的時一個Boolean對象。即便某個方法返回的是一個boolean值,Velocity也會利用內省機制將它轉換為一個Boolean的相同值。

如果條件成立,那么#if#end之間的內容將被顯示。在這個例子中,如果 $foo的值為true,輸出為“Velocity!”。相反地,如果 $foo 是一個 null值,或者是一個 false 值,表達式值為 false,沒有輸出。

#elseif#else元素可以同#if一同使用。注意:Velocity 模板引擎遇到一個為true值的表達式就會停止。在下面的例子,假設 $foo=15,$bar=6

#if( $foo < 10 )

    <strong>Go North</strong>

#elseif( $foo == 10 )

    <strong>Go East</strong>

#elseif( $bar == 6 )

    <strong>Go South</strong>

#else

    <strong>Go West</strong>

#end

在這個例子中,$foo10大,所以在開始的兩個比較中都失敗。接著 $bar6比較是真的所以輸出為 GO South。

注意這里的Velocity的數字是作為Integer來比較的――其他類型的對象將使得條件為false,但是與java不同它使用“==”來比較兩個值,而且velocity要求等號兩邊的值類型相同。

 

28、關系、邏輯運算符

Velocity中使用等號操作符判斷兩個變量的關系。這里有個簡單例子關于等于號的使用:

#set ($foo = "deoxyribonucleic acid")

#set ($bar = "ribonucleic acid")

 

#if ($foo == $bar)

  In this case it's clear they aren't equivalent. So...

#else

  They are not equivalent and this will be the output.

#end

VelocityAND、ORNOT邏輯運算符。想得到更多信息,請看VTL Reference Guide。下面的例子是說明AND、ORNOT邏輯運算符的用法:

## logical AND

 

#if( $foo && $bar )

   <strong> This AND that</strong>

#end

只有當$foo $bar 都為true,#if 才會得到true值。如果$foofalse ,表達式的值為 false,$bar 就不會求值。如果 $foo的值為 true ,Velocity模板引擎會檢查 $bar的值,如果$bar=true,整個表達式的值為true,輸出為“This AND that”。如果$bar=false,整個表達式的值為false,沒有輸出。

邏輯OR 的工作方式一樣,除了只要有一個值為true ,整個表達式的值就為true??紤]一下下面的例子。

## logical OR

 

#if( $foo || $bar )

    <strong>This OR That</strong>

#end

如果$footrue,Velocity模板引擎就沒有必要查找 $bar,無論 $bar true 還是 false ,表達式的值為 true ,輸出為“This OR That”。如果$fooflase,$bar的值就一定要檢查,在這個例子中,如果 $bar 同樣是false,表達式的值為 false ,沒有輸出。從另外一個角度看,如果$bar 的值為true ,整個表達式的值為 true ,輸出為 This OR That”。

關于邏輯NOT ,只有一個疑問:

##logical NOT

 

#if( !$foo )

  <strong>NOT that</strong>

#end

如果 $foo=true, !$foo 的值為 false,沒有輸出。如果$foo=false,!$foo的值為true,輸出為“NOT that”。注意不要跟 quiet reference $!foo 混為一談,那是完全不一樣的。

 

29、 循環

#foreach 用于循環。例子:

<ul>

#foreach( $product in $allProducts )

    <li>$product</li>

#end

</ul>

每次循環$allProducts中的一個值都會賦給$product變量。

$allProducts可以是一個Vector、Hashtable或者Array。分配給$product的值是一個java對象,并且可以通過變量被引用。例如:如果$product是一個javaProduct類,并且這個產品的名字可以通過調用他的getName()方法得到。

現在我們假設$allProducts是一個Hashtable,如果你希望得到它的key應該像下面這樣:

<ul>

#foreach( $key in $allProducts.keySet() )

    <li>Key: $key -> Value: $allProducts.get($key)</li>

#end

</ul>

Velocity還特別提供了得到循環次數的方法,以便你可以像下面這樣作:

<table>

#foreach( $customer in $customerList )

    <tr><td>$velocityCount</td><td>$customer.Name</td></tr>

#end

</table>

$velocityCount變量的名字是Velocity默認的名字,計數從“1”開始。

 

210、 子模板parse

#parse script element允許模板設計者一個包含VTL的本地文件。Velocity將解析其中的VTLrender模板。

#parse( "me.vm" )

就像#include,#parse接受一個變量而不是一個模板。任何由#parse指向的模板都必須包含在TEMPLATE_ROOT目錄下。與#include不同的是,#parse只能指定單個對象。

你可以通過修改velocity.properties文件的parse_direcive.maxdepth的值來控制一個template可以包含的最多#parse的個數――默認值是10。#parse是可以遞歸調用的,例如:如果dofoo.vm包含如下行:

Count down.

#set( $count = 8 )

#parse( "parsefoo.vm" )

All done with dofoo.vm!

那么在parsefoo.vm模板中,你可以包含如下VTL

$count

#set( $count = $count - 1 )

#if( $count > 0 )

    #parse( "parsefoo.vm" )

#else

    All done with parsefoo.vm!

#end

在顯示“Count down”后,Velocity通過parsefoo.vm,從8往下數。當計數到了0,它就會顯示“All done with parsefoo.vm!”。在這時,Velocity 會返回到dofoo.vm ,輸出信息:“All done with dofoo.vm!”。

 

211、 包含include

#include script element允許模板設計者引入本地文件。被引入文件的內容將不會通過模板引擎被render。為了安全的原因,被引入的本地文件只能在TEMPLATE_ROOT目錄下。

#include( "one.txt" )

#include 引用的文件用引號括起來。

如果您需要引入多個文件,可以用逗號分隔就行:

#include( "one.gif","two.txt","three.htm" )

在括號內可以是文件名,但是更多的時候是使用變量的。這用于根據頁面提交的需求而輸出。這里有一個例子同時有文件名和變量。

#include( "greetings.txt", $seasonalstock )

 

212、 停止

#stop 標簽允許模板設計者停止執行模板引擎并返回。把它應用于debug是很有幫助的。

 

3、CMS系統提供標簽對象

3.1公共對象

公共對象是模板解析引擎在解析每個頁面時,都會初始化數據的對象,所以在每個模板頁面上都可以調用。

3.1.1  站點編號${SiteID}

調用方式:${SiteID},主要使用在各種方法的參數傳遞中。

3.1.2  站點名稱${SiteName}

3.1.2  站點目錄名${SiteFolder}

調用方式:${SiteFolder}。

3.1.3  站點域名${SiteDomain}

3.1.4  站點編碼方式${SiteCode}

3.1.5  站點創建日期${SiteCreateDate}

3.1.6  當前頁面位置${CurrentPosition}

調用方式:${SiteFolder},此標簽效果類似與3.2.7,但是不靈活。

3.1.7  開始解析時間${ StartParseTime}

       此標簽主要用于調試,因為IE訪問靜態頁面時會有緩存,調試模板時,可以把此標簽放在<Title>中,這樣生成后的頁面如果是最新的時間,那就說明是最新生成的頁面。

3.2 模板解析對象ExpValue

3.2.1取得欄目列表ExpGetCategoryList

函數原型:ArrayList ExpGetCategoryList(string SiteID,string CategoryCode,int Level,int isImage,int isDisplayIfEmpty,int order,int totalNum,int startNum,int titleWordNum,int columns,int direction)

3.2.2 取得指定欄目下的內容列表ExpGetContentInfoList

函數原型:ExpContentInfo ArrayList ExpGetContentInfoList(string SiteID, string CategoryCode, string InfoType, int Level, int totalNum, string IsHot, string OrderBy, int titleWordNum)

標簽說明:

此標簽通過傳入的各種參數,返回內容列表對象數組

參數說明:

Ø  CategoryCode,欄目編號

Ø  SiteID,站點編號

Ø  InfoType,信息類型,主要有:news、link、

Ø  Level

Ø  totalNum

Ø  IsHot

Ø  OrderBy

Ø  titleWordNum

調用方法:

#set( $ContentInfoList = 此處因篇幅問題換行

${ExpValue.ExpGetContentInfoList(${SiteID},"018","",1,0,"","",10)})

使用場合:

此標簽主要使用在各頁面上顯示新聞列表的區塊,如首頁面上顯示一個公告列表,如下:

內容列表對象ExpContentInfo的明細內容如下,都可以通過形如${XXX.Info}的方式調用:

3.2.3取得欄目最新信息的詳細內容ExpCategoryNewInfoContent

函數原型:string ExpCategoryNewInfoContent(string SiteID, string CategoryCode, string OrderBy)

標簽說明:

此標簽通過傳入的各種參數,返回指定欄目中按排序方式的第一條信息的詳細內容。

調用方法:

${ExpValue. ExpCategoryNewInfoContent (${SiteID },"","")}

使用場合:

    主要使用在首頁面上的圖片廣告中。

3.2.3取得指定信息的詳細內容ExpGetInfoContent

函數原型:string ExpGetInfoContent(string InfoID)

標簽說明:

此標簽通過傳入的各種參數,返回內容列表對象數組,

調用方法:

${ExpValue. ExpGetInfoContent ("")}

使用場合:

 

3.2.4取得指定欄目的訪問地址ExpGetCategoryLinkURL

函數原型:

string ExpGetCategoryLinkURL(string CategoryCode, string SiteID)

標簽說明:

此標簽通過傳入的各種參數,返回內容列表對象數組。

參數說明:

Ø  CategoryCode,欄目編號

Ø  SiteID,站點編號

調用方法:

${ExpValue.ExpGetCategoryLinkURL('017',${SiteID})}

使用場合:

    此標簽主要使用各頁面上取得欄目首頁面的鏈接,如網站首頁面菜單上,欄目區塊中的[更多]鏈接,如下兩個圖:

點更多,進入工作動態欄目的首頁面。

3.2.5取得指定信息的訪問地址ExpContentLink

函數原型:string ExpContentLink(string InfoID, string SiteID, string SiteDomain)

3.2.6首頁面flash新聞控件ExpFlashPic

函數原型:string ExpFlashPic(string SiteID, string CategoryCode, int width, int height, string flashPath, string titlebgcolor)

3.2.7取得當前頁面位置GetPosition

函數原型:string GetPosition(string SiteID, string CategoryCode, string separator, string target, string linkClass, int wordNum)

標簽說明:

此標簽通過傳入的各種參數,返回當前頁面位置。

參數說明:

Ø  CategoryCode,欄目編號

Ø  SiteID,站點編號

Ø  Separator,分隔符

Ø  Target,打開鏈接時的方式

Ø  linkClass,鏈接使用的CSS

Ø  wordNum,欄目名稱最大文字數

調用方法:

${ExpValue.GetPosition($SiteID,$CategoryCode,">>","_self","link",20)}

使用場合:

    此標簽主要使用各頁面上取得欄目首頁面的鏈接,如網站首頁面菜單上,欄目區塊中的[更多]鏈接,如下兩個圖:

3.3私有對象

私有對象是模板解析引擎在解析每個頁面時,根據不同的解析對象,初始化其特有的數據對象,所以在只能在特定的模板中調用。

3.3.1首頁面

3.3.2欄目頁面

1.         ${FirstPage}

2.         ${LastPage}

3.         ${PrevPage}

4.         ${NextPage}

3.3.3內容頁面

1.         ${InfoTitle}
取得當前頁面內容的標題。

2.         ${InfoContent}
取得當前頁面內容。

3.         ${InfoDate}
取得當前頁面內容的發布日期

4、常見問題

1.         明明模板中有調用函數,但是就是頁面不解析。
檢查調用函數參數個數和類型是否正確。

2.          

[打印] [關閉]

${ExpValue.ExpGetCategoryInfo(${ExpValue.Substring(${CategoryCode},3)},${SiteID}).CategoryName}

七七九九综合日本亚洲,天天狠天天伊人天天享受,国产在线精品品国产,亚洲国产精品高清一品久久