書接上回,OrchardCore的基本設定寫了,但是有一說一,這個東西還是挺複雜的,如果需要構建一個簡單的企業網站,還需要乾點別的活。
本文考慮在儘量少程式設計的基礎上,完成一個Headless網站的設定工作。本文啟用了大量的Features,如果在設定過程中發現缺少對應的feature,請在配置介面中啟用。
設定基本型別
OrchardCore預設只提供Menu
資料型別,這個是用來新建選單的,後面會詳細說。我們需要在Content Definition
中新建的Content Type。設定很簡單,我新建了一個Article型別。
接下來需要給Fields中與Parts中新增必要的內容,Parts中新增Title可以用於在查詢系統中顯示與設定displayText,然後在Fields中新增需要新增的元素(文章主題,縮圖等)。
Parts指代元件,一般用於此項型別與CMS系統互動設定使用。而Fields則指代此項型別內部的組成。
通過以上的設定,為文章(Article)設定了一個簡介,定義了分類(Taxonomy)欄位,還提供了縮圖。以後發表文章,就可以通過在Content Items中新建Article進行編寫。
這裡我設定有點問題,正常來說應該在Fields中設定HtmlBody的,不過也沒關係,這個隻影響在什麼地方取得資料。請注意一點,對於一些複雜的Part或者Field,可以點選右邊的“修改”以設定必要的形式。這裡我對HtmlBody設定了預設的編輯器。
設定目錄級別
一般的公司主頁型別的網站,都有多層的級別,當然可以通過Menu
選項卡進行設定,不過經過我實踐,這個Menu
的層級設定非常彆扭,且無法簡單得被前端解析。這裡不詳細解釋了,大家有興趣可以在配置選項卡下面的GraphiQL中查詢體驗一下。
設定層級一度卡住了我,通過查詢資料,我發現有三種形式可以表述層級結果,我個人感覺通過Taxonomy處理層級關係最簡單直接。
直觀感覺在層級不超過3的時候,使用Taxonomy比較舒服,更深的層級應該依然可用,但是查詢可能比較麻煩。
首先需要在Feature上啟用Taxonomy,可以理解這個東西是一個Tag,文件新增了這個Field之後,即可勾選已經設定好的類別了。
在Content Types
中找到Taxonomy,然後新建一個Taxonomy,設定了基本資訊後,下面的Term Content Type,對一級目錄,請設定為Taxonomy,並繼續新增二級目錄名稱;對二級目錄,設定該項為Article,這樣就能在文章的編輯中找到對應的選項,實現對文章(三級專案)的歸類。
設定完畢即可通過GraphQL查詢出2層級的目錄,第三級別已經是文章了,不會顯示在這裡,而是需要另外查詢。
設定自定義函式
我們的目標很簡單,通過二級Taxonomy的id,查詢到在這個類別下面的所有文章。但理想很豐滿,現實很骨感:雖然設定了目錄,也可以通過GraphQL查詢到目錄的層級,但OrchardCore內建的GraphQL只能依據其固定的幾個引數進行的條件篩選,無法依據自定義的欄位進行查詢。
只能曲線救國,自己定義一個查詢!
需要在Feature中啟用Queries與SQL Queries。當然OrchardCore還支援Lucene全文索引,有興趣的同學可以自行探索。
首先在Search選項卡的All queries中,新增一個查詢,然後選擇SQL查詢。然後設定查詢的函式名稱,schema的設定還是需要看官方說明,如果是返回一篇文章的話,那麼schema內容填寫如下,並且一定要勾選Return Documents這個選項。
{
"type": "ContentItem/Article"
}
底端的Query填入:
select DocumentId
from TaxonomyIndex
where ContentType='Article' and TermContentItemId = @termid:'4v5ww2mv7ys01smccm0qxwepx4'
其中,DocumentId會被GraphQL自動轉換成文件,@termid是需要傳入的引數,後面接著的是預設的值。SQL的語句結果可以通過Run SQL Query中進行嘗試,結合官方的文件,建議自己嘗試的時候直接使用select * from...,這樣有助於瞭解每個欄位的結構。
設定完畢後,在GraphiQL中就可以看到新建的函式了。
前端呼叫查詢
整體流程如下:
- 查詢Taxonomy,獲得層級關係。
- 當使用者實際點選某一個分類的時候,使用查詢獲得每個分類的具體下屬文章。
可以通過多種形式呼叫自建的查詢:
WebAPI
可以使用GET與POST訪問api/queries/{name}
,引數走body,詳情看官方文件
GraphQL
當然也可以直接使用GraphQL,定義好的查詢將作為在GraphQL中的頂級元素,引數必須要是json形式,由於放在雙引號內,請注意變換成單引號。具體如何呼叫GraphQL,請看我之前發的文章。
SQL語句
這個套路就比較那個啥了,需要具有Admin的許可權,POST訪問Admin/Queries/Sql/Query
介面,請求body裡面直接是SQL查詢。這個屬於非正常方法。
DecodedQuery:select+DocumentId
from+TaxonomyIndex
where+ContentType='Article'+and+TermContentItemId+=+@termid:'4v5ww2mv7ys01smccm0qxwepx4'
Parameters:{
++"termid":+"4v5ww2mv7ys01smccm0qxwepx4"
}
使用WEBAPI替代GraphQL進行查詢
官方文件中,一直在強調使用GraphQL進行各種查詢,但是很多同學並不一定喜歡這個東西,其實,使用WebAPI進行簡單的查詢,OrchardCore還是有內建支援的,不過隱藏的比較深,需要去看看原始碼(在OrchardCore.Contents/Controllers資料夾下),已知的有以下幾個類提供WebAPI介面:
- AdminController
提供幾個管理介面使用的API,從程式碼來看,應該是給管理介面內部使用的。
- ApiController
這個介面提供了POST、DELETE、GET幾個介面,最重要的是GET介面可以通過ContentItemId直接取得對應的文件物件,如果知道文章的具體ID,那麼可以直接通過這個介面訪問獲得對應的文章。
- ItemController
應該是給內部預覽之類使用的,方法比較少。
如果喜歡使用WEBAPI的形式,大家也可以在這個資料夾裡面編寫自己的邏輯。
結語
本文可能寫的比較晦澀,主要根據個人的實踐總結而成。OrchardCore官方提供的資料比較分散,缺少成體系的介紹,建議大家一邊實踐一邊查閱官方文件和issues。