サイトの外観とサイト テンプレートについて

こんにちは SharePoint サポートの森 健吾 (kenmori) です。

今回の投稿では、SharePoint Online および SharePoint Server 2013 でサイト テンプレートを使用した際のサイトの外観の機能の制限事項について記載させていただきます。

- 目次
サイトの外観について
構成済みの外観とサイト テンプレートにおけるこれまでの修正について
構成済みの外観のサイト テンプレート化の動作について
大量横展開のシナリオ

サイトの外観について

[サイトの設定] より [外観の変更] をクリックすることで、簡単にサイトのデザインを変更することができるのが、サイトの外観の機能となります。

上記の外観の定義は、[サイトの設定] より [構成済みの外観] をクリックした際に表示されるリスト (デザイン ギャラリー) に保持しており、このリストのデータと連携する形式となります。
これらのデータには、マスター ページの URL やテーマの URL、イメージの URL、フォント パターンの URL などが含まれます。

構成済みの外観とサイトテンプレートにおけるこれまでの修正について

今回の投稿は、SharePoint Server 2013 においては 2014 年 11 月の CU 以降の話となります。それ以前のバージョンにおける現象については、製品の不具合がいくつか報告されております。詳細は割愛させていただきますが、安定して構成済みの外観とサイト テンプレートを使用するためには、2014 年 11 月 CU 以降の適用が不可欠となる旨ご了承ください。

RTM からの問題

条件 : コンテンツを含まない形でテンプレートとしてサイトを保存する。
現象 : テンプレートから作成されたサイトでは構成済みの外観リストにアイテムがないため、外観の変更ができなくなる。

2014 年 4 月 CU の問題

RTM からの問題は修正されましたが、下記の問題が発生するようになりました。

条件 : コンテンツを含むを指定してテンプレートとしてサイトを保存する。
現象 : テンプレートから作成されたサイトには構成済みの外観リスト自体が欠落しており、サイト作成時に "リストがありません" という旨のエラーが発生する。

2014 年 11 月 CU 以降

上記双方の問題の修正が修正されました。

構成済みの外観のサイトテンプレート化の動作について

上記の修正によって動作が変更された部分もございましたが、結果的に下記の動作が製品として想定された動作となります。

コンテンツを含まない場合
コンテンツを含まないテンプレートを使用した場合、外観に対する変更は保持されず、通常のサイト作成時と同じ状況 (初期状態) になります。

サイト テンプレートからサイトを作成する際は、1) テンプレート内の情報の復元、2) サイトの初期化・機能のアクティブ化処理という順序で実行されます。この際、コンテンツを含まないテンプレート内に含まれる構成済みの外観リストが先に復元されますが、コンテンツを含まないテンプレートの場合、このテンプレート化されていたリストはサイト作成時に削除されます。
その後、サイトの初期化処理にて標準の構成済みの外観リストが再作成されることにより、結果的に初期化される動作となります。

上記の通り、構成済みの外観リストへの変更を保持できないため、サイトの外観の変更はコンテンツを含まないテンプレートを通して反映させることはできません。

コンテンツを含む場合

トップ サイトをテンプレート化してトップ サイトを生成するパターンと、サブ サイトをテンプレート化して同一サイト コレクション内のサブ サイトとして展開する場合のみ対応しています。
下記のようなマトリクスにて対応可否の差があります。

<上図の説明>
サイト コレクションのトップ サイトをテンプレート化して、別サイト コレクションのトップ サイトとして作成する場合、サイトの外観および構成済みの外観リストへの変更は作成されたサイトに引き継がれます。

サブ サイトをテンプレート化し、同じサイトコレクション内にサイトを作成した場合、サイトの外観および構成済みの外観リストへの変更は、テンプレート作成元と同じトップ サイトを参照することから作成されたサイトに引き継がれます。

サブ サイトをテンプレート化し、別のサイト コレクションにサイトを作成した場合、サイトの外観および構成済みの外観リストへの変更は作成されたサイトに引き継がれません。
構成済みの外観リストで外観を構成するリソースに対しリンク切れが生じているため、下記のように [外観の変更] 画面に選択できる外観の候補が表示されません。これは製品の制限事項となります。

この制限事項の要因は、構成済みの外観リストのサイト コレクションを範囲としたデータ構造と、サイト テンプレートのサイトを範囲とした構造間において互換性がないことに起因します。下記図にて詳細をご説明いたします。

サブ サイトの構成済みの外観リストのデータを見てみると、テーマの URL とフォント パターンの URL は、テンプレート化された自サイトではなくトップ サイトの URL になっています。上図の色の違いをご参考にしてください。

サイト テンプレートは、サイトを対象としたテンプレートとなりますため、自サイトの URL を生成先のサイトの URL に応じて変換する処理が備わっています。
しかし、自サイト以外の URL をテンプレート化した場合、テンプレート化されたものと同じ状態でそのまま別サイトに復元します。つまり、作成されたサイトの親サイトを見ているため、同じサイト コレクション内への展開は正常に動作します。しかし、別のサイト コレクションに展開した場合は、テンプレート作成元の別サイト コレクションの URL のままとなり、作成されたサイトの親サイトに自動的に置き換わることはありません。
この動作の理由として、構成済みの外観に限らず、ハイパーリンク列はユーザーが手動で全く別のサイト上のコンテンツに再リンクすることが可能となっていることに起因します。ユーザーが設定し得るあらゆる条件を考慮した場合、製品としてユーザーが意図した設定を適切に読み取り、悪影響を与えず構成済みの外観リストのデータを自動的に修正することが現実的に不可能という判断に至っています。

ご不便をおかけする形となりますが、別サイト コレクションにサブ サイトを展開する場合は、手動でリンク先を修正するなどの作業を実施すれば引き続き外観を使用できますので、こちらが現実的な対処策となります。

なお、上図で想像できる通り、トップ サイトで、外観および構成済みの外観設定が適切に引き継がれる理由は、自サイトが所属するサイト コレクションのトップ サイトが自サイトであることに他なりません。上図にて色の相違がないことからも明らかとなります。サイト テンプレートを使用すると、自サイトのコンテンツは生成先のサイトの URL に変換しますので、外観の設定が適切な状態で再生成されます。

 

補足 

なお、上記マトリクスで説明を省略しましたが、トップ サイトで採取したサイト テンプレートをサブ サイトとして展開する方法を実施すると、すべての URL がサブサイトに置き換わります。しかし、一部のリソースはトップ サイトに存在すべきであり、結果的にサイトコレクション内外、どちらに展開したとしても正常に動作しません。
また、そもそもサイト コレクション レベルで機能を有効化した際に、様々なリソースや特殊な権限などがトップ サイトに展開されます。これらのオブジェクトがテンプレートを通じてサブ サイトに含まれることを製品としては想定しておりません。製品側としてはトップ サイトで生成したテンプレートをサブ サイトに展開する方法を禁止しておりませんが、推奨はしておりません。

大量横展開のシナリオ

サイト テンプレートを使用する多くのユーザー シナリオにおいて、複数サイトの大量な横展開があります。
あらかじめサイト テンプレート内にコンテンツを作成してから、展開するシナリオに限定すれば、運用的に問題を緩和できる対処策が考えられます。

下図のように、トップ サイトとサブ サイトを同じ組み合わせでコンテンツを含む形で展開した場合、対処すべき個所はサブ サイトのテーマの URL と、フォント パターンの URL だけとなります。

SharePoint オンプレミス版の場合は、サブ サイト作成時のイベント レシーバーにて、構成済みの外観リストのテーマおよびフォント パターンの URL を、作成されたサイトのトップ サイトに置き換える方法が考えられます。

タイトル : SPWebEventReceiver.WebProvisioned method
アドレス : https://msdn.microsoft.com/en-us/library/microsoft.sharepoint.spwebeventreceiver.webprovisioned.aspx

また、イベント レシーバーを使用しなくても、大量展開の後、PowerShell のバッチ処理で上記のようなプログラムを一斉に実行する方法もあるでしょう。

プログラムの実装内容については、通常のリスト アイテムへの操作となります。お客様データを変更するなどの重要な内容となりますため、本ブログでのサンプル コードの紹介は割愛とさせていただきますが、必要となる定義情報を以下にご紹介させていただきます。

補足 : 構成済みの外観リストへのアクセス方法は、SPWeb.GetCatalog メソッドを使用し、引数に SPListTemplateType.DesignCatalog を指定する方法が一般的となります。

タイトル : SPWeb.GetCatalog method
アドレス : https://msdn.microsoft.com/en-us/library/office/microsoft.sharepoint.spweb.getcatalog.aspx

また、適用されていたデザインの再適用は SPWeb.MasterUrl, SPWeb.CustomMasterUrl, SPWeb.ThemedCssFolderUrl を使用します。

タイトル : SPWeb.MasterUrl property
アドレス : https://msdn.microsoft.com/EN-US/library/office/microsoft.sharepoint.spweb.masterurl.aspx

タイトル : SPWeb.CustomMasterUrl property
アドレス : https://msdn.microsoft.com/EN-US/library/office/microsoft.sharepoint.spweb.custommasterurl.aspx

タイトル : SPWeb.ThemedCssFolderUrl property
アドレス : https://msdn.microsoft.com/EN-US/library/office/microsoft.sharepoint.spweb.themedcssfolderurl.aspx

SharePoint Online につきましては、CSOM の Web Class をご確認ください。

タイトル : Web members
アドレス : https://msdn.microsoft.com/en-us/library/office/microsoft.sharepoint.client.web_members.aspx

上記の通り製品としては、あらゆる運用を想定した対応は不可能ですが、限定されたユーザー シナリオにおいては、カスタマイズを使用することで運用への負担を減らすことが可能となります。
ご参考にしていただけますと幸いです。