書接上回,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,
參考資料
- https://github.com/OrchardCMS/OrchardCore/issues/4494
- https://docs.orchardcore.net/en/latest/docs/reference/modules/Queries/#graphql
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/459460.html
標籤:.NET Core
