您可以在內容清單查詢中,定義執行頁面時所計算特性的值,以顯示最近更新的內容。
網站內大多數的元件特性都是靜態的。由使用者選取或輸入元件任一特性的固定字串或值,而且無論頁面在何時何地執行都不會改變。但是,您可以定義執行頁面時所計算特性的值。這對於顯示內容查詢中最近更新的內容非常實用。使用者可以輸入日期,像是「過去 3 天內」。
您可以在數個特性中插入 Mustache JS 擴充。這些字串中參照的值衍生自頁面執行時所執行的模型。內建的模型可處理適用於 Content REST API 呼叫的日期格式。您可以依據使用者需求添加其他值來擴充此模型。
以下是您可以針對特性輸入的字串範例:
Content List component: Additional Query String property: updatedDate gt "{{#content.date}}today - 3 days{{/content.date}}"
此 Mustache 日期項目會在程式實際執行時評估,因此傳回值會根據執行的時間改變 (亦即擴展為 updatedDate gt "2220181002060000000"
)。如此,使用者便可建置任何複雜的日期字串,而不只是輸入預先定義的值。
支援的元件特性
下列特性支援 Mustache JS 樣板語法:
內容清單
其他查詢字串
例如:updatedDate gt "{{#content.date}}today - 3 days{{/content.date}}"
標題/段落/文字
透過 CKEditor 輸入的 RTF 內容
例如:"Content REST API format for date: {{#content.date}}now{{/content.date}}"
註:
若無 Mustache 樣板的自訂模型,標題/段落/文字的擴充就不是那麼實用。但是,對於驗證在「其他查詢字串」中輸入的內容卻是非常實用,因為當您在編輯與檢視之間切換時會進行評估,而且立即可以看見。支援的元件語法
內建即支援 content.date
物件。此物件使用以下兩個主參數:today
和 now
。
today
值採用目前的瀏覽器時間,將其轉換為今晚午夜,然後再將該值轉換為 UTC 時間。
{{#content.date}}today{{/content.date}}
會擴展為今晚午夜的瀏覽器值,轉換為 UTC 值並將格式設為 Content REST API 日期格式。例如:
2220181008065959999
可以使用以下方式提供更多選擇:
today +/- [day | week | month | year]
當您增減 today
值時,它的行為方式也會有所不同。如果是減,將會使用早上的時間。如果是加,將會使用午夜的時間。例如:
{{#content.date}}today - 1 day{{/content.date}}
會擴展至昨天早上。
{{#content.date}}today + 2 days{{/content.date}}
會擴展至後天的午夜。
now
值採用目前的瀏覽器時間,不做任何調整地將其轉換為 UTC 時間。
{{#content.date}}now{{/content.date}}
會擴展為轉換成 UTC 值並將格式設定為 Content REST API 日期格式的目前瀏覽器時間。
now
也可以加入 hour
。方式如下:
now +/- [hour | day | week | month | year]
{{#content.date}}now + 2 hours{{/content.date}}
- 從現在開始 2 小時,轉換為 Content REST API 日期格式的 UTC 時間
{{#content.date}}now - 1 day{{/content.date}}
- 昨天的這個瀏覽器時間,轉換為 Content REST API 日期格式的 UTC 時間
使用支援的元件語法
若要在其他查詢字串中使用巨集擴充,假設要傳回過去 3 週的所有項目,可以輸入:
updatedDate gt "{{#code.date}}today - 3 weeks{{/code.date}}"
只會傳回日期,供用於 Content REST API 呼叫,會在您建構查詢字串時加上引號,就如同在輸入靜態值時一樣。
MustacheJS
如需相關語法,請參閱 Mustache JS 樣板頁面,網址為 mustache.github.io/mustache.5.html。
擴展字串時所執行的 Mustache 執行處理有一項變更。Mustache 同時提供使用 {{ }}
的 text
擴充,以及使用 {{{ }}}
的 html
擴充。這兩者之間的差異在於文字擴充會對字串進行 HTML 編碼;亦即若值擴展為 a < b
,結果會是 a < b
。這不是您在建構 URL 字串時所要的結果。您可以告訴使用者使用 HTML 擴充,但這只是額外工作並且會產生更多問題,例如解釋他們為何需要使用 {{{ }}}
。
為了避免此情形,已對 Mustache 做了設定,讓其在使用 {{ }}
時不會遁離值。這表示 {{ }}
和 {{{ }}}
的行為方式是相同的。如有需要,也可以將任何結果的編碼保留給使用者作為練習。
OOTB Mustache 模型
Mustache 需要將模型套用至樣板以進行擴充。在前面的範例中,內建已經定義 {{#content.date}}
,開發人員可以新增新的特性,例如 {{person}}
。使用者若在 Mustache 樣板中輸入模型中沒有的值,結果將會是空的字串。因此,以 Hello {{person}}
為例,除非開發人員在模型中新增 person
,否則只會擴展為 Hello
。
使用的模型物件是名為 SCSMacros
的全域物件。開發人員可以任意將任何其他項目新增到此物件中。評估樣板時,會將此物件傳送至 Mustache。
內建的模型物件目前僅支援 content.date
物件:
{ content: { date: <lambda implementation> } }
自訂 Mustache 模型
開發人員可以根據其需求來增強支援的物件。因此,他們可以導入 lastTwoDays
物件,並且將擴充簡化為 {{lastTwoDays}}
。
若要將模型擴充為支援先前範例中 Hello {{person}}
之類的內容,您必須將 person
物件新增至 SCSMacros。必須在頁面執行之前先執行此作業。您可以在頁面版面配置的開頭增加命令檔標記,即可在頁面版面配置內完成此作業。例如:
<script type="text/javascript"> window.SCSMacros = window.SCSMacros || {}; // define/get the SCSMacros object window.SCSMacros.person = "World"; </script>
進行此變更之後,Hello {{person}}
樣板會擴充為 Hello World
。
若要將值傳送至此物件 (例如 Hello {{#person}}personId{{/person}}
),您必須實行 mustache lambda
,並且包裝並擴充實行內的值。
例如:
<script type="text/javascript"> window.SCSMacros = window.SCSMacros || {}; // define/get the SCSMacros object //implement "person" as a lambda window.SCSMacros.person = function () { var people = { '111': { firstName: 'Small', lastName: 'World'}, '222': { firstName: 'Big', lastName: 'Universe'} }; return function (text, render) { var expandedText = render(text); var chosenPerson = people[expandedText] || people['111']; return chosenPerson.firstName; } }; </script>
進行此變更之後,Hello {{#person}}111{{/person}}
樣板會擴充至 Hello Small
,Hello {{#person}}222{{/person}}
樣板則擴充至 Hello Big
。
註:
Mustache 擴充會同步執行。若您需要擷取非同步值,在您嘗試執行 mustache 擴充之前必須先在模型內解析這些值,雖然目前並不支援這麼做,但可以透過訂製實行來實現。