2008年2月

2008年2月 4日 (月)

前回の続きです。今回は、コンテンツクエリ Web パーツが既定では取得できない"更新日時"と"本文"の列情報を取得します。

[今回の目標画面]

Cqwpprecomplete3

列には通常私たちが目にする表示名とは別に内部名があります。また、列の情報の種類についても内部で使用される名前があります。今回使用するのは最初から用意されている列であるため内部名は決まっています。たとえば、「お知らせ」リストの主な列は次のようになっています。

Title (表示名)Internal Name (内部名)DisplayTypeNameType
ID ID カウンタ Counter
タイトル Title 1行テキスト Text
更新日時 Modified 日付と時刻 DateTime
作成日時 Created 日付と時刻 DateTime
作成者 Author ユーザーまたはグループ User
更新者 Editor ユーザーまたはグループ User
本文 Body 複数行テキスト Note
有効期限 Expires 日付と時刻 DateTime

しかし、ユーザーが作成した列の場合は、特に日本語表記で名前を指定していると内部名はつど調べる必要があります。その確認方法はいろいろとあるのですが、また別の機会にご紹介したいと思います。

更新日時と本文列を取得する

作業概要

  1. Web パーツをエクスポートする
  2. Web パーツの情報 (*.webpart) を編集する
  3. ItemStyle.xsl を修正し、カスタムのスタイルを作成する
  4. 2.で編集した Web パーツ情報 (*.webpart) をインポートする
  5. インポートした Web パーツを配置し、スタイルを3. で作成したカスタムスタイルに変更する

新たに列情報を取得するにはWeb パーツのデータ(*.webpart) を一度エクスポートし、XMLデータを修正します。

Web パーツのエクスポート

  1. コンテンツ クエリ Web パーツの右上に表示される▼をクリックし、[エクスポート] をクリックします。
    Webpartexport
  2. 任意の名前でファイルをローカルに保存します。今回は"mycqwp.webpart" という名前で保存しておきます(※ メモ帳を使用している場合、既定では エンコードは UTF-8 になっているはずですが、念のためUTF-8 になっていることは確認しておいてください)。

Web パーツ情報の編集

次にエクスポートしたXMLファイルを編集します。次のタグを見つけます。

<property name="CommonViewFields" type="string" />

次のように変更し、編集日時列と本文列を取得できるようにします。

<property name="CommonViewFields" type="string" >Modified,DateTime;Body,Note</property>

タグ内には取得したい列名を "内部列名", "種類" の順に記述します。複数の列を取得する場合はセミコロンを使用します。

ItemStyel.xsl を編集する

ItemStyel.xsl を編集し、カスタムのスタイルを作成します。

  1. SharePoint Designer 2007 を起動し、コンテンツ クエリ Web パーツを配置しているサイトを開きます。
  2. [フォルダ一覧] から [Style Library(スタイル ライブラリ)] - [XSL Style Sheets] の順に展開し、ItemStyel.xsl をダブルクリックします。
  3. ItemStyle.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="FixedImageSize" match="Row[@Style='FixedImageSize']" mode="itemstyle">から対応する</xsl:template> までをコピーします。
  6. 一番最後のタグである</xsl:stylesheet>の直前に 4. の内容を貼り付けます。
  7. 貼り付けた内容の "<xsl:template name="FixedImageSize" match="Row[@Style='FixedImageSize']" mode="itemstyle">" の部分を次のように変更します。

    <xsl:template name="すべてのお知らせ用スタイル" match="Row[@Style='すべてのお知らせ用スタイル']" mode="itemstyle">
  8. "<div class="description">" の前に次のタグを追加します。

    <span style="color:black">[更新日時: <xsl:value-of select="ddwrt:FormatDate(string(@Modified),number('1041'),7)"/>
    ]</span>

    <div class="description">
  9. "<xsl:value-of select="@Description" />" の部分を次のように変更します。

    <div class="description">
    <xsl:value-of select="@Body" />
    </div>
  10. 上書き保存します。「サイト定義ページの警告」ダイアログが表示されたら [はい] をクリックします。
  11. ファイルをマイナーバージョンでチェックインしておきます。
  12. SharePoint Designer 2007 を一旦終了しておきます(引き続き作業をする場合は開いたままでも構いません)。

Web パーツ情報をインポートする

編集した mycqwp.webpart をインポートします。

  1. IE を使用してコンテンツクエリWebパーツを追加したサイトを表示します。
  2. [サイトの操作]メニューから[ページの編集]をクリックします。
  3. "Web パーツの追加" をクリックします。
  4. Web パーツの追加画面右下に表示される "Web パーツギャラリーとオプションの詳細設定" リンクをクリックします。
    Webpartimport
  5. 画面右上の"Web パーツの追加" の下に表示される "参照"部分の▼をクリックし、[インポート]をクリックします。

    Webpartimport2

  6. 先ほど編集した "mycqwp.webpart" ファイルを指定し、アップロードします。

  7. アップロードした Web パーツをWeb パーツ領域に追加します。

コンテンツクエリ Web パーツのスタイル変更

コンテンツクエリ Web パーツに適用されているスタイルをカスタム定義のスタイルに変更します。

  1. 追加した Web パーツの[編集]メニューから[共有Webパーツの変更]をクリックします。

  2. コンテンツのクエリツールパーツ内の"プレゼンテーション" セクションを開き、アイテムのスタイルを"すべてのお知らせ用スタイル" に変更し適用します。

以上で、更新日時と本文のデータが取得できるようになったはずです。Webパーツ上にエラーが表示される場合は、*.webpart および XSLT に記述ミスがあるはずですので見直してください。また、前回までに追加していた Web パーツは使用しませんので、削除しておいて構いません。

本文が取得できるようにはなりましたが、本文に HTML タグが表示されたままになっています。次回は、これを取り除きます。

2008年2月 1日 (金)

※ 2009.2.6 追加

IFilterに関する最新情報は別の記事として投稿し直しました。最新情報は以下の投稿記事をご参照ください。
http://shanqiai.weblogs.jp/sharepoint_technical_note/2009/02/pdf-ifilter-a1b.html

*******************************

他の方もブログに IFilter 6.0 のインストール方法など書かれているようですが、受講者の方からのご質問が多いのでこちらのブログにも、以前自分なりに調べた内容を投稿しておきます。(通常は一日1投稿にしているんですが、今日はイレギュラーに2本目の投稿です。)

作業の概要

  1. PDF 用の IFilter をインストール
  2. アイコンの登録
・ダウンロード : Adobe PDF IFilter 6.0
・アイコン ファイル: ICPDF.gif(Steven Van さんのブログからダウンロードしたものを共有しておきます)

作業内容

  1. IIS Admin サービスを停止する
    [スタート] メニュー- [ファイル名を指定して実行] をクリックし、"services.msc"と入力し[OK] をクリックする。[サービスの管理]コンソールが表示されるので "IIS Admin Service" を停止する
  2. サーバー上でAdobe PDF IFilter 6.0 のセットアッププログラムを実行する
  3. アイコンファイル " ICPDF.GIF" を次のフォルダに格納する
    "C:\Program Files\Common Files\Microsoft Shared\Web Server Extensions\12\Template\Images"
  4. 次のフォルダ内にある "DOCICON.XML" をメモ帳などで開く
    C:\Program Files\Common Files\Microsoft Shared\Web server extensions\12\Template\Xml\DOCICON.XML
  5. 一連の<Mapping Key>タグに下記の、拡張子 *.pdf 用のエントリを追加する
    <Mapping Key="pdf" Value="icpdf.gif"/>
  6. iisreset を実行してIISを再起動する
  7. インデックスのリストに pdf ファイルの種類を追加する
    [共有サービス管理] ページの [検索]セクションにある[検索の設定]をクリックし、[クロール設定セクション]の[ファイルの種類]をクリックする。 新しいファイルの種類として拡張子"pdf"を追加する。
  8. フルクロールを実行する

なお上記 3,4,5 はアイコン表示を登録する設定です。


参考: Steven Van de Craen's Blog (英語)

続きを読む »

前回の続きです。

今回は、前回作成した「すべてのお知らせ」コンテンツクエリ 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 パーツに表示されるようになりますので、覚えておいてください。

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