SharePoint 2013 SharePoint Designer でリボン内にメニュー作成 – 他のサイトにお知らせコピー

こんばんは、奥田です。昨日の投稿で SharePoint Designer を利用したカスタム アクション作成 (ワークフロー起動ボタン) をご紹介しました。今日はカスタム アクション作成 JS 書ける人向けバージョンです。

SharePoint Designer でカスタム アクションを作成する場合、独自で作成したボタンクリック時の操作として、URL も指定できます。ここで JavaScript を指定することでボタンクリック時にさまざまな操作を組み込めます。

SharePoint はサイト内のほとんどの操作が JavaScript で操作できる API が用意されているため、標準機能だとすこし手が届かないような機能を、カスタム アクションと JavaScript を組み合わせてカスタマイズしてみます。

たとえば、下記は別のサイトにお知らせ データをコピーする例です。

javascript:var context=SP.ClientContext.get_current();var clientContext=new SP.ClientContext(‘別サイトURL’);var web=context.get_web();context.load(web);var source=web.get_lists().getByTitle(‘お知らせリスト名’);var oList = clientContext.get_web().get_lists().getByTitle(‘書き込み先サイトのお知らせリスト名’);clientContext.load(oList);var currentItem = source.getItemById({SelectedItemId});context.load(currentItem);context.executeQueryAsync(Function.createDelegate(this,copyItem),Function.createDelegate(this,error));function copyItem(sender, args){var itemCreateInfo = new SP.ListItemCreationInformation();var oListItem = oList.addItem(itemCreateInfo);oListItem.set_item(‘Title’, currentItem.get_item(‘Title’));oListItem.update();oList.update();clientContext.executeQueryAsync(Function.createDelegate(this,copyCompleted),Function.createDelegate(this,error));}function error(sender, args){alert(args.get_message());}function copyCompleted(sender, args){alert(‘コピーしました!’);}

組み込み方は次のとおりです。

  1. SharePoint Designer 2013 で対象のサイトを開きます。
  2. [サイト オブジェクト] より [リストとライブラリ] をクリックします。
  3. リストとライブラリの一覧が表示されます。対象のリストもしくはライブラリをクリックします。
  4. リボンより、[ユーザー設定のアクション] – [リボンの表示] をクリックします。
  5. [ユーザー設定のアクションの作成] ダイアログ ボックスが表示されます。
        次の設定を行い [OK] をクリックします。
       ●
    名前:任意のメニュー名
       ●
    アクションの種類:[URLへの移動] を選択し、上記スクリプトを改行やスペースなしで挿入
       ●
    ボタンイメージのURL:メニューに表示したい画像ファイルのパスを指定
           CAAno
    リスト ビュー Web パーツを利用してお知らせ新着データをトップページに表示することは、SharePoint 基本としてよく利用する機能ですが、リストビュー Web パーツは同じサイト内でのみという仕様制限があるため、他のサイトにお知らせデータを一覧表示したい場合、クエリ結果 Web パーツを利用するとかコンテンツ検索 Web パーツを利用するなど、少し設定の難易度が上がります。クエリ結果 Web パーツやコンテンツ検索 Web パーツを利用しても、リスト ビュー Web パーツのように、表形式での一覧表示は標準でできないので、なかなか悩ましいですよね。

いっそ、お知らせを表示させたい他サイト内のお知らせ リストに、お知らせデータを表示したいものだけ、このボタンをクリックしてデータをコピーさせてしまえ!そしてリストビュー Web パーツで表示したい! というカスタマイズ例です。
(以前勉強会かなにかでしゃべった内容を記事にしました)

SharePoint 2013 で利用できる JavaScript API は下記が参考になります。http://msdn.microsoft.com/ja-jp/library/office/jj163201(v=office.15).aspx

以上です。SPD でカスタム アクション作成 Tips、明日もさらに続きます うさぎ

10/1~4 開催 SharePoint 2013 開発者向け某トレーニングにご参加頂いた皆様へ

こんにちは、奥田です。

今週 10/1 ~ 4 に開催させていただいた、SharePoint 2013 Preview 開発者向けハンズオン トレーニングにご参加頂いた皆様、お忙しい中4日間のご参加ありがとうございました。
(渋谷のイベントよりも優先いただいた方もおられ、ありがとうございました)

ご案内させていただいたとおり、下記 DL できるようにしました。ご利用くださいませ。
IgniteDev2013inOctOkudaDemo.zip

・ Demo でご紹介した内容のサンプル ソースコード
(App for SharePoint の PermissionRequest と AutoHosted と CrossDomain のやつです)
・ 前で表示させていただきながら書いたメモファイル

パスワードはお伝えしたとおりです。

  以上、ご案内でした。 奥田理恵 うさぎ

SharePoint 2010 プログラムからの管理メタデータ列への値セット

管理メタデータを利用しているリスト列にプログラムから値をセットする方法についてです。リストの列に値をセットするいつものやり方だと管理メタデータ列は値を入れることができないため、次のようなコードで値を入れられます。

using (SPSite site = new SPSite("SiteURL”))
{
  using (SPWeb web = site.OpenWeb("WebURL"))
  {
    SPList list = web.Lists["ListName"];
    if (list != null)
    {
      TaxonomySession session = new TaxonomySession(site);
      foreach(SPListItem item in list.Items)
      {
       TaxonomyField taxField = item.Fields["FieldName"] as TaxonomyField;
       TermStore store = session.DefaultSiteCollectionTermStore;
       TermSet termSet = store.GetTermSet(taxField.TermSetId);
       Term term = termSet.Terms[0];
       TaxonomyFieldValue taxValue = new TaxonomyFieldValue(taxField);
       taxValue.TermGuid = term.Id.ToString();
       taxValue.Label = term.Name;
       taxField.SetFieldValue(item, taxValue);
       item.Update();
      }
    }
  }
}

ほかにも、管理メタデータが複数の値を許可している場合など、複数パターンのやり方があると思いますが、上記は複数値を許可していない場合のサンプルコードです。

[参考] MSDN
● エンタープライズ メタデータ管理の概要 (Microsoft SharePoint Server 2010 の開発者向け)
    http://msdn.microsoft.com/ja-jp/library/ee832800.aspx
Microsoft.SharePoint.Taxonomy Namespace
    http://msdn.microsoft.com/en-us/library/ee583437.aspx

奥田理恵 うさぎ

SharePoint 2010 BCS サービス管理画面が開かなくなった

こんにちは、奥田です。

SharePoint 2010 で、[全体管理] から BCS のサービス アプリケーション管理画面が 「アクセス拒否」 となり、開かなくなってしまいました。
私の開発環境 (Windows Server 2008 R2、SharePoint Server 2010、Visual Studio 2010、Azure SDK) で起こった現象なのですが、VS 2010 で Azure Web ロール プロジェクトを作成し、デバッグ実行したあと、BCS サービス アプリケーション管理画面がアクセス拒否で開かなくなりました。

あれ?さっきまで開いてたのに??  SharePoint になにか設定変更したっけ?? とかなり悩んだのですが、
問題なく BCS のサービス アプリケーション管理画面が開いていたタイミングから、エラーになってしまったタイミングの間に、私が行ったことが Azure であれこれサンプルを作ってたことくらいなんです。。
HyperV 環境だったので、Snapshot を戻し、再度 Azure プロジェクトのデバッグ実行をやってみると、あっ 開かなくなってる!
しかも他のサービス アプリケーションも確認すると Managed MetaData Service アプリケーションの管理画面も、開くけどエラーになってる。

おそらく、Azure プロジェクトのデバッグ実行時に、IIS に変更を加えられ、それが原因なのかなーと。
(時間がなかったのであまり深く調べてません)
解決策として、IIS マネージャーで、サーバー名の [認証] を開き、[匿名認証] に対して、アプリケーションプ―ルの特定のユーザーとして システム アカウント を指定することで解決しました。

参考にしたのは、下記 URL です。
TechNet Forum (英語です)
http://social.technet.microsoft.com/Forums/da/sharepoint2010setup/thread/7e948a5c-369c-49a5-9db8-4d28a7e890ea
こちらは SharePoint 2010 で Kerberos 認証を構成した後に、BCS サービス アプリケーション管理画面が開かない! といった投稿だったのですが、エラーメッセージ内容が全く同じだったため、解決方法として書き込まれている内容を試すと、Bingo でした。IISReset はいらないかと思い、私は行いませんでした。

開発環境でのみ、しかも Azure 開発環境と同居している場合にのみ起こる現象だと思うのですが、解決するのにちょっと時間がかかってしまったのでブログに共有しておこうと思いました。

奥田理恵

SharePoint 2010 ItemAdding イベント レシーバーでのエラー処理

こんばんは。奥田です。
今日は SharePoint 2010 でイベント レシーバーを開発する際の不思議な現象についてです。
昨日今日と実施させていただいた [Visual Studio 2010 による SharePoint 2010 開発] セミナーで、お客様からいただいた質問なのですが。。

ItemAdding イベントレシーバーを開発し、次のようなコードを書いた場合に、うまく動作してくれない現象についてです。

public override void ItemAdding(SPItemEventProperties properties)
{
base.ItemAdding(properties);
if(なんかの処理){
properties.Cancel = true;
properties.ErrorMessage = “エラー
“;
   
}
}

if 文に入り、イベントをキャンセルし、 「エラー」 と表示してほしいところなのですが、次のようなエラーとなります。
ererror1

コードを次のように変更し、カスタムのエラーページにリダイレクトさせると問題なく動作するのですが。。

public override void ItemAdding(SPItemEventProperties properties)
{
base.ItemAdding(properties);
if(なんかの処理){
    properties.Status = SPEventReceiverStatus.CancelWithRedirectUrl;
    properties.RedirectUrl = “/_layouts/CustomErrorPage/ErrorPage.aspx”;
}
}
ererror3

ちなみに同じロジックを Deleting とか他のメソッドで実行すると、問題なく動作。

properties.Cancel = true;
properties.ErrorMessage = “エラー“;

どうして ItemAdding だけがこうなるのかよくわからないのですが。。

いろいろ試した結果、web.config の <SharePoint><SafeMode> 要素の CallStack 属性を “false” に変更すると、ItemAdding 時の既定のエラーページを使ったエラー表示も動作しました。。
理由がわからないのが気持ちわるいですが、、ItemAdding のエラー処理は Custom Error Page を作ったほうがよさそうですね。

奥田理恵

SharePoint 2010 カスタム WCF サービスの展開

こんにちは、奥田です。
かなーり以前に、「InfoPath Forms Services 匿名アクセスで投稿したい!」 というタイトルで、InfoPath Forms Services のブラウザー フォームを匿名アクセス権限でライブラリに保存するための WCF サービスの作成、公開方法をこのブログに投稿しました。SharePoint Server 2007、InfoPath 2007 のバージョンです。
昨日 SharePoint Server 2010 で同様の WCF サービスを開発したのですが、展開時にハマったポイントがあるので、ご紹介します。

以前の投稿では、WCF サービスを開発して、SharePoint サイトをホストしている IIS 上にアプリケーションとして展開する手順をご紹介しましたが、SharePoint 2010 の場合、この方法では SPWeb とか SPSite とか Microsoft.SharePoint.dll のオブジェクトを利用する際に実行時エラーとなります。
「Microsoft SharePoint は、バージョン 4.0.30319.1 の Microsoft .Net Runtime ではサポートされません。」 と PlatformNotSupportedException がでます。

SharePoint 2010 の場合、WCF サービスを展開する際には、SharePoint 上にカスタム WCF サービスとして展開しなければいけないようです。
カスタム WCF サービスの作成については、下記記事が参考となりますが、展開方法があまり詳しく書かれていなかったので、カスタム WCF サービスを展開する SharePoint プロジェクトの開発手順をご紹介したいと思います。

「MSDN :SharePoint Foundation 2010 の WCF サービス」
http://msdn.microsoft.com/ja-jp/library/ff521586.aspx
「MSDN : カスタム WCF サービスを SharePoint Foundation で作成する」
http://msdn.microsoft.com/ja-jp/library/ff521581.aspx

<手順>

1. Visual Studio 2010 で [空の SharePoint プロジェクト] を作成します。
(ISAPI 以下に WCF サービスを展開するため、ファーム ソリューションで)

2. プロジェクト内にサービス クラスファイルと、サービスコントラクトファイルを追加
   サービスクラスに [AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]  を利用して ASP.NET 互換モードを許可するよう構成すること。

3. プロジェクト内に [SharePoint のマップされたフォルダー] で [ISAPI] フォルダーへのマップフォルダーを作成

4. [ISAPI] マップフォルダー内に、さらにフォルダーを作成し、その中に ***.svc と web.config ファイルを作成します。
   ipwcf1

5. ***.svc と web.config を開発した WCF サービスに応じて内容を編集します。
aspNetCompatibilityEnabled は true とすること。

  (例)

   ・ ***.svc
<%@ Assembly Name=”InfoPathWcf,Version=1.0.0.0,Culture=Neutral,PublicKeyToken=4d22f097b6564138″ %>
<%@ ServiceHost Service=”InfoPathWcf.InfoPathSv” %>
 
   ・ web.config

<?xml version=”1.0″ encoding=”utf-8″ ?>
<configuration>
  
<system.web> </system.web>
 
<system.serviceModel>
 
<serviceHostingEnvironment aspNetCompatibilityEnabled=”true” />
 
<services>
  
<service behaviorConfiguration=”InfoPathWcf.InfoPathSvBehavior” name=”InfoPathWcf.InfoPathSv”>
  
<endpoint address=”” binding=”basicHttpBinding” contract=”InfoPathWcf.IInfoPathSv”>
 
    <identity><dns value=”localhost” /></identity>
  
</endpoint>
  
<endpoint address=”mex” binding=”mexHttpBinding” contract=”IMetadataExchange” />
 
<host>
  
<baseAddresses>
    
<add baseAddress=”http://ci:8888/&#8221; />
  
</baseAddresses>
 
</host>
 
</service>
 
</services>
 
<behaviors>
  
<serviceBehaviors>
  
<behavior name=”InfoPathWcf.InfoPathSvBehavior”>
   
<serviceDebug includeExceptionDetailInFaults=”true”/>
   
<serviceMetadata httpGetEnabled=”true” />
  
</behavior>
 
</serviceBehaviors>
 
</behaviors>
 
</system.serviceModel>
 
</configuration>

あとは配置なり、パッケージなりを行います。

展開すると、http://SharePoint URL/_vti_bin/(ISAPI 下のフォルダー名)/****.svc でアクセスできます。
 ipwcf2

  ※ 下記ブログを参考にさせていただきました。
    http://answers.oreilly.com/topic/1404-how-to-customize-wcf-services-in-sharepoint-2010/

以上、奥田でした。

SharePoint 2010 カスタム ログイン ページの開発

おはようございます。奥田です。
先日 「アプリケーション ページの匿名アクセス」 で、カスタム ログイン ページをアプリケーション ページとして作成するために、アプリケーション ページを匿名でアクセスさせる方法についてご紹介しました。
今日は、その続きでカスタム ログイン ページの作成についてです。

SharePoint Server 2010 でフォーム認証プロバイダを開発し、カスタム ログイン ページを開発しました。カスタム ログイン ページの実装方法をあれこれと悩んだあげく、簡単に作成するために標準搭載のコントロールを利用してみました。以下作成方法です。

・ アプリケーション ページで、PlaceHolderMain 内に次のコードを記述

<SharePoint:EncodedLiteral runat=”server”
EncodeMethod=”HtmlEncode” ID=”ClaimsFormsPageMessage”
Visible=”false” /><asp:Login ID=”signInControl” FailureText=”<%$Resources:wss,login_pageFailureText%>”
runat=”server” Width=”100%” DisplayRememberMe=”false” CssClass=”LoginControl” />

そのままだと、見た目がいまいちすぎたので、スタイルをあてています。
CssClass プロパティに作成しておいたスタイル クラスを設定しています。(上記コードの LoginControl がそうです)

スタイルを整えて、できた画面はこんな感じに。

c

以上、カスタム ログイン画面の簡単作成方法でした。

さー、今からトレーニング実施ですー。
今日は 「Excel 2010 と SharePoint Designer 2010 による外部データ連携とデータ活用テクニック」 コースです。SharePoint 2010 の外部データ連携機能の活用方法や Excel を活用した SharePoint 利用シナリオについてしゃべってきまーす。

奥田理恵