iT邦幫忙

0

最近工作要開發Sharepoint的客製功能,需要應用到 Taxonomy 欄位並用字詞組當選項,
然而在當建立好之後,新增資料時會出現"正在更新的 SPListItem 未擷取到所有分類欄位。"
https://ithelp.ithome.com.tw/upload/images/20180919/20111809IbCP8zPdQO.png
研究一番之後了解知道怎麼正確建立欄位,並寫下來分享。

環境簡介:SharePoint 2016、Visual Studio 2017

建立欄位

  1. 以系統管理員開啟 Visual Studio -> 新增 -> 專案 -> 選擇 "SharePoint 2016 空專案" -> 輸入專案名稱後按確定。 ※因為要直接連線站台,要使用系統管理員開啟。

  2. 輸入站台網址,選擇佈署為陣列方案,按下完成。

  3. 由於專案名稱不是我要的,所以先刪掉專案。
    https://ithelp.ithome.com.tw/upload/images/20180919/20111809AhqcxoxYLN.png

  4. 在解決方案按下右鍵 -> 加入 -> 新增專案 -> 選擇空專案,名稱輸入 "mysite.column",按下確定 。

  5. 在專案上按下右鍵 -> 加入 -> 新增項目,選擇 "網站資料行",建立兩個欄位 "姓名(myName)"、"居住縣市(myLocation)",居住縣市是要拿來做Taxonomy的欄位。

  • myName的Elements.xml
<?xml version="1.0" encoding="utf-8"?>
<Elements xmlns="http://schemas.microsoft.com/sharepoint/">  
  <Field
       ID="{d1a3001d-8161-4a02-b4c0-45d069deccf3}"
       Name="myName"
       DisplayName="姓名"
       Type="Text"
       Required="FALSE"
       Group="Custom Site Columns">
  </Field>
</Elements>
  • myLocation的Elements.xml
    "居住縣市"Field,Type改成TaxonomyFieldType(若要多選擇改成 TaxonomyFieldTypeMutil,不過我沒測試過),並加入 ShowField="Term1028" 這段代碼,代表此欄位為zh-tw的地區設定。
    ※地區設定說明請參考:地區設定 - 維基百科,自由的百科全書
    "居住縣市_0"Field,標籤照著下面輸入,ID的部分可用Visual Studio的 工具 -> 建立GUID來產生一個新的,Tyep為Note,ShowInViewForm設為False,Hidden設為True,這個欄位是Taxonomy存放實際資料的欄位,所以欄位不需要顯示。
<?xml version="1.0" encoding="utf-8"?>
<Elements xmlns="http://schemas.microsoft.com/sharepoint/">
  <Field
     ID="{47BF9D02-EFE2-4791-9C6D-7184629C06DC}"
     Name="myLocation_0"
     DisplayName="居住縣市_0"
     SourceID="http://schemas.microsoft.com/sharepoint/v3/fields"
     Type="Note"
     Group="Custom Site Columns"
     ShowInViewForms="FALSE"
     Hidden="TRUE">
  </Field>
  <Field
       ID="{4316be76-f19b-4af5-8446-1939f4e7747d}"
       Name="myLocation"
       DisplayName="居住縣市"
       Type="TaxonomyFieldType"
       ShowField="Term1028"
       Required="FALSE"
       Group="Custom Site Columns">
  </Field>
</Elements>
  1. 到網站的 網站設定 -> 網站管理 -> 新增如圖片的字詞組。 台灣行政區.csv
    https://ithelp.ithome.com.tw/upload/images/20180919/20111809qo4GAhkXYo.png

  2. 回到專案,在專案的 "參考" 加入 "Microsoft.Sharepoint.Taxonomy" 組件。

  3. 開啟Feature資料夾,在Feature1按下右鍵 -> 加入事件接收器,在EventReciver.cs 內引最上方引用
    using Microsoft.SharePoint.Taxonomy; 並在class內加上下面這段程式碼。
    ※ fieldIdBU、noteFieldIdBU 及 MapManagedMetadataField 的參數請依照自己的狀況修改

        public override void FeatureActivated(SPFeatureReceiverProperties properties)
        {
            SPSite site = (properties.Feature.Parent as SPWeb).Site;    //依照專案部屬類型要隨著修改,此行是將專案部屬在web上

            // Map Managed Metadata site columns
            Guid fieldIdBU = new Guid("{4316be76-f19b-4af5-8446-1939f4e7747d}");    //Taxonomy欄位的GUID
            Guid noteFieldIdBU = new Guid("{47BF9D02-EFE2-4791-9C6D-7184629C06DC}");    //Note欄位的GUID
            
            //參數為 (Taxonomy欄位, Note欄位, 網站, 服務應用名稱, 字詞組群組, 字詞組名稱)
            MapManagedMetadataField(fieldIdBU, noteFieldIdBU, site, "Managed Metadata Service", "Taiwan", "台灣行政區");
        }

        private void MapManagedMetadataField(Guid fieldId, Guid noteFieldId, SPSite site, string sTermStore, string sTermGroup, string sTermSet)
        {
            if (site.RootWeb.Fields.Contains(fieldId))
            {
                TaxonomySession session = new TaxonomySession(site);

                if (session.TermStores.Count != 0)
                {
                    var termStore = session.TermStores[sTermStore];
                    var group = GetByName(termStore.Groups, sTermGroup);
                    var termSet = group.TermSets[sTermSet];
                    TaxonomyField field = site.RootWeb.Fields[fieldId] as TaxonomyField;

                    // Set Manage Metadata's Text field to Note field
                    field.TextField = noteFieldId;

                    // Connect to MMS
                    field.SspId = termSet.TermStore.Id;
                    field.TermSetId = termSet.Id;
                    field.TargetTemplate = string.Empty;
                    field.AnchorId = Guid.Empty;
                    field.Update();
                }
            }
        }

        private Group GetByName(GroupCollection groupCollection, string name)
        {
            if (String.IsNullOrEmpty(name))
            {
                throw new ArgumentException("Not a valid group name", "name");
            }
            foreach (var group in groupCollection)
            {
                if (group.Name == name)
                {
                    return group;
                }
            }
            throw new ArgumentOutOfRangeException("name", name, "Could not find the group");
        }
  1. 佈署Column專案。
  2. 確認欄位有新增成功。 https://ithelp.ithome.com.tw/upload/images/20180919/20111809amAUY2ChqE.png
  3. 以及字詞組有對應正確。 https://ithelp.ithome.com.tw/upload/images/20180919/20111809mViiYNqxL0.png

建立內容類型(Content Type)

  1. 重新開啟Visual Studio,這樣後面才抓得到剛剛佈署上去的網站欄位。
  2. 在同一個解決方案下,加入一個新專案,名稱設為 mysite.contenttype。
  3. 在專案內加入新項目,選擇"內容類型"名稱設定"myContentType",繼承的基底類型選"項目"。
  4. 在"資料行"這個頁籤內,加入剛剛的三個欄位。(姓名、居住縣市、居住縣市_0)
  5. 開啟myContentType底下的Elements.xml,並在FieldRefs的標籤中加上 "分類法全部擷取欄"。(系統存放字詞組內容的隱藏欄位)
    <FieldRef ID="{f3b0adf9-c1a2-4b02-920d-943fba4b3611}" DisplayName="分類法全部擷取欄" Hidden="TRUE" />
  6. 佈署ContentType專案。
  7. 檢查網站內容類型是否有建立,欄位是否有出現。※"居住縣市_0" 和 "分類法全部擷取欄" 是隱藏欄位,沒有顯示是正常的。
    https://ithelp.ithome.com.tw/upload/images/20180919/20111809LbQwg1tDKw.png

建立清單

  1. 重新開啟Visual Studio,這樣後面才抓得到剛剛佈署上去的內容類型。
  2. 在同一個解決方案下,加入一個新專案,名稱設為 mysite.list。
  3. 在專案內加入新項目,選擇"清單"名稱設定"mylist",清單範本選"預設值(自訂清單)"。
  4. 按下"資料行"頁籤的"內容類型"按鈕,把原生內容類型都清空後按下確定,然後清空資料行。
  5. 再點一次"內容類型"按鈕,加入剛剛新建的myContentType加入後按下確定,資料行會自動載入ContentType的所有欄位。
  6. 佈署List專案。
  7. 檢查專案是否有建立,清單設定的ContentType和欄位是否正確,並新增一筆資料測試是否正常。
    https://ithelp.ithome.com.tw/upload/images/20180919/20111809oeFFmx1Ud3.png

參考網站

Create Managed Metadata column (TaxonomyFieldType) in Visual Studio | Tjen Sharepoint Blog
https://tjendarta.wordpress.com/2013/07/19/create-managed-metadata-column-taxonomyfieldtype-in-visual-studio/


尚未有邦友留言

立即登入留言