やっと起きたエンジニアのメモ

ruby, js, 興味の赴くままに

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を見たときに気づいたんだな。全然(ぜんっぜん)構成が違うじゃないのって、、゚(゚´Д`゚)゚ で、今度は半日無駄にしたんだわ。。

はい。ここまでが前置き(愚痴)。結局一から作り直したほうが早いって結論ね。

忘れんうちにメモっておく。

やりたいこと

  1. フィールドを追加
  2. 各行にチェックボックスを表示
  3. ヘッダーに全て選択用のチェックボックスを表示
  4. ほかのフィールドの状態によってチェックボックスを表示/非表示する

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 って情報が少なくて困るよね(´;ω;`)