絶対URLからSPViewを取得する

絶対URLからSPViewを取得する方法です。 SPViewはSPListと同様、http://から始まる絶対URLで取得することができません。 SPViewはホスト名からの相対URLで取得します。管理パスとかサブサイトとかで階層がどんなに深くなっていても、ホスト名からの相対URLを指定します。 従って、以下のコードのように何らかのやり方でホスト名までの部分を削除し、その値をSPWebのGetViewFromUrlメソッドに渡します。

1: Uri uri = new Uri("http://test.co.jp/test/Lists/List1/AllItems.aspx");
2: SPSite site = new SPSite(uri.AbsoluteUri);
3: SPWeb web = site.OpenWeb();
4: string targetUrl = uri.AbsoluteUrl.Replace(string.Format("{0}{1}", uri.GetLeftPart(UriPartial.Scheme), uri.Host), "");
5: SPView view = web.GetViewFromUrl(targetUrl);

指定の絶対URLでSPViewが取得できない場合、SPExceptionが発生します。 SPWebやSPListが取得できないときは、FileNotFoundExceptionが発生するのに、SPViewだけはSPExceptionなので、注意が必要です。

読了時間: 1分

絶対URLからSPListItemを取得する

絶対URLからSPListItemを取得する方法です。 SPListItemの取得方法は、対象がファイルまたはフォルダか、リストアイテムかで若干異なります。 ファイル、フォルダの取得 ファイルまたはフォルダのSPListItemを取得する場合、SPListと同様、ホスト名からの相対URLで取得します。 以下のコードでは、Documentsドキュメントライブラリの直下のtestフォルダ内のmemo.txtのSPListItemを取得します。

1: Uri uri = new Uri("http://test.co.jp/Documents/test/memo.txt");
2: SPSite site = new SPSite(uri.AbsoluteUri);
3: SPWeb web = site.OpenWeb();
4: string targetUrl = uri.AbsoluteUrl.Replace(string.Format("{0}{1}", uri.GetLeftPart(UriPartial.Scheme), uri.Host), "");
5: SPListItem file = web.GetListItem(targetUrl);

次は、Documentsドキュメントライブラリの直下のtestフォルダのSPListItemを取得するコードです。

読了時間: 1分

絶対URLからSPListを取得する

絶対URLからSPListを取得する方法です。 結論から言うと、SPListはhttp://から始まる絶対URLで取得することができません。 SPListはホスト名からの相対URLで取得します。管理パスとかサブサイトとかで階層がどんなに深くなっていても、ホスト名からの相対URLを指定します。 従って、以下のコードのように何らかのやり方でホスト名までの部分を削除し、その値をSPWebのGetListメソッドに渡します。

1: Uri uri = new Uri("http://test.co.jp/test/Lists/List1/DispForm.aspx?ID=1");
2: SPSite site = new SPSite(uri.AbsoluteUri);
3: SPWeb web = site.OpenWeb();
4: string targetUrl = uri.AbsoluteUrl.Replace(string.Format("{0}{1}", uri.GetLeftPart(UriPartial.Scheme), uri.Host), "");
5: SPList list = web.GetList(targetUrl);

これで問題なさそうですが、SPWeb.GetListメソッドは一つだけ注意点があります。 SPWeb.GetListメソッドは、引数として渡されたURLのファイル名の部分まで意味を持ちます。 例えば、リスト名までは合っていてもファイル名の部分に間違いがあると、SPListを取得することができません。 以下のコードは、DispForm.aspxがDisp.aspxと間違えているため、SPListは取得できません。

読了時間: 1分

絶対URLからSPWebを取得する

絶対URLからSPWebを取得する方法です。 SPWebを取得するには、まずSPSiteを取得する必要があります。 SPSiteの取得は、別の記事にも書いた通り、SPSiteのコンストラクタの引数に、絶対URLを渡して取得します。 その後、続けてOpenWebメソッドを引数なしで呼び出すことで、SPWebを取得できます。 以下のコードでは、testというサブサイトを指定しています。 このコードの結果は、testサブサイトが取得できます。

1: SPSite site = new SPSite("http://test.co.jp/test/Lists/List1/DispForm.aspx?ID=1");
2: SPWeb web = site.OpenWeb();

SPSiteと同様、サイトが特定できれば、後半のURLは存在しないコンテンツを指していても問題ありません。 以下のコードでは、test2という存在しないサブサイトを指しています。 このコードの結果は、http://test.co.jpのトップサイトが取得できます。

読了時間: 1分

絶対URLからSPSiteを取得する

絶対URLからSPSiteを取得する方法です。 SPSiteのコンストラクタの引数に、絶対URLを渡すとSPSiteが取得できます。

1: SPSite site = new SPSite(http://test.co.jp/test/Lists/List1/DispForm.aspx?ID=1);

管理パスを定義している場合は、SharePointが自動的に管理パスかどうかを判断し、適切なSPSiteを返してくれます。 例えば、http://test.co.jp直下のサイトコレクションの下位にtest1という管理パスを定義し、そこにサイトコレクションを作成した場合、以下のコードではtest1のサイトコレクションを取得します。

1: SPSite site = new SPSite("http://test.co.jp/test1/Lists/List1/DispForm.aspx?ID=1");

サイトコレクションが特定できれば、後半のURLは存在しないコンテンツを指していても問題ありません。 以下のコードでは、test2という存在しないサブサイトを指しています。 このコードの結果は、http://test.co.jpのサイトコレクションが取得できます。

1: SPSite site = new SPSite("http://test.co.jp/test2/Lists/List1/DispForm.aspx?ID=1");

指定の絶対URLでSPSiteが取得できない場合、FileNotFoundExceptionが発生します。

読了時間: 1分

修正モジュールのインストール手順

修正モジュールのインストール手順に関するドキュメントです。 手順だけではなく、本家TechCenterにある修正モジュール一覧と同じような情報も載っています。 Windows SharePoint Services 3.0 用のソフトウェア更新プログラムを展開する http://technet.microsoft.com/ja-jp/library/cc288269.aspx Office SharePoint Server 2007 のソフトウェア更新プログラムを展開する http://technet.microsoft.com/ja-jp/library/cc263467.aspx

読了時間: 1分

SharePoint API で web.config を変更する

SharePoint API には、web.configを変更するためのクラスが用意されています。 このクラスを使うことで、たとえばFeatureのインストール時に自動的にweb.configを変更するということができるようになります。 web.configの変更には、SPWebConfigModificationクラスとSPWebServiceクラスを利用します。 例として、web.config内のappSettingsに値を追加する処理を書いてみます。 **1.変更内容をSPWebConfigModificationクラスにセットする。**SPWebConfigModificationクラスは、web.configに加える変更情報を保持するクラスです。 web.configを変更したい場合には、このクラスに変更内容をセットすることになります。

1: SPWebConfigModification appSetting = new SPWebConfigModification();
2: appSetting.Path = "configuration/appSettings";
3: appSetting.Name = "add[@key='NewKey']";
4: appSetting.Owner = "orivers";
5: appSetting.Sequence = 0;
6: appSetting.Type = SPWebConfigModification.SPWebConfigModificationType.EnsureChildNode;
7: appSetting.Value = "<add key='NewKey' value='NewValue'/>";

  各プロパティの詳細はヘルプを見ていただくとして、ここでは簡単に説明します。 Pathプロパティに変更対象となるノードを指定し、Valueプロパティに変更内容を指定します。 Nameプロパティは、この変更を一意に識別するための値です。 Ownerプロパティも、Nameプロパティと合わせて、変更を一意に識別するために使用します。 Typeプロパティは、変更内容に合わせたタイプを指定します。 **2.変更を実行する。**SPWebConfigModificationクラスの作成が完了したら、web.configのアップデートをしたいWebアプリケーションで変更を実行します。

読了時間: 1分

ListTemplateIDの一覧

ListTemplateIDの一覧です。

ListTemplateID
GenericList100
DocumentLibrary101
Survey102
Links103
Announcements104
Contacts105
Events106
Tasks107
DiscussionBoard108
PictureLibrary109
DataSources110
WebTemplateCatalog111
UserInformation112
WebPartCatalog113
ListTemplateCatalog114
XMLForm115
MasterPageCatalog116
NoCodeWorkflows117
WorkflowProcess118
WebPageLibrary119
CustomGrid120
DataConnectionLibrary130
WorkflowHistory140
GanttTasks150
Meetings200
Agenda201
MeetingUser202
Decision204
MeetingObjective207
TextBox210
ThingsToBring211
HomePageLibrary212
Posts301
Comments302
Categories303
IssueTracking1100
AdminTasks1200

読了時間: 1分

SharePoint オブジェクト の Dispose について

SPSiteやSPWebといった、SharePoint オブジェクトは、COMオブジェクトであるために、.NETのガベージコレクタではメモリが解放されません。 従って、きちんとDisposeをしてあげないといけないわけです。 Disposeをするタイミングについてまとまった記事があったのでご紹介します。 http://blogs.msdn.com/rogerla/archive/2008/02/12/sharepoint-2007-and-wss-3-0-dispose-patterns-by-example.aspx

http://www.sharepointdevwiki.com/display/public/When+to+Dispose+SharePoint+objects Disposeが正しく行われるようコードが書かれているかを自動的にチェックするツールが存在します。 私の環境ではエラーが出てうまく動いていません。。。

http://code.msdn.microsoft.com/SPDisposeCheck

読了時間: 1分

WSSの外部公開で気を付けたこと

今日は、このサイトをWSS化して、インターネットに公開するにあたり気を付けたことを一つ書きたいと思います。

それは、すべてのコンテンツページ(layoutsフォルダ配下のviewlsts.aspx)へのアクセスをどのように拒否するかということです。

なぜ拒否する必要があったかというと、以下のような理由があるからです。 ・その他のページとマスターページを合わせるのが困難 ・見せたくないコンテンツまで見えてしまう

特に1つ目の問題は、見た目が大事な外部公開サイトでは結構大きな問題になるかなと思います。

今回のように特定のページへのアクセスを防ぐ方法はいくつかあると思いますが、今回はHTTPモジュールを使ってリクエストされたURLをみて、リクエストを受け入れるか、拒否するかを判断する処理を追加してみました。

ちょっとエラーの出かたがいけてないのですが、本来の目的は果たせているかなと思っています。

読了時間: 1分