2008年1月24日 (木)

これで一連の記事の最後です。まずは前回の続きからです。

条件によってアイテムを表示する

データビューに変換するとブラウザからのビューのカスタマイズは行えなくなります。表示列の追加、並び替え、フィルタ、グループ化などは XSLT を編集する必要がでてきます。今回はシンプルに指定した日時になったらアイテムを表示するよう編集してみます。

あらかじめテスト用のドキュメントライブラリに "PublishDate" という名前のカスタム列を追加しておきます。この列の種類は「日付と時刻」、表示は「日付」のみとします。AllItems.aspx を上記手順で紹介したようにデータビューに変更しておきます。

AllItems.aspx 内の以下の部分が、各アイテム行の表示を行っている部分です。

<xsl:template name="dvt_1.rowview">

<tr>

</tr> 
</xsl:template>

この中の<tr>タグ内に列ごとの表示情報が書かれています。では、せっかくなのでこのタグの中を調査してみましょう。たとえば "<!-- DocIcon-->" タグ以下に "ドキュメントの種類" の列が記述されています。ここでは、次のようなコードがあります。

<xsl:when test="@FSObjType='1'">
      <xsl:choose>
       <xsl:when test="ddwrt:GetVar('RecursiveView')='1'"><IMG BORDER="0" alt="フォルダ: {@FileLeafRef}" SRC="/_layouts/images/folder.gif" /></xsl:when>
       <xsl:otherwise>
        <xsl:variable name="SetVarIDA3UIMC"><xsl:value-of select="$PagePath" />?RootFolder=<xsl:value-of select="@FileRef" />&amp;FolderCTID=<xsl:value-of select="@ContentTypeId" /></xsl:variable>
        <xsl:value-of select="ddwrt:SetVar('UnencodedFilterLink', string($SetVarIDA3UIMC))" />
        <A TABINDEX="-1" HREF="{ddwrt:GetVar('UnencodedFilterLink')}" onclick="javascript:EnterFolder('{ddwrt:GetVar('UnencodedFilterLink')}');javascript:return false;"><IMG BORDER="0" alt="フォルダ: {@FileLeafRef}" title="Folder: {@FileLeafRef}" SRC="/_layouts/images/folder.gif" /></A>
       </xsl:otherwise>
      </xsl:choose>
     </xsl:when>

" <xsl:when test="@FSObjType='1'"> " の "@FSObjType='1' はフォルダであることをチェックしています。ということで、ここはフォルダ表記に関する部分です。また、直後に次のコードが続いています。


<xsl:otherwise>
<A TABINDEX="-1" HREF="{@FileRef}" onclick="return DispEx(this,event,'','','','','{ddwrt:ListProperty(&quot;DefaultItemOpen&quot;)}','{ddwrt:MapToControl(&quot;&quot;, string())}','{@HTML_x0020_File_x0020_Type}','',
'{ddwrt:GetUserID('CheckoutUser')}','{$Userid}',
'{ddwrt:ListProperty(&quot;ForceCheckout&quot;)}',
'{$FieldIDAKZJMC}','{ddwrt:CurrentRights()}')">
      <xsl:choose>
       <xsl:when test="@CheckoutUser=''"><IMG BORDER="0" ALT="{@FileLeafRef}" title="{@FileLeafRef}" SRC="/_layouts/images/{ddwrt:MapToIcon(string(@HTML_x0020_File_x0020_Type),string(@File_x0020_Type))}" /></xsl:when>
       <xsl:otherwise><IMG BORDER="0" ALT="{@FileLeafRef}
チェックアウト先: {@CheckoutUser}" title="{@FileLeafRef}
チェックアウト先: {@CheckoutUser}" SRC="/_layouts/images/{ddwrt:MapToIcon(string(@HTML_x0020_File_x0020_Type),string(@File_x0020_Type))}" /><img src="/_layouts/images/checkoutoverlay.gif" class="ms-vb-icon-overlay" alt="&lt;xsl:value-of select=&quot;@FileLeafRef&quot; /&gt;
チェックアウト先: ddwrt:UserLookup(string(@DocIcon), &quot;Title&quot;)&lt;" title="&lt;xsl:value-of select=&quot;@FileLeafRef&quot; /&gt;
チェックアウト先: ddwrt:UserLookup(string(@DocIcon), &quot;Title&quot;)" /></xsl:otherwise></xsl:choose>
      </A></xsl:otherwise>

先頭に "<xsl:otherwise>" とありますから、フォルダ以外の場合(ここではファイルとなる)に適用される部分です。このうち次の

<xsl:when test="@CheckoutUser=''"><IMG BORDER="0" ALT="{@FileLeafRef}" title="{@FileLeafRef}" SRC="/_layouts/images/{ddwrt:MapToIcon(string(@HTML_x0020_File_x0020_Type),string(@File_x0020_Type))}" /></xsl:when>
/p>

の部分は、ファイルがチェックアウトされていない場合は、チェックアウトされていない方のアイコンファイルを表示するよう "<IMG>" タグが記述されています。ここでも ddwrt:MapToIcon拡張関数が使用されています。拡張子に応じて動的に表示するアイコンを取得しています。

では本筋に話を戻しましょう。つまり今回の場合、条件によってこの<tr>タグを非表示にできればよいわけです。そこで、<tr>( 開始タグ) の直前に次の条件式を追加します。

<xsl:if test="number(translate(ddwrt:FormatDate(string(@PublishDate), number(1041), 1),'/',''))&lt;number(translate(ddwrt:FormatDate(string(ddwrt:Today()),number(1041),1),'/',''))">

そして、</tr>(終了タグ) の後に次の終了タグを追加します。

</xsl:if>

完成したソースの概略は次の通りです。

<xsl:template name="dvt_1.rowview">

<xsl:if test="number(translate(ddwrt:FormatDate(string(@PublishDate), number(1041), 1),'/',''))&lt;number(translate(ddwrt:FormatDate(string(ddwrt:Today()),number(1041),1),'/',''))">
<tr>

</tr>
</xsl:if>
</xsl:template>

以上で指定したアイテムが希望した日時に表示されるようになります。なお、希望した日時に満たない期間に再度アイテムを編集する必要がある場合は、エクスプローラビューを利用するなど編集専用にビューを作る必要があります。

データビューのソースを眺めてみると、まだ他にも さまざまな ddwrt の拡張関数は存在します。ですが、今回取り上げる内容はここまでとしたいと思います。このようにXSLT を編集するといろいろとカスタマイズが可能であることを、ご理解いただけましたでしょうか。

データビューを利用するにあたっての注意事項

最後にデータビューを利用するにあたっての注意事項をご紹介しておきます。

  • データビューに変換する前に、オリジナルのファイルをバックアップしておく

これは単純にコピーを作成しておくだけでよいと思います。オリジナルのXSLデータビューに変換すると、私の環境ではもとのリストビューに戻せなくなってしまうトラブルが発生しました。また XST を編集しているうちに動作が不安定になることもありました。こうした経験から、いつでも元のファイルに戻せるよう必ず、バックアップを取っておくようにした方がよいと思います。

  • アイテムのドロップダウンメニューに「権限の管理」メニューが表示されなくなる

データビューに変換するとドロップダウンメニューから「権限の管理」メニューが表示されなくなります(解決方法があるのかは調査中です)。とはいえ、ドロップダウンメニューからは表示されなくはなりますが、ドロップダウンメニューにある[プロパティの表示]をクリックすれば、コマンドバーには「権限の管理」メニューは表示されますので、運用ルールを決めることで対応できるかと思います。

またデータビューに関して Tips が見つかったら、このブログを通じてご紹介することにします。