これで一連の記事の最後です。まずは前回の続きからです。
条件によってアイテムを表示する
データビューに変換するとブラウザからのビューのカスタマイズは行えなくなります。表示列の追加、並び替え、フィルタ、グループ化などは 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" />&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("DefaultItemOpen")}','{ddwrt:MapToControl("", string())}','{@HTML_x0020_File_x0020_Type}','',
'{ddwrt:GetUserID('CheckoutUser')}','{$Userid}',
'{ddwrt:ListProperty("ForceCheckout")}',
'{$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="<xsl:value-of select="@FileLeafRef" />
チェックアウト先: ddwrt:UserLookup(string(@DocIcon), "Title")<" title="<xsl:value-of select="@FileLeafRef" />
チェックアウト先: ddwrt:UserLookup(string(@DocIcon), "Title")" /></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),'/',''))<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),'/',''))<number(translate(ddwrt:FormatDate(string(ddwrt:Today()),number(1041),1),'/',''))">
<tr>
…
</tr>
</xsl:if>
</xsl:template>
以上で指定したアイテムが希望した日時に表示されるようになります。なお、希望した日時に満たない期間に再度アイテムを編集する必要がある場合は、エクスプローラビューを利用するなど編集専用にビューを作る必要があります。
データビューのソースを眺めてみると、まだ他にも さまざまな ddwrt の拡張関数は存在します。ですが、今回取り上げる内容はここまでとしたいと思います。このようにXSLT を編集するといろいろとカスタマイズが可能であることを、ご理解いただけましたでしょうか。
データビューを利用するにあたっての注意事項
最後にデータビューを利用するにあたっての注意事項をご紹介しておきます。
- データビューに変換する前に、オリジナルのファイルをバックアップしておく
これは単純にコピーを作成しておくだけでよいと思います。オリジナルのXSLデータビューに変換すると、私の環境ではもとのリストビューに戻せなくなってしまうトラブルが発生しました。また XST を編集しているうちに動作が不安定になることもありました。こうした経験から、いつでも元のファイルに戻せるよう必ず、バックアップを取っておくようにした方がよいと思います。
- アイテムのドロップダウンメニューに「権限の管理」メニューが表示されなくなる
データビューに変換するとドロップダウンメニューから「権限の管理」メニューが表示されなくなります(解決方法があるのかは調査中です)。とはいえ、ドロップダウンメニューからは表示されなくはなりますが、ドロップダウンメニューにある[プロパティの表示]をクリックすれば、コマンドバーには「権限の管理」メニューは表示されますので、運用ルールを決めることで対応できるかと思います。
またデータビューに関して Tips が見つかったら、このブログを通じてご紹介することにします。
>これは単純にコピーを作成しておくだけでよいと思います。オリジナルのXSLデータビューに変換すると、私の環境ではもとのリストビューに戻せなくなってしまうトラブルが発生しました。また XST を編集しているうちに動作が不安定になることもありました。こうした経験から、いつでも元のファイルに戻せるよう必ず、バックアップを取っておくようにした方がよいと思います。
こんにちは、Hachiです。
私の環境でもXSLTデータビューに変換したものは通常のビューには戻せなくなりました。また、Designerとブラウザでいろいろやっているうちに、動作が不安定になることもたびたびです。
(デフォルトビューのチェックが外れてしまったりとか)
XSLT変換したビューをバックアップとして、コピーして同じフォルダにおいておくと、ブラウザからもビューのプルダウンリスト(標準サイトテーマのオレンジのところ)に表示されてしまいますよね。。。
ビューに非表示とかできるのでしょうか?
(それとも単にローカルマシンにコピーを置いておけばよい?)
XSLTデータビューは、かなり便利ですよね。
でも、複数のデータソースをリンク(結合)させたデータビューから
1つのデータソースをはずしたい場合は、データビューを作り直さないといけないっぽいですね(面倒ー!)。
今後もDesignerの使い方やMOSSのカスタマイズ方法の紹介を楽しみにしています(MSDNフォーラムでの回答もとても役に立っています)。
Hachi さん、
XSTL 変換は便利なのですが、ご指摘の通りちょっとクセはありますね。ビューが元にもどせなくなる現象はそちらでもでましたか。。。すべてのマシンで再現性があるか分からなかったので、濁して書いておりました。それでも、いちからこういったXMLデータを書こうとすると大変ですから、その辺はご愛敬ですかね。それにこの機能のおかげで、具体的にXSTL周りを勉強できていい経験になっています。ちなみに、ファイルのバックアップですが、私は単純にローカルマシンにコピーを置くようにしています。意外とご存じない方もいらっしゃるので、ついでにここに書いておきますと、[ファイル]メニュー→[エクスポート]→[ファイル]でコピーをとっておけます。
最後に、こうした反応頂けると続ける励みになります(半分好きでやってはいますが、それなりに調査などは大変なので、、、)。今後ともよろしくお願いいたします。
こんばんは、コメントありがとうございます。
ビューのエクスポート&インポートを早速やってみましたが、
インポートしたビューはなぜかエラーになってしまいました。
(リストビューでもXSLT変換ビューでも、インポート後ブラウザで見ると「予期しないエラー」となってしまいます。
山崎さんの環境ではそんなことはなかったですか?
SPDに関する日本語書籍はまだまだ発売されないのでしょうかね。。。英語でもいいのですが、山崎さんのお勧め書籍はありますか?
Hachiさん、
私も、予期しないエラーはXSLT変換ビューが不安定になってくると出ました。やたらに編集作業を繰り返すとエラーとなることが多かったようです。で、不安定になると、正しいはずのファイルをインポートしてもだめだったりしました。結局、IIS を再起動してやると大丈夫だったのですが、あまりに不安定になった場合はリストを一から作成してみたりしました。結局バックアップしたデータもXSLTを一から書き直すのが大変なのでバックアップしておいたという感じです。
あと、SPDに関する書籍ですが、特におすすめというものはないですねぇ。SPDでなければ MOSS 上のファイルを直接取り出せないという点ではSPD必須なのですが、結局 MOSS のカスタマイズに必要なのはHTMLとかJavaScript, XMLなどのベーシックな知識だったりしますしね。でも、よさげなものを見つけたら紹介しますし、逆に教えてくださいませ。
こんにちは。wolfwoodと申します。
以前(1年前)は、【MOSS サイトにおけるユーザー管理】でお世話になりました。
現在、データビューを利用したいのですが、調べても分からない事があり、再度このサイトで質問させて頂いております。
◆現象
ドメイン\アカウント名を記述したSharePoint列(1行テキスト)に対して、データビューのフィルタ条件値[現在のユーザー]が機能しません。
実装したい機能は、以下の通りです。
「複数ユーザーをカンマ区切りで記述した1行テキスト列に対して、フィルタ条件式[次の値を含む]:条件値[現在のユーザー]に一致するアイテムを表示したい。」
◆質問
[現在のユーザー]は[UserID]というパラメタとしてクエリ実行されているようですが、UserIDにはどのような値が設定されているのでしょうか?
ご教授、宜しくお願い致します。
こんにちは。wolfwoodと申します。
先日、データビューのフィルタ条件に【現在のユーザー】を設定しても、意図した動作にならない件で質問させて頂きましたが、
サーバー変数[LOGON_USER]を利用したパラメタを追加する事で実装する事ができました。
ParameterBinding Name="LogonUser" Location="ServerVariable(LOGON_USER)"
お騒がせしまして申し訳ございませんでしたorz
また、何かありましたらご教授お願い致します。
wolfwood さん、お久しぶりです。コメントをありがとうございます。本業が忙しく、プログまで手が回っていない状況でお答えできずすみません。サーバー変数を使って解決されたのですね、参考になりました。こちらこそ、何かあれば情報共有頂けますと助かります。