カスタム リスト ビューでリソースを実装する
最終更新日: 2010年10月15日
適用対象: SharePoint Foundation 2010
このプログラミング タスクでは、標準 Microsoft SharePoint Foundation リストのカスタム ビューを作成する方法について説明します。以下の例では、2 つのカスタム リソースを作成します。1 つのリソースは、ページ フッター セクションのカスタム リンクのテキストを指定し、もう 1 つは、リストにアイテムが含まれないときに表示されるテキストを変更します。XSLT の例では、サイト コレクションで、別の場所へのリンクを含む特殊なフッター セクションを定義するために、既定の FreeForm テンプレートをオーバーライドします。また、空のリストにレンダリングされるテキストを変更するために、ViewEmpty テンプレートをオーバーライドします。
このプログラミング タスクでは、カスタム ビューを作成し、そのビューにリソースを実装する手順について説明します。
Microsoft Visual Studio 2010 でカスタム リスト定義を作成します。
プロジェクトに XSLT ファイルを追加し、XSLT ファイルを参照するように、Schema.xml の XslLink 値を変更します。
リソース文字列を定義するプロジェクトにリソース ファイルを追加します。
リストの Schema.xml ファイルにパラメーター バインドを追加し、パラメーターを使用するために XSLT ファイルに宣言を追加します。
リスト ビューでフィールドのレンダリングをカスタマイズする方法を説明するプログラミング タスクについては、「[方法] リスト ビューでのフィールドのレンダリングをカスタマイズする」を参照してください。
カスタム リスト定義を作成するには
Visual Studio 2010 で、[ファイル] メニューの [新規作成] をポイントし、[プロジェクト] をクリックします。
[新しいプロジェクト] ダイアログ ボックスの [インストールされているテンプレート] で、[Visual Basic] ノードあるいは [Visual C#] ノードを展開します。
[SharePoint] ノードを展開し、[2010] を選択します。
[プロジェクトの種類] から、[リスト定義] を選択します。
リスト定義プロジェクトの名前を入力して、[OK] をクリックします。
SharePoint カスタマイズ ウィザードで、デバッグで使用するサイトを指定します。ソリューションの信頼レベルとして、[ファーム ソリューションとして配置する] を選択して、[次へ] をクリックします。
[リスト定義の設定の選択] ダイアログ ボックスで、リスト定義の表示名を指定し、定義で使用するベース リストの種類を選択して、[完了] をクリックします。ここで指定した表示名が、[作成] ページで表示される名前です。
XSLT ファイルを追加して、参照するには
ソリューション エクスプローラーで、プロジェクトを右クリックし、[追加] をポイントして、[SharePoint のマップされたフォルダー] をクリックします。
[SharePoint のマップされたフォルダーの追加] ダイアログ ボックスで、[{SharePointRoot}\TEMPLATE\LAYOUTS\XSL] フォルダーを選択し、[OK] をクリックします。
ソリューション エクスプローラーで新しい [XSL] フォルダーを右クリックし、[追加] をポイントし、[新しいアイテム] をクリックします。
[新しい項目の追加] ダイアログ ボックスで、C# の場合は [Visual C#] ノードを、Visual Basic の場合は [共通項目] ノードを展開します。
[データ] を選択して、次に [XSLT ファイル] を選択します。ファイルの名前を指定し、[追加] をクリックします。
ソリューション エクスプローラーで、[Schema.xml] ファイルをダブルクリックしてコード エディターで開きます。
Schema.xml ファイルで [すべてのアイテム] あるいは [すべてのドキュメント] ビュー定義を探します。この定義は、TRUE に設定された View 要素の DefaultView 属性で識別することができます。
既定では、ビューの XslLink 要素は、XSLT ファイルとして main.xsl を指定します。この値を、手順 5. で追加した XSLT ファイルに付けた名前に変更します。
カスタム ビューでリソースを追加するには
ソリューション エクスプローラーで、プロジェクトを右クリックし、[追加] をポイントして、[SharePoint のマップされたフォルダー] をクリックします。
[SharePoint のマップされたフォルダーの追加] ダイアログ ボックスで、[{SharePointRoot}\CONFIG\Resources] フォルダーを選択し、[OK] をクリックします。
ソリューション エクスプローラーで新しい [Resources] フォルダーを右クリックし、[追加] をポイントし、[新しいアイテム] をクリックします。
[新しい項目の追加] ダイアログ ボックスで、[Visual C#] ノードあるいは [共通項目] ノードを展開し、[全般] を選択して、次に [リソース ファイル] を選択します。ファイルの名前を入力し、[追加] をクリックします。
[リソース エディター] で、リソースの名前と値を入力します。値は、リストが空のときに表示する文字列です。この例では、値 "Please add information to this list ASAP!" に対して "EmptyListResource" を、また "For information about the contents of this list see the" に対して "WikiResource" をリソース名としてそれぞれ指定します。
Schema.xml ファイルで、ビューの <ParameterBindings> セクションにパラメーター バインドを追加します。これにより、以前の手順で指定したリソースが追加されます。
これらのタグは <ParameterBinding Name=”EmptyListString” Location=”Resource(Resource1,EmptyListResource)” />と、<ParameterBinding Name=”TeamWiki” Location=”Resource(Resource1,WikiResource)” /> のような形式となります。この例では、"EmptyListString" と "TeamWiki" は、XSLT ファイルに実装できるパラメーター名、"Resource1" は、リソース ファイルから拡張子を削除した名前、"EmptyListResource" と "WikiResource" は .resx ファイルで指定したリソース名前です。
XSLT コードでリソースを実装するには
vwstyles.xsl で定義された既定の FreeForm と EmptyTemplate テンプレートをオーバーライドするには、XSLT ファイルに main.xsl ファイルをインポートします。
<?xml version="1.0" encoding="utf-8"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:msxsl="urn:schemas-microsoft-com:xslt" exclude-result-prefixes="msxsl" > <xsl:import href="/_layouts/xsl/main.xsl"/>
main.xsl をインポートすると、ファイルに、vwstyles.xsl と fldtypes.xsl もインポートされます。これらは両方とも既定で main.xsl にインポートされるためです。
以前に XslLink 要素値を変更して、Schema.xml ファイルにパラメーター バインドを追加したため、定義したリソース文字列は XSLT ファイルで使用できます。
以下のようにパラメーターを宣言します。
<xsl:param name="MyEmptyListString" /> <xsl:param name="TeamWiki" />
XSLT ファイルに、FreeForm テンプレートをコピーし、以下のように、[すべてのアイテム] ビューに、フッター セクションの特殊なレンダリングを定義するセクションを追加します。
<xsl:template name="Freeform"> <xsl:param name="AddNewText"/> <xsl:param name="ID"/> <xsl:variable name="Url"> <xsl:choose> <xsl:when test="List/@TemplateType='119'"> <xsl:value-of select="$HttpVDir"/>/_layouts/CreateWebPage.aspx?List=<xsl:value-of select="$List"/>&RootFolder=<xsl:value-of select="$XmlDefinition/List/@RootFolder"/> </xsl:when> <xsl:when test="$IsDocLib"> <xsl:value-of select="$HttpVDir"/>/_layouts/Upload.aspx?List=<xsl:value-of select="$List"/>&RootFolder=<xsl:value-of select="$XmlDefinition/List/@RootFolder"/> </xsl:when> <xsl:otherwise> <xsl:value-of select="$ENCODED_FORM_NEW"/> </xsl:otherwise> </xsl:choose> </xsl:variable> <xsl:variable name="HeroStyle"> <xsl:choose> <xsl:when test="Toolbar[@Type='Standard']">display:none</xsl:when> <xsl:otherwise></xsl:otherwise> </xsl:choose> </xsl:variable> <xsl:if test="$ListRight_AddListItems = '1' and (not($InlineEdit) or $IsDocLib)"> <table id="Hero-{$WPQ}" width="100%" cellpadding="0" cellspacing="0" border="0" style="{$HeroStyle}"> <tr><td colspan="2" class="ms-partline"> <img src="/_layouts/images/blank.gif" width="1" height="1" alt="" /> </td></tr> <tr><td class="ms-addnew" style="padding-bottom: 3px"> <span style="height:10px;width:10px;position:relative;display:inline-block;overflow:hidden;" class="s4-clust"> <img src="/_layouts/images/fgimg.png" alt="" style="left:-0px !important;top:-128px !important;position:absolute;" /></span> <xsl:text disable-output-escaping="yes" ddwrt:nbsp-preserve="yes">&nbsp;</xsl:text> <xsl:choose> <xsl:when test="List/@TemplateType = '115'"> <a class="ms-addnew" id="{$ID}-{$WPQ}" href="{$Url}" onclick="javascript:NewItem2(event, "{$Url}");javascript:return false;" target="_self"> <xsl:value-of select="$AddNewText" /> </a> </xsl:when> <!—Define a special footer section for the custom list definition, which has 10000 as template type.--> <xsl:when test="$XmlDefinition/List/@TemplateType ='10000'"> <a class="ms-addnew" id="{$ID}-{$WPQ}" href="{$Url}" onclick="javascript:NewItem2(event, "{$Url}");javascript:return false;" target="_self"> <xsl:value-of select="$AddNewText" /> </a> <p> <xsl:value-of select="$TeamWiki"/> <a href="{$RootSiteUrl}/TeamWiki">Team Wiki</a>. </p> </xsl:when> <xsl:otherwise> <a class="ms-addnew" id="{$ID}" href="{$Url}" onclick="javascript:NewItem2(event, "{$Url}");javascript:return false;" target="_self"> <xsl:value-of select="$AddNewText" /></a> </xsl:otherwise> </xsl:choose> </td></tr> <tr><td><img src="/_layouts/images/blank.gif" width="1" height="5" alt="" /></td></tr></table> <xsl:choose> <xsl:when test="Toolbar[@Type='Standard']"> <script type='text/javascript'> if (typeof(heroButtonWebPart<xsl:value-of select="$WPQ"/>) != "undefined") { <xsl:value-of select="concat(' var eleHero = document.getElementById("Hero-', $WPQ, '");')"/> if (eleHero != null) eleHero.style.display = ""; } </script> </xsl:when> <xsl:otherwise></xsl:otherwise> </xsl:choose> <xsl:if test="List/@TemplateType = '115'"> <script type='text/javascript'> if (typeof(DefaultNewButtonWebPart<xsl:value-of select="$WPQ"/>) != "undefined") { <xsl:value-of select="concat(' var eleLink = document.getElementById("', $ID, '-', $WPQ, '");')"/> if (eleLink != null) { DefaultNewButtonWebPart<xsl:value-of select="$WPQ"/>(eleLink); } } </script> </xsl:if> </xsl:if> </xsl:template>
例では、リスト定義の TemplateType (この場合は 10000) を取得するために XmlDefinition パラメーターを使用して、特殊なレンダリングをビューのフッター セクションに適用します。さらに、例では "WikiResource" 文字列を返すために "TeamWiki" パラメーターを、そしてリストの親 Web サイトを含むサイト コレクションのルート Web サイトを返すためにグローバル "RootSiteUrl" パラメーターを使用します。この例では、ルート Web サイトに "TeamWiki" という名前の Wiki ライブラリがあると想定しています。
XSLT ファイルに、表示されるテキストを変更するために EmptyTemplate 定義をオーバーライドする、以下のコードを追加します。
<xsl:template name="EmptyTemplate"> <tr> <td class="ms-vb" colspan="99" style="color:red;font-weight:bold"> <xsl:value-of select="$MyEmptyListString"/> </td> </tr> </xsl:template> </xsl:stylesheet>
[ビルド] メニューで、[ソリューションのビルド] をクリックし、[ソリューションの展開] をクリックして、SharePoint Foundation サイトにカスタム リストを展開します。
注意
プロジェクトを展開したとき、Visual Studio 2010 は、指定したマップ済みフォルダー (%ProgramFiles%\Common Files\Microsoft Shared\web server extensions\14\CONFIG\Resources) に、作成したリソース ファイルを挿入します。新しい Web アプリケーションを作成したとき、SharePoint Foundation は、Web アプリケーションのために作成される \inetpub\...\App_GlobalResources フォルダーに, .resx ファイルをコピーします。このフォルダーは、リソースを有効にするためにファイルが置かれる必要がある場所です。しかし、プロジェクトを展開したときに既に存在するファイルを Web アプリケーションで有効にするためには、Web アプリケーションの App_GlobalResources フォルダーに手動でファイルをコピーする必要があります。