2008年2月 1日 (金)

コンテンツ クエリ Web パーツ (2.今日の日付を表示する)

前回の続きです。

今回は、前回作成した「すべてのお知らせ」コンテンツクエリ Web パーツ上部に今日の日付を表示するようカスタマイズします。

[今回の目標画面]

Cqwpprecomplete2

実はこれを実装しようと思ったきっかけは「コンテンツ クエリ Web パーツに今日の日付を表示したい」という投稿が、以前MSDNフォーラムにあったことです。そこでのやり取りはカスタムフィールドを作って対応するという話で決着していたようです。http://forums.microsoft.com/MSDN-JA/ShowPost.aspx?PostID=2467044&SiteID=7

が、ふと以前データビューの説明時にご紹介した 「ddwrt:Today()」 関数が利用できないかと思い試してみましたが問題なく利用できました。ということで、XSTL 内に数行のコードを追加するだけで実現できてしまいます。データビュー以外でも SharePoint 上の XSLT 内で宣言さえしておけば使用できるため、意外と使える場面は多いかも知れません。

以下に手順を記述しますが、SharePoint Designer 2007(SPD) を使用しているところがポイントです。

もともと コンテンツ クエリ Web パーツの表示部分はXSLT が使用されています。使われるXSLT のファイルは どこのサイトからも利用できるよう SharePoint ハイブ(%Program Files%\Common Files\Microsoft Shared\web server extensions\12) 内の\TEMPLATE\FEATURES\PublishingResources で共有されています。ですから、ここにあるファイルを直接編集するとすべてのサイトに影響します。

しかし、SPD を使用してこうしたSharePoint の共有ファイルを編集すると、直接オリジナルのデータは編集されず変更したファイルデータがコンテンツDBに格納されるようになっています。つまり、カスタマイズしたサイトにしか影響しません。

コンテンツ DB に格納されるようになったファイルには下図にあるように "i" のマークがつくようになります。なお、元のSharePoint ハイブ上のファイルを参照するように設定を戻す場合はファイルを右クリックして[サイト定義にリセット] をクリックします。

[図. コンテンツ DB に格納されるようになったファイル]
Unghosted

コンテンツクエリ Web パーツに読み込まれる XSL スタイルシート(XSLT)

  • Header.xsl
  • ItemStyle.xsl
  • ContentQueryMain.xsl

ということで、今回は SPD を使用して編集し、コンテンツクエリ Web パーツのヘッダー部分に今日の日付を追加してみます。

手順

  1. SharePoint Designer 2007 を使用して、前回の手順でコンテンツ クエリ Web パーツを追加したサイトを開きます。
  2. 「フォルダ一覧」内の [Style Library] - [XSL Style Sheet] フォルダ内の "ContentQueryMain.xsl" を右クリックしチェックアウトします。

    Contentquerymaincheckout

  3. ContentQueryMain.xsl をダブルクリックします。
  4. XSLT 内でddwrt 関数を利用できるようにするため、先頭の xsl:stylesheet 要素の exclude-result-prefixes 属性に "ddwrt" を追加します。 また同要素内にddwrt で使用する名前空間を追加します。結果は以下の通りです(赤字の部分を追加しています)。

    <xsl:stylesheet
        version="1.0"
        exclude-result-prefixes="x xsl cmswrt cbq ddwrt"
       ... (中略)
       xmlns:ddwrt="http://schemas.microsoft.com/WebParts/v2/
    DataView/runtime">
  5. 続いて 「<xsl:template name="OuterTemplate.Body"> 」 開始タグからこれに対応する終了タグ「</xsl:template>」までの部分を探し出します。このタグ内の「<xsl:for-each select="$Rows">」の直前に、日付を表示する関数(ddwrt:TodayISO()) を記述します(赤字の部分を追加しています)。

    <xsl:variable name="EndColumn" select="string('&lt;/td &gt;')" />
     
    <span style=" font-weight:bold">今日の日付 : <xsl:value-of select="ddwrt:FormatDate(string(ddwrt:TodayIso()),number('1041'),3)"/>
    </span>


    <xsl:for-each select="$Rows">
  6. 上書き保存します。次のような警告ダイアログが表示されますが、このダイアログがいわんとすることは「コンテンツDBに格納することになりますよ」ということです。よってここでは[はい]をクリックします。

    Warningsitedefinition

  7. [フォルダ一覧]から ContentQueryMain.xsl を右クリックし、チェックインしマイナーバージョンもしくはメジャーバージョンを発行します(なお、バージョン管理については、「ひと目でわかる~」に詳しく記載しています)。
  8. SharePoint Designer 2007 はもう使用しませんので、終了しておきます。

以上で設定は完了です。Web ブラウザでコンテンツクエリWebパーツを追加したページを表示してみると、日付が表示されるようになったはずです。なお、ContentQueryMain.xsl に追加した変更は同一サイト内のすべての コンテンツ Web パーツに表示されるようになりますので、覚えておいてください。

次回は、既定では表示されないアイテムの列(更新日時と本文)を取得するようカスタマイズします。

トラックバック

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

コンテンツ クエリ Web パーツ (2.今日の日付を表示する)を参照しているブログ:

コメント

こんばんは、SharePointのカスタマイズをする上で参考にさせていただいております。
大変わかりやすく、画像入りで助かっておりますが、この度本記事の作業を実施したところ、一般ユーザ(サイトのメンバ)では日付の表示がされませんでした。
SharePoint2007で編集にはDesignerを使用しておりますが、何か設定が漏れてしまったのでしょうか。
お分かりになりましたらお教えいただけますでしょうか。
宜しくお願い致します。

かきさん、コメントをありがとうございます。一般ユーザーに表示されないということなので、一番疑わしいのは7番目の手順にあるContentQueryMain.xsl ファイルのバージョン管理ですね。既定の設定では、チェックインした後にメジャーバージョン発行をしないと一般ユーザーからはこのファイルが読み込めない状態になってしまいます。まずは、その点をご確認くださいませhappy01

こんにちは、お早いお返事ありがとうございました。
さっそく確認したところ…ドンピシャでした><;
初歩的な事であったにも関わらず手をお貸し下さってありがとうございました!
おかげで、ちゃんと動作の確認をすることができました。

大変恐縮ではありますが、もう一点お知恵をお貸しいただけませんでしょうか。
現在「すべてのお知らせ」といった形で更新日時が新しいものは全て箇条書きにリストアップして表示させているのですが、本ページにおける「営業部」「営業1課」といった区別もなしに一緒くたにしてしまうことは可能でしょうか。

何卒、宜しくお願い致します。

かきさん、やはりバージョン管理だったようですね。結構、設定しわすれるところなので、"もしや"と思ったのです。それにしても、解決してよかったです。

さて、ご質問の区分なく表示する件ですが、今回の手順ではコンテンツクエリWebパーツのプロパティ設定で、サイトごとにグループ化表示する設定にしています。手順は、下記URL内の5番目の手順で、プレゼンテーション項目の設定をしているところです。http://shanqiai.weblogs.jp/sharepoint_technical_note/2008/01/web-1-fb38.html

もし、こうした設定が不要であれば、グループ化設定をしないようにします。その上で、更新日時で並び変える設定飲みしておけばいいと思います。試してみてください。