2012年9月

2012年9月28日 (金)

Visual Studio 2010 によるSharePoint Web パーツ開発といったソリューション開発では SharePoint  サイトをホストする IIS サイト内の Web.Config を書き換える必要があります。Web.Config は SPWebCOnfigModification クラスを利用することで、コードから編集できます。通常はフィーチャー レシーバーを用いて、フィーチャーがアクティブ化された際に実行します。

 このオブジェクトはSPWebApplication オブジェクトまたは SPWebService オブジェクトのWebConfigModifications プロパティ経由で取得します。MSDN のサンプルコードを例を下記に転機します。

SPWebService myService = SPWebService.ContentService; SPWebConfigModification myModification = new SPWebConfigModification(); myModification.Path = "configuration/SharePoint/SafeControls"; myModification.Name = "SafeControl[@Assembly='MyCustomAssembly'][@Namespace='MyCustomNamespace'][@TypeName='*'][@Safe='True']"; myModification.Sequence = 0; myModification.Owner = WebConfigModificationFeatureReceiver.OwnerId; myModification.Type = SPWebConfigModification.SPWebConfigModificationType.EnsureChildNode; myModification.Value = ""; myService.WebConfigModifications.Add(myModification); myService.Update(); myService.ApplyWebConfigModifications();

SPWebConfigModification オブジェクトに指定するプロパティは次の通りです。

  • Path プロパティ … 編集対象となるWeb.Config 内の親ノードを指定します。この例では SafeControlエントリーを追加する親ノードを示しています。
  • Type プロパティ … 追加するのが、子ノードなのか(EnsureChildNode)、属性なのか(EnsureAttribute)、セクションなのか(EnsureSection)を指定します。SafeControlsノードに追加したいのは子ノードなので、この例ではEnsureChildNode を指定しています。
  • Name プロパティ … Type で指定しているのが EnsureChildNode の場合はXPathで指定する必要があります。この例では、"SafeContorl[@Assembly=...." は対象となる子ノードを指定しています。
  • Value プロパティ …  Type で指定しているのが EnsureChildNode の場合は、指定した親ノードに追加する子ノードを表すXML文字列を指定します。TypeがEnsureSection の場合はセクション名を、EnsureAttributeの場合は属性に設定したい値を指定します。
  • Ownerプロパティ … どのコードで追加した変更内容なのかを追跡するための目印として使用します。
  • Sequrence プロパティ…変更内容を示す連番です。0から65536までを指定します。同じノードまたは同じ属性の型を編集する場合にのみ使用します。重複して適用される場合は、低い値の番号のものが先に適用されます。

この内容を最終的にはWebConfigModificationsコレクションオブジェクトに追加し、Update()メソッドとApplyWebConfigModifications()を呼び出して適用します。

なお、NameプロパティやValueプロパティには.NETアセンブリのFullNameと名前空間を指定する必要がありますが、コードから取得する場合は次のように記述することもできます。

... string assemblyValue = typeof(<クラス名>).Assembly.FullName; //アセンブリの完全名 string namespaceValue = typeof(<クラス名>).Namespace; //アセンブリの名前空間名 ...

上記のコードを実際に展開する際にたとえば Pathプロパティを間違ってしまっている場合には次のようなエラーメッセージが表示されます。

  SPWebConfigModificationError

エラーに従ってPathを正しく設定しなおして、再度このソリューションを展開しますが、場合よっては同じエラーが表示され Web.Config が編集されません。

WebConfigModificationsコレクションオブジェクトには、Addメソッドが呼ばれるたびにSPWebConfigModificationオブジェクトが追加されていきます。自動的に削除されることはありません。そのため、不正なPathを記載したままの状態でオブジェクトが追加されてしまっているため、何度ソースコードを修正してもエラーが修正されないということが起こりえます。

そのため、適切なタイミングでオブジェクトを削除するコードを実装しておく必要があります。削除時に活躍するのが Owner プロパティです。特定のコードから追加したエントリーのみを削除するために、Ownerプロパティで判定するとよいです。

... SPWebService contentService = SPWebService.ContentService; List modifications = new List(); foreach (SPWebConfigModification mod in contentService.WebConfigModifications) { if (mod.Owner == owner) { modifications.Add(mod); } } foreach (SPWebConfigModification delmod in modifications) { contentService.WebConfigModifications.Remove(delmod); } contentService.Update(); ...

SPWebConfigModification の利用については次のブログ記事が参考になりますので、一度目を通しておくと良いですよ。

http://didierdanse.net/blogs/dev_en/archive/2009/09/11/sharepoint-how-to-use-spwebconfigmodification-class.aspx

2012年9月27日 (木)

 半年ほど前にリリースした弊社オリジナル コース「OH-12-205 JavaScript を使ったサイト カスタマイズ入門」の内容をアップデートしました。この研修では SharePoint Designer 2010 のみのカスタマイズから一歩進んだカスタマイズ方法を習得できます。

コンテンツ エディタWebパーツをうまく利用し、ユーザーに利用しやすい簡単操作画面を提供するための基本を学べます。たとえば、以前のブログ記事でご紹介したクォータ状況情報取得コードの解説するだけでなく、サイト作成、リスト作成のパーツ作成や、リスト内の項目の表示非表示を制御したり、他のリストから選択肢の項目を取得する方法、フィールドの文字数カウントを表示する機能などの作成方法を体系立てて1日で学習できます。

SharePoint 2013 でも JavaScript によるカスタマイズは機能強化されている部分であるため、人材育成を考え、まずはSharePoint 2010をベースに基本機能は学習しておきたいところです。

ご参考まで。

[サイト作成]

ECMA-SiteCreation

[リスト作成]
ECMA-CreateList

[文字数カウント] 

ECMA-Count

2012年9月26日 (水)

VIsual Studio 2010 を使った SharePoint 2010 ワークフロー開発を体系立てて学習できるトレーニング コースを公開しました。ワークフロー開発は 3rd パーティ製品を導入するケースも多いため、弊社では SharePoint Designer 2010 を使った開発までにとどめ、Visual Studio 2010 ベースのトレーニングコースの開発をしばらく見合わせていましたが、近頃お問い合わせがいくつか出てきたため、改めてコンテンツをリリースしました。

1 day で一通りのワークフロー開発の基礎を学べます。ワークフローの提案などをされる方も、3rd パーティ製品とどう違うのか、どのような難易度となっているのか、どんなスキルが必要となるのかなどを把握できます。

ご参考まで。

SharePoint Server 2010 ワークフロー開発基礎Ⅱ

 

2012年9月25日 (火)

SharePoint Designer 2010 で利用するアクションは、Visual Studio 2010 でカスタム アクションとして開発できます。ざっと流れを書くと次の通りです。

1. Worflow Activity クラスの継承クラスを作成する
2. クラス内には、必要に応じて依存プロパティ(dependency property) を実装する
3. Execute メソッドをオーバーライドする
4. ワークフロー アクションを定義するスキーマファイル (*.actions) を作成する
5. フィーチャー レシーバーを実装し、フィーチャーがアクティブ化されたら Web.Config を書き換える
6. ソリューションを展開する

ソリューション展開後に、SharePoint Designer 2010 でカスタム アクションを利用してワークフローロジックを生成し発行した際に次のエラーメッセージが表示されることがあります。

「ワークフローのコンパイル中にエラーが発生しました。ワークフロー ファイルは保存されましたが、実行することはできません。 ---   "クラス名" はアクセスできない保護レベルになっています。」

SPD-CustomAction-Error

このメッセージが現れたら、1 で定義したWorkflow Activity の継承クラスが public となっているかを確認しましょう。public を指定し忘れると、上記のようなエラーが発生します。

-------------------------------------------------------

オフィスアイ株式会社 関連研修
Microsoft SharePoint Server 2010 ワークフロー開発基礎Ⅱ

2012年9月20日 (木)

CEWP(コンテンツ エディタ Web パーツ) を使って、パーツを配置したページのサイド リンクバー(Quick Launchともいう)を非表示にするには、スタイルシートを記述するのが簡単です。


手順は次のとおりです(この例ではWikiページに配置します)。

  1. 任意のページにCEWPを追加します。
  2. [Webパーツの編集]メニューをクリックします。
    CEWP-01
  3. Webパーツの中にカーソルを挿入します。
    CEWP-02
  4. リボンメニューから[HTMLで編集]をクリックします。
    CEWP-03
  5. スタイルシートを記述し、[OK]をクリックします。
    CEWP-04
  6. Webパーツのツールパーツ内で、枠の表示を「なし」に変更し、[OK]をクリックします。
    CEWP-05
  7. リボンメニューから[編集を保存する]をクリックします。
    CEWP-07

  CEWP-06