2008年1月23日 (水)

SharePoint Designer 2007 の「データビュー」 の利用 (3.アイコンの表示をカスタマイズする)

データビュー("DataView"WebPart") 内で拡張関数が利用できることは、前回ご紹介しました。今回はその他の関数をいくつかご紹介します。

  • ddwrt:Today() …現在の日付を返す
  • ddwrt:TodayIso()…現在の時刻をISO形式(yyyy-MM-ddThh:mm:ssZ)で返す
  • ddwrt:IfNew(日付)…指定した日付から2日(既定)以内の場合trueを返す。日付はISO形式である必要がある
  • ddwrt:Random(最小値,最大値) …最小値から最大値の範囲内でランダムな値を生成
  • ddwrt:FormatDateTime(日付,ロケールID、書式) … 指定した書式で日付を取得する(例. yyyy年MM月dd日)
  • ddwrt:IfHasRights(permissionMask)…現在のユーザーがpermissionMaskに指定されている権限または権限の組み合わせを持つ場合はtrueを返す

ddwrt:IfHasRights(permissionMask) に指定する値はSPBasePermissions列挙体です。この列挙体について説明するURLはあるのですが、肝心の値が掲載されていません。全部は確認できていませんが、どうも以前のWSS 2.0 のころの使用されていた SPRights 列挙体の方の情報とだいたい同じであるようですので、両方を参考にするとよいと思います。(※ Tatsuki Yamamoto さんからの情報を頂きましたので、訂正しました。) SPBasePermissions 列挙体は以前は SPRights 列挙体でした。メンバー値など一部変更されているようですので、以下に値を記述しておきます。

メンバー説明
AddAndCustomizePages 262144 HTML ページまたは Web パーツ ページを追加、変更、または削除し、Windows SharePoint Services 互換エディタを使用して Web サイトを編集します。
AddDelPrivateWebParts 268435456 Web パーツ ページ上で個人用 Web パーツを追加または削除します。
AddListItems 2 リストにアイテムを追加し、ドキュメント ライブラリにドキュメントを追加して、Web ディスカッション コメントを追加します。
ApplyStyleSheets 1048576 Web サイトにスタイル シート (.css ファイル) を適用します。
ApplyThemeAndBorder 524288 Web サイト全体にテーマまたは枠線を適用します。
ApproveItems 16 リスト アイテムまたはドキュメントのマイナー バージョンを承認します。
BrowseDirectories 67108864

Microsoft Office SharePoint Designer 2007 および WebDAV インターフェイスを使用して、Web サイト内のファイルおよびフォルダを列挙します。
BrowseUserInfo 134217728 Web サイトのユーザーに関する情報を表示します。
CancelCheckout 256 別のユーザーに対してチェックアウトされたドキュメントを破棄またはチェックインします。
CreateAlerts 549755813888 電子メール通知を作成します。
CreateGroups 16777216 サイト コレクション全体で使用できるユーザーのグループを作成します。
CreateSSCSite 4194304 Self-Service Site Creation を使用して Web サイトを作成します。
DeleteListItems 8 リストからのアイテムの削除、ドキュメント ライブラリからのドキュメントの削除、およびドキュメント内の Web ディスカッション コメントの削除を行います。
DeleteVersions 128 リスト アイテムまたはドキュメントの古いバージョンを削除します。
EditListItems 4 リスト内のアイテム、ドキュメント ライブラリ内のドキュメント、およびドキュメント内の Web ディスカッション コメントの編集、およびドキュメント ライブラリ内の Web パーツ ページのカスタマイズ。
EditMyUserInfo 1099511627776 ユーザーに対して、各自の情報の変更 (画像の追加など) を許可します。
EmptyMask 0 Web サイト上でのアクセス許可は持っていません。ユーザー インターフェイスによって使用することはできません。
EnumeratePermissions 4611686018427387904 Web サイト、リスト、フォルダ、ドキュメント、またはリスト アイテム上でのアクセス許可を列挙します。
FullMask 9223372036854775807 Web サイト上ですべてのアクセス許可を持っています。ユーザー インターフェイスによって使用することはできません。
ManageAlerts 274877906944 Web サイトのすべてのユーザーに対する通知を管理します。
ManageLists 2048 リストを作成および削除し、リスト内の列を追加または削除して、リストのパブリック ビューを追加または削除します。
ManagePermissions 33554432 Web サイト上でのアクセス許可レベルを作成および変更し、ユーザーおよびグループにアクセス許可を割り当てます。
ManagePersonalViews 512 リストの個人用ビューを作成、変更、および削除します。
ManageSubwebs 8388608 チーム サイト、会議ワークスペースのサイト、ドキュメント ワークスペースのサイトなどのサブサイトを作成します。サイト コレクションを対象範囲とするフィーチャーのプロパティをアクティブ化、非アクティブ化、または編集します。[サイト コレクションの機能] ページを参照し、サイト コレクションを対象範囲とするフィーチャーをユーザー インターフェイスを介してアクティブ化または非アクティブ化するには、サイト コレクションの管理者である必要があります。
ManageWeb 1073741824 Web サイトのすべての管理タスクを実行し、コンテンツを管理するための権限を付与します。
Open 65536 ユーザーに対して、Web サイト、リスト、またはフォルダを開いて、そのコンテナ内のアイテムにアクセスすることを許可します。
OpenItems 32 サーバー側のファイル ハンドラでドキュメントのソースを表示します。
UpdatePersonalWebParts 536870912 Web パーツを更新して、個人用設定情報を表示します。
UseClientIntegration 68719476736 クライアント アプリケーションを起動する機能を使用します。そうしなければ、ユーザーはドキュメントに対してローカルで作業を行い、変更内容をアップロードする必要があります。
UseRemoteAPIs 137438953472 SOAP、WebDAV、または Microsoft Office SharePoint Designer 2007 インターフェイスを使用して Web サイトにアクセスします。
ViewFormPages 4096 フォーム、ビュー、およびアプリケーション ページを表示し、リストを列挙します。
ViewListItems 1 リスト内のアイテム、ドキュメント ライブラリ内のドキュメントを表示し、Web ディスカッション コメントを表示します。
ViewPages 131072 Web サイトのページを表示します。
ViewUsageData 2097152 Web サイトのページを表示します。
ViewVersions 64 リスト アイテムまたはドキュメントの古いバージョンを表示します。

※ SPRighs 列挙体と SPBasePermissions 列挙体の違いは Yamamoto さんがこの記事のコメントに記載してくださっています

【SPRights列挙体】
http://msdn2.microsoft.com/ja-jp/library/microsoft.sharepoint.sprights.aspx
【SPBasePermissions列挙体】
http://msdn2.microsoft.com/ja-jp/library/microsoft.sharepoint.spbasepermissions.aspx

たとえば、ViewListItems 権限をもったユーザーかどうかを確認する場合は、値を '1' とします。また ViewListItems とAddListItemsの両方の権限を持っているかを確認する場合はそれぞれの値の合計値、つまり '3' (1+2) を指定します。

ちなみに、IfNew関数でチェックする日数の既定値は2日となっているのですが、これはSharePoint サイドで変更可能です(詳細は以前の記事を参照のこと:「新規アイテムを投稿したときに表示される "New!" のアイコンはどれくらいの期間表示されるのですか?」)

では、上記の関数の基本的な使い方を学習するために以下の例をとりあげます。

  • 今日の日付から1週間以内に作成されたアイテムに対してNew! アイコンを表示する
  • 条件によってアイテムを表示する

なお、2つ目の内容は次回の記事で説明します。

今日の日付から1週間以内に作成されたアイテムに対してNew! アイコンを表示する

※ 2008.2.2  Hachi さんからご指摘いただきまして、一部修正いたしました。Hachi さん、ご指摘をありがとうございました。

この例も実は、以前、受講者の方からご質問いただいたものです。SharePoint 以外のツールを使用していてこれから SharePoint に移行したいという方で、以前使用していたツールがこうした仕様であったため同じように表示できないか、ということでした。

ここでは拡張関数としてIfNew関数とToday関数 が登場します。

前回同様、テスト用の任意のドキュメントライブラリのAllItems.aspx を編集します。最初に、前回同様、ListViewWebParts 部分をXSLTデータビューに変換します。次に"New.gif" を検索すると前後含め、次のようなコードが見つかります。

<xsl:if test="ddwrt:IfNew(string(@Created))">
<IMG SRC="/_layouts/1041/images/new.gif" alt="新規" />
</xsl:if>

<xsl:if > は条件文を意味し、"test=" の部分が条件判定の式です。また"@" で始まるのは、列です。つまり、作成日時(@Created) が2日以内であれば、New.gif アイコンを表示するという式です。これを7日以内に作成されたアイテムに対して New! アイコンを表示するようにカスタマイズしようと思います。が、XSLT 内での日付計算は簡単ではないため、今回はライブラリに New! アイコンを表示する期限を保持する列を追加して利用したいと思います。

New! アイコン表示期間用の列の追加

以下の内容の列を追加します。

  • 列名 : "displayDuration"
    ※XSLT 内で利用しやすいように英語表記で列を作成しますが、列作成後に"Newアイコンの表示期日" といった日本語表記に変更しておくとよいです
  • この列の情報の種類: 日付と時刻
  • この列への情報の入力を必須にする: はい
  • 日付と時刻の形式 : 日付のみ
  • 既定値を計算値として、式に "=Today+7" と入力

以上の内容で列を作成すると、既定値として今日から7日後の日付が表示されるようになります。あとはこの列情報を利用して、7日間アイコンを表示するよう 以下のように記述します。

<xsl:if test="number(translate(substring-before(@displayDuration,'T'),'-',''))&lt;=number(translate(ddwrt:Today(),'/',''))">
<IMG SRC="/_layouts/1041/images/new.gif" alt="新規" />
</xsl:if>

以上で、7日以内のアイテムには New! のアイコンが表示されるようになります。

これを応用すれば、テーブル内に列を追加して特定の列の値に応じてアイコンを表示するようにことも可能です。たとえば、「お知らせ」リストに重要度を示す列を追加し、重要な場合はアイコンを表示する、といった具合です。

[図.データビューを用いたお知らせリスト]
Customannouncement

[追加したコード]
<xsl:if test="@_x91cd__x8981_=1">
<img src="/_layouts/images/urgent.gif" alt="重要" border="0"/>    
</xsl:if>   

<Tip : SharePoint Designer 2007 の入力支援機能>

条件を指定する場合には、XPath式を編集する入力支援機能を使用するようにすると便利です。
[図.入力支援機能]
Xpathbuilder

Xpathbuilder2

<Tip : 列情報を確認する>

[データソースの詳細] に現在列情報と現在格納されているアイテムの持つ値が表示されます(値ごとに右クリックするとXPath式のコピーメニューなどが表示されます)。[データソースの詳細]が表示されない場合は、ツールバーの[作業ウィンドウ]メニューから表示します。

[図.データソースの詳細]

Datasourcedetail

トラックバック

このページのトラックバックURL: http://bb.lekumo.jp/t/trackback/718613/34255784

SharePoint Designer 2007 の「データビュー」 の利用 (3.アイコンの表示をカスタマイズする)を参照しているブログ:

コメント

はじめまして
度々 mstep などで山崎さんの講義を受講させて頂いております。

SPBasePermissions 列挙体の値ですが、VSから覗くと見ることができました。
全て書くと長いので、SPRights 列挙体と違う列挙子だけ挙げます。

【値が違う列挙子】
SPRights では FullMask = -1
→ SPBasePermissions では FullMask = 9223372036854775807


【名前が違う列挙子】※値は同じ
(SPRights列挙体 → SPBasePermissions列挙体)
OpenWeb → Open
ManageRoles → ManagePermissions
CreatePersonalGroups → CreateGroups


【SPBasePermissions で追加された列挙子】
ApproveItems = 16
CreateAlerts = 549755813888
DeleteVersions = 128
EditMyUserInfo = 1099511627776
EnumeratePermissions = 4611686018427387904
ManageAlerts = 274877906944
OpenItems = 32
UseClientIntegration = 68719476736
UseRemoteAPIs = 137438953472
ViewFormPages = 4096
ViewVersions = 64

微妙な違いなのでハマりそうですね。

Yamamotoさん
コメントをありがとうございます!
私が、ついさぼって確認していなかった SPBasePermissions を確認してくださったんですね。こういった情報を頂けると、とても助かります。ありがとうございました。せっかく教えていただいたので、後ほど投稿内容を内容を元に修正しておきます。また、気づいたことなどありましたら、コメントをよろしくお願いいたします。

はじめまして、こんにちは。
山崎さんのmstepのセミナー受講経験ありのHachiと申します
(他にも貴社のOさんやMさんのMOSS関連セミナー受講しました)。

>以上で、7日以内のアイテムには New! のアイコンが表示されるようになります。

とありますが、これは月をまたいだ場合に有効にならなくないですか?私も山崎さんが書いていらっしゃるようにXSLTを記述したのですが、昨日(2/1)になったら表示されなくなってしまいました。

気がつけば当たり前なのですが、気がつくまでに3時間くらい悩んでしまいました(笑)。

20080201から7引くと20080194になってしまうのですよね。
XSLTは詳しくないのですが、XSLTでは日付の計算ってできなかったりするのでしょうか。。。。

ユーザ様からは「過去1週間の文書を表示して」と依頼があったのですが、「無理そうです」って答えてしまいました(汗)。

もし、何か別の方法で実現可能な方法をご存知でしたら
アドバイスなどいただけるとうれしいです。
よろしくお願いいたします。

Hachi さん
コメントをありがとうございます!
ご指摘の通りです。非常にお粗末なミスで、恥ずかし限りです。大変失礼いたしました。
XPath 関数での日付の比較はできますが日付の計算そのものは、拡張関数を別に用意して利用するようにしないと困難です。が、スタイルシート内の拡張関数の利用は SharePoint 内では既定のセキュリティ設定上できませんので、解決策としてはライブラリに New!アイコンの表示期限を保持する列を追加して、その値と今日の日付を比較するのが一番簡単そうです。ということで、後ほど、上記投稿を訂正しておきます。
こういったご指摘はとても助かります。今後ともよろしくお願いいたします。

こんばんは、コメントをありがとうございます。

なーるほど!そういうやり方がありますね。
思いつきませんでした。ありがとうございます。

隠しフィールド、ちょっとしたカテゴリのソート用に使ったりしています。カテゴリ名の前に番号をつけるとかっこ悪いので、「カテゴリ」が●●だったら010番とか、IF文を書いたりしているのですが、
MOSSはIF文が7つまでしかネストできないってことで、7つ以上カテゴリがあるとソート番号、ふれないんですよね。。。
(もっといい方法があるのかもしれませんが・・・)

最近のコンテンツクエリWebパーツの記事も、とても勉強になります。ItemsStyle.xsl、今まで結構適当に(!)いじっていた感じだったのですが、こうやって情報がまとまっているととても助かります!感謝です。今後も楽しみにしています。happy01

Hachiさん、
隠しフィールドに集計値を使って、ソート用に使うということですね! なるほど、集計値ってそういった使い方もできるのですね。。。しかも7つまでしか、ネストできないのは知りませんでした(^^ゞ。こちらこそ参考になります。引き続きよろしくお願いいたします!