SharePoint 2010 ハマッタメモ - View(ビュー) -
SharePoint 2007(Windows SharePoint Services 3.0)を使用したワークフローをSharePoint 2010で動作させることになった。
その原因は、いい感じに動いているようで動いていないって事がわかったから ヽ(´Д`;)ノアゥ...
で、最初にハマったSchema.xmlについてメモっておくことにする。
Schema.xmlはビュー、フォーム、ツール バー、特殊フィールドの定義をするファイルなんですね。
SharePointのインストールに含まれるFeatureのサブフォルダにあるSchema.xmlを参考にしながら作成していたみたい。
特にハマったのが「ビュー」で、結構な行数(ファイルは約10000行)に凹まされた。そんな状況で初めてのCAMLに悪戦苦闘したんだよね...orz
CAMLや各要素についてMSDNとかで調べることから始まった。
ちなみに、WSS 3.0とShare Point 2010の違いはこんな感じ。。
Windows SharePoint Services 3.0
<Views> ... <View BaseViewID="2" Type="HTML" WebPartZoneID="Main" DisplayName="$Resources:core,My_Tasks;" MobileView="True" MobileDefaultView="True" SetupPath="pages\viewpage.aspx" ImageUrl="/_layouts/images/issues.png" Url="MyItems.aspx" ReqAuth="TRUE"> <GroupByHeader> ... <GroupByFooter> ... <ViewHeader> ... <ViewBody> ... <ViewFooter> ... <PagedRowset> ... <PagedClientCallbackRowset> ... <PagedRecurrenceRowset> ... <RowLimit Paged="TRUE">100</RowLimit> <ViewEmpty> ... <Toolbar Type="Standard" /> <ViewFields> <FieldRef Name="LinkTitle" /> <FieldRef Name="Status" /> <FieldRef Name="Priority" /> <FieldRef Name="DueDate" /> <FieldRef Name="PercentComplete" /> </ViewFields> <Query> <Where> <Eq> <FieldRef Name="AssignedTo" /> <Value Type="Integer"> <UserID /> </Value> </Eq> </Where> <OrderBy> <FieldRef Name="Status" /> <FieldRef Name="Priority" /> </OrderBy> </Query> </View> ... </Views>
SharePoint 2010
<Views> ... <View BaseViewID="2" Type="HTML" WebPartZoneID="Main" DisplayName="$Resources:core,My_Tasks;" MobileView="True" MobileDefaultView="True" SetupPath="pages\viewpage.aspx" ImageUrl="/_layouts/images/issues.png" Url="MyItems.aspx" ReqAuth="TRUE"> <XslLink Default="TRUE">main.xsl</XslLink> <RowLimit Paged="TRUE">30</RowLimit> <Toolbar Type="Standard" /> <ViewFields> <FieldRef Name="LinkTitle"></FieldRef> <FieldRef Name="Status"></FieldRef> <FieldRef Name="Priority"></FieldRef> <FieldRef Name="DueDate"></FieldRef> <FieldRef Name="PercentComplete"></FieldRef> </ViewFields> <ParameterBindings> <ParameterBinding Name="NoAnnouncements" Location="Resource(wss,noXinviewofY_LIST)" /> <ParameterBinding Name="NoAnnouncementsHowTo" Location="Resource(wss,noXinviewofY_DEFAULT)" /> </ParameterBindings> <Query> <Where> <Eq> <FieldRef Name="AssignedTo"></FieldRef> <Value Type="Integer"> <UserID /> </Value> </Eq> </Where> <OrderBy> <FieldRef Name="Status"></FieldRef> <FieldRef Name="Priority"></FieldRef> </OrderBy> </Query> </View> ... </Views>
ぱっと見で違いはよくわかるね。でもね、、そもそも違いがあるってことを知らなくて、WSS 3.0の時に作成された内容を追ってしまった事が一番悲しかった。(/ω\) ここで丸一日無駄にした...
次にSharePointインストール時にFeatureのサブフォルダにあるSchema.xmlを見たときに気づいたんだな。全然(ぜんっぜん)構成が違うじゃないのって、、゚(゚´Д`゚)゚ で、今度は半日無駄にしたんだわ。。
はい。ここまでが前置き(愚痴)。結局一から作り直したほうが早いって結論ね。
忘れんうちにメモっておく。
やりたいこと
SharePoint 2010から標準でタスクの全選択できるようになっている。これって、WSS 3.0の時はなかった機能だったと思う。(だから作ったんだと思う)
WSS 3.0の時はやりたいこと(4つ)をSchema.xmlにすべて書いていたのと各ビュー分書いていたため1万行近くなっていた。
SharePoint 2010に合わせて作り直したら700行程度でできたっ(;゚Д゚) 実際に書く内容はそんな多くなかったね。
・フィールドを追加
・XSL でビューをカスタマイズ(CORE.js に定義されているメソッド使えうだけで実現できた)
サンプル
- フィールドに列を追加
<Field ID="{53101f38-dd2e-458c-b245-0c236cc13d1a}" Type="Computed" ReadOnly="TRUE" Name="CheckBox" DisplayName="$Resources:check;" HeaderImage="check.gif" ClassInfo="Icon" SourceID="http://schemas.microsoft.com/sharepoint/v3" StaticName="CheckBoxk"> </Field>
これは、ヘッダーにアイコンを使用した列を作成している。
TypeにComputedを指定しているのは、内容が別のフィールドに依存するため。
V4なのにV3をSourceIDに指定するところが気持ち悪い。。
- XSL を使用したビューのカスタマイズ
XSLを使用する上で重要なファイルはvwsytles.xsl と fldtypes.xsl になる。作成したXSLにmain.xslをインポートすることで、使用できるようにある。
TEMPLATE\LAYOUTS\1041は以下にCORE.js存在するので、ここで定義されているファンクションを使用することも可能。
// 定義 <?xml version="1.0" encoding="utf-8"?> <xsl:stylesheet xmlns:x="http://www.w3.org/2001/XMLSchema" version="1.0" exclude-result-prefixes="xsl msxsl ddwrt" xmlns:d="http://schemas.microsoft.com/sharepoint/dsp" xmlns:ddwrt="http://schemas.microsoft.com/WebParts/v2/DataView/runtime" xmlns:asp="http://schemas.microsoft.com/ASPNET/20" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:msxsl="urn:schemas-microsoft-com:xslt" xmlns:SharePoint="Microsoft.SharePoint.WebControls"> <xsl:import href="/_layouts/xsl/main.xsl" /> ... // <xsl:template match>を使用してfldtypes.xslに定義してあるテンプレートを使用してビューをカスタマイズする // ヘッダーに対して処理を書きたい場合は mode="header" と記述する。 <xsl:template match="FieldRef[@Name='CheckBox'] mode="header"> //ここに作成したフィールドに対する処理を書く </xsl:template>
分かってしまえば大したことないんだろうけど、、SharePoint って情報が少なくて困るよね(´;ω;`)