すっかり長くなってしまった一連の投稿も、今回でいよいよ最終回です。
最後に、これまでの内容の応用としてコンテンツ クエリ Web パーツを使い、サイトコレクション内のすべてのサイトから自分が担当になっいるタスクの一覧を取得するようにしてみたいと思います(これも、以前、ご質問をいただいたことがあるものです。)
[最終目標の画面]
※作業量割には、そこそこ素敵な感じの仕上がりになったように思います。
実現した機能
- タスクの進捗ごとにグループ化する
- タスクのタイトルの他に、優先順位と期日を表示するようにする
- 優先順位で並び替える
- 優先順位が高いものだけにアイコンを表示する
- 新しいアイテムは New! のアイコンを表示する
- 期日が過ぎている場合は、その旨を表示する
作業概要
- コンテンツ クエリ Web パーツを配置し、サイトコレクション全体から自分が担当になっているタスクを取得するための基本設定を行う
- コンテンツ クエリ Web パーツをエクスポートし、表示したい列を取得できるよう編集して、再びインポートする
- ItemStyle.xsl を編集し、見た目を整える
- コンテンツ クエリ Web パーツに新しいスタイルを適用する
コンテンツクエリWebパーツの基本設定
- グループ作業ポータルのトップページに、コンテンツ クエリ Web パーツを配置します。
- [コンテンツ クエリ Web パーツ] の [編集] - [共有 Web パーツの変更] をクリックします。
- [クエリ] セクションで [ソース] を "このサイトコレクションのすべてのサイトからアイテムを表示する"とします(今回はサイトコレクション全体を対象としてみます)。
- [リストの種類]から[このリストの種類のアイテムを表示する] を"タスク" に変更します。また[コンテンツ タイプ] で "リスト コンテンツ タイプ" を指定し、[このコンテンツタイプのアイテムを表示する] で "タスク" を指定します。
- [追加フィルタ] セクションで [次の条件でアイテムを表示する] にて "担当者" が "次の値に等しい" "[Me]" となるように指定します。これで自分のタスクのみをフィルタできるようになります。なお、画面に表示されているようにこの設定ではキャッシュが利用できないため、パフォーマンスが下がる可能性がありますので、実運用で利用される場合は実際にどの程度のパフォーマンスになるかを測定してみてから利用されるとよいと思います。さらに今回は終了したタスクは非表示にするようにしたいため、"かつ" を選択し、"タスクの状態" が "次の値に等しくない" "完了" となるように指定します。
- [プレゼンテーション] セクションでは、[アイテムのグループ化キー]として" タスクの状態" を指定します。[アイテムの並び替えキー]に[優先度]を指定します。
- すべてのタスクを表示するために [表示するアイテム数を制限する] チェックボックスをオフにします。
- [グループスタイル]を"帯状"、[アイテムのスタイル]を"箇条書きタイトル" に設定します。
- [外観]セクションの[タイトル]に"自分の仕事一覧" と入力します。
- [適用] をクリックします。
表示したい列の取得
- コンテンツ クエリ Web パーツの右上に表示される▼をクリックし、[エクスポート]をクリックします。
- 任意の名前でローカルに保存します。今回は "mytask.webpart" という名前で保存します。
- エクスポートしたファイルをメモ帳などで編集します。次のタグを見つけます。
<property name="CommonViewFields" type="string" /> - "期日" と "優先度" 列情報を取得できるように次の通り編集します。
<property name="CommonViewFields" type="string">DueDate,DateTime;Priority,Choice</property> - 上書き保存します。
- 再び IE に戻り、編集した Web パーツ情報をインポートするために、[Webパーツの追加]をクリックします。
- Webパーツの追加画面右下に表示される "Webパーツギャラリーとオプションの詳細設定" リンクをクリックします。
- 画面右上の "Web パーツの追加" の下に表示される"参照" 部分の▼をくりっし、[インポート] をクリックします。
- "mytask.webpart" ファイルを指定し、アップロードします。
- アップロードしたWebパーツをWebパーツ領域に追加します。
ItemStyle.xsl を編集する
- SharePoint Designer 2007 を起動し、コンテンツ クエリ Web パーツを配置しているサイトを開きます。
- [フォルダ一覧]内から[Style Library(スタイル ライブラリ)] - [XSL Style Sheets] の順に展開し、ItemStyle.xsl を右クリックしチェックアウトします。
- ItemStyle.xsl をダブルクリックします。
- XSLT 内で ddwrt 関数を使用できるよう宣言を次のように追加します。なお、これまでの一連の設定を行っている場合はこの操作は不要です。
<xsl:stylesheet
version="1.0"
exclude-result-prefixes="x xsl cmswrt cbq ddwrt"
... (中略)
xmlns:ddwrt="http://schemas.microsoft.com/WebParts/v2/
DataView/runtime"> - <xsl:template name="Bullets" match="Row[@Style='Bullets']" mode="itemstyle">
から対応する</xsl:template>までをコピーし、</xsl:stylesheet> の直前に貼り付けます。 - スタイルシートを次のように変更します(赤色部分が追加修正を行った部分です)。
<xsl:template name="すべてのタスク" match="Row[@Style='すべてのタスク']" mode="itemstyle">
<xsl:variable name="SafeLinkUrl">
<xsl:call-template name="OuterTemplate.GetSafeLink">
<xsl:with-param name="UrlColumnName" select="'LinkUrl'"/>
</xsl:call-template>
</xsl:variable>
<xsl:variable name="DisplayTitle">
<xsl:call-template name="OuterTemplate.GetTitle">
<xsl:with-param name="Title" select="@Title"/>
<xsl:with-param name="UrlColumnName" select="'LinkUrl'"/>
</xsl:call-template>
</xsl:variable>
<xsl:variable name="LinkTarget">
<xsl:if test="@OpenInNewWindow = 'True'" >_blank</xsl:if>
</xsl:variable>
<div id="linkitem" class="item link-item bullet">
<xsl:call-template name="OuterTemplate.CallPresenceStatusIconTemplate"/>
<span style="color:black;">
<xsl:value-of select="@Priority"/></span>
:
<a href="{$SafeLinkUrl}" target="{$LinkTarget}" title="{@LinkToolTip}">
<xsl:value-of select="$DisplayTitle"/>
</a>
<img src="/_layouts/images/blank.gif" width="5" style="visibility:hidden" alt=""/><xsl:if test="@Priority='(1) 高'">
<img src="/_layouts/images/ewr207s.gif" alt="優先度:高" border="0" height="11px"/>
</xsl:if>
<xsl:if test="ddwrt:IfNew(@Modified)">
<img src="/_layouts/1041/images/New.gif" alt="新しいアイテム"/></xsl:if>
<img src="/_layouts/images/blank.gif" width="13" style="visibility:hidden" alt=""/>
<span style="color:black">
[期日:<xsl:value-of select="ddwrt:FormatDate(string(@DueDate),number('1041'),7)"/>]
</span>
<xsl:if test="translate(substring-before(@DueDate,' '),'-','')<translate(substring-before(ddwrt:TodayIso(),'T'),'-','')">
<span style="color:red;"><img src="/_layouts/images/blank.gif" width="5" style="visibility:hidden" alt=""/>
※期日を過ぎています!</span>
</xsl:if>
</div>
</xsl:template> - 上書き保存し、メジャーバージョンとして発行します(SharePoint Desigenr 2007 を終了しても構いませんが、記述ミスなどがある場合にすぐに修正できるよういったんは最小化しておいた方が良いでしょう)。
コンテンツ クエリ Web パーツに新しいスタイルを適用する
- IE に戻ります。コンテンツ クエリWeb パーツの[編集] メニューから[共有Webパーツの変更] をクリックします。
- コンテンツのクエリツールパーツ内の"プレゼンテーション" セクションを開き、アイテムのスタイルを "すべてのタスク" に変更し 適用します。
- 表示に問題がなければ発行します。エラーが表示される場合は、ItemStyle.xsl の構文を見直してください。
以上で完了です!
と、なんとなく実務で利用できそうな感じ完成しました。トップページを見ると常に自分の仕事が追いかけてくるようになります(^^ゞ。
思いのほか長い連続投稿になってしまいましたが、参考になりましたでしょうか。
他にもいろいろとカスタマイズしたいというニーズがあるかと思いますが、調査中のものもたくさんありますので、また追々ご紹介していきたいと思います。
なお、今日まである程度まとまった情報を提供できるようハイペースでの投稿を続けてきましたが、本日からペースを少し落とし2日~3日間隔で投稿したいと思います。なるべくコンスタントにブログは続けたいのですが、なによりWindows Server 2008 も出てきますし、VS2008 を含む開発系の勉強もしなくてはならず、山積みなものでして。。。よろしくお願いいたします。
いつも拝見させて頂いております。onsatuです。
今回は質、量ともに大変素晴らしい内容と思います。
私もコンテンツクエリWebパーツを使用する機会が
ございまして、なにかにつけ参考とさせて頂きました。
日本語でこのように詳細多岐に渡る解説を
頂けるサイトは数少ないと思います。
今後も色々と参考にさせてください。
お体に気をつけて末永く(笑)続けて頂けますと
誠に幸いです。
これからも購読させて頂きます。
がんばってください!
onsatuさん
応援コメントをありがとうございます! 参考にしていただけたようで、私としても頑張った甲斐がありました。。。
そして、引き続き無理のない程度に(?)、投稿をがんばります(笑)。
いつも拝見させて頂いております。
onsatuです。
CQWにて表示不具合を発見致しましたので
ご報告致します。
長文になりますので、コメント表示のご判断はお任せ致します。
なお本件はMSにも問い合わせの上、CQWのバグであろうとの
見解をもらっております。
→SP1適用、post-SP1適用後も再現しました。
以下に列挙させて頂きます。(txtから転載の為改行変だったりはご容赦をm(_ _)m)
==============================
[現象]
・新着情報を表示するコンテンツクエリWebパーツ(以下CQW)にて、
対象ユーザーに表示するはずのアイテムが表示されない。
表示されていないユーザーにて、CQWの[個人用Webパーツの変更]を
起動すると、コンテンツクエリWebパーツのクエリ等を設定する画面へ遷移するが、
その画面にて今まで表示されていなかった新着情報がCQWに表示される。
この状態にて、画面右側のCQW設定ウインドウ下部のキャンセルを押下すると
通常のサイトTOPへ遷移するのだが、今まで表示されていなかった新着情報がCQWに表示されている。
さらに、新着情報がCQWに表示されている状態にて画面上部のナビゲーションタブの現在表示しているサイトへの
タブをクリックし、同一サイトを表示し直すと、新着表示がCQWに再び表示されなくなる。
[前提]
・スタンドアロンでMOSS環境を構築
・SP1適用前
・ドメインにMOSS管理者アカウント、ユーザーA、ユーザーBが存在する。
[検証時点の要件]
・とあるサイトコレクションにて、ユーザーはまずTOPレベルのサイトにアクセスする。
その際に、自分が閲覧できるサブサイトのお知らせに新着投稿があるかどうかをTOPサイトにて
知ることができるように、TOPレベルサイトのTOP表示にコンテンツクエリWebパーツによる
新着表示リストを配置する。
なお、TOPレベルサイトにもお知らせは存在するが、その新着表示は対象外。
(TOPサイトのTOP配置で確認できる為)
[再現手順]
1.3つのWebアプリを新規作成、それらを保持するSSP作成。
2.チームサイトテンプレートでサイトコレクション作成。(親サイトとする)
3.親サイトにて[サイトコレクションの機能]→発行インフラストラクチャをアクティブ化。
4.親サイトのコンテンツタイプ[お知らせ]に以下を追加。
・サイト区分(1行テキスト):設定はデフォルト。
5.親サイト[お知らせ]の詳細設定にて、コンテンツタイプの管理を許可。編集アクセス権を所有するアイテムのみに変更。
6.親サイト[お知らせ]の[サイト区分]の規定値を"全社"に設定。コンテンツタイプにて[サイト区分]を非表示化。
→TOPサイトのお知らせは新着表示対象外とする為
7.親サイトにコンテンツクエリWebパーツ(CQWとする)を配置し、以下の内容にて設定する。
・ソース:このサイトコレクションのすべてのサイトからアイテムを表示する。
・リストの種類:お知らせ
・コンテンツタイプ_このコンテンツタイプグループのアイテムを表示する:リストコンテンツタイプ
・コンテンツタイプ_このコンテンツタイプのアイテムを表示する:お知らせ
・子コンテンツタイプを含める:ON
・追加フィルタ:[サイト区分]が次の値に等しくない:全社
・アイテム制限数:30
(他の項目はすべてデフォルト設定)
8.親サイトの権限にユーザーA及びユーザーBを投稿権限で追加。
9.サブサイトAをチームサイトテンプレートにて作成。(サイトAとする)
10.サイトA[お知らせ]の列の設定にて[サイト区分]の規定値を空白に設定。コンテンツタイプにて[サイト区分]を非表示化。
11.サイトAのサイトの設定→権限の設定にて、親からの継承を外し、ユーザーAの投稿権限のみにする。
12.サブサイトBをチームサイトテンプレートにて作成。(サイトBとする)
13.サイトB[お知らせ]の列の設定にて[サイト区分]の規定値を空白に設定。コンテンツタイプにて[サイト区分]を非表示化。
14.サイトBのサイトの設定→権限の設定にて、親からの継承を外し、ユーザーBの投稿権限のみにする。
15.ユーザーAでサイトA[お知らせ]に5件追加→ユーザーBでサイトB[お知らせ]に5件追加、、、という手順を
各々のお知らせアイテム件数が30件になるまで繰り返す。
16.親サイトCQWの表示件数を15件に変更。
17.親サイトCQWの表示件数を3件に変更。
18.ユーザーAでサイトA[お知らせ]に1件追加。
19.親サイトCQWの表示件数を30件に変更。
20.ユーザーAでサイトA[お知らせ]に合計37件になるまで追加。(操作時点では31件となっているので6件追加する)
項番20完了の時点でユーザーBでTOPサイトにアクセスするとCQW表示件数が2件になってしまいます。
==============================
以上が再現手順となります。
お時間ございます時にでもご確認頂ければと存じます。
それでは~
onsatu さん
貴重な情報提供をありがとうございました。そうですか、そんな問題が潜在していましたか。。。とても参考になります。他の方にもきっと役立つ情報だと思われますので、そのまま公開させていただきました。
また、今後もこうした追加情報などいただけますと幸いです。よろしくお願いいたします。
いつもお世話になっております。
onsatuです。
御確認頂きまして誠にありがとうございます。
現象の引き金は、確証はありませんが
表示件数を増減させることにある気がしております。
また、表示件数を変更した際の抽出対象アイテムの数に
よって、現象の発生有無が分かれるようです。
運用中のサイトにて表示件数変更を行っていたら、
途端に特定ユーザーには新着表示がなくなる、、、
などという現象が発生しかねませんね。
新着表示をどう実現するか悩み中であります(T-T)