2008年1月

2008年1月31日 (木)

今回は、いろいろと便利に使える「コンテンツ クエリ Web パーツ」について取り上げます。

具体的な方法をご紹介したほうがわかりやすいと思いますので、今回は最もニーズのありそうな "複数サイトから「お知らせ」を取得する" ことを目標にコンテンツ クエリ Web パーツを配置してみます。なお、この記事は連続ものにしております。

最終的にはカスタマイズを加え以下のような仕上がりにしていきたいと思います。大抵、SharePoint のカスタマイズというと何かにつけすぐに Web パーツ開発となりがちですが、実はそうではありません。表示部分は XML がベースになっていますので、一部のXML を編集するだけでも下記のような表示が可能です。Web パーツ開発に進む前に、こうしたカスタマイズ方法はぜひとも覚えておきたいところです。

[最終目標の画面]

Cqwp_complete_2


まずは今日の目標はまずはコンテンツ クエリ Web パーツの基本的な利用方法を確認しておきます。複数の営業部サイトからサイトごとのお知らせ情報を取得するように構成します。

[今回の目標画面]

Cqwpprecomplete1

検証環境

  1. グループ作業ポータルを使用
  2. サイトディレクトリの配下に「営業部」、さらにその下に「営業1課」の2つのサイトを作成し、お知らせリストに適当にアイテムを追加しておく

手順

  1. グループ作業ポータルのトップページに「コンテンツクエリ Web パーツ」を追加します
  2. 「コンテンツクエリ Web パーツ」の[編集]-[共有Webパーツの変更]をクリックします。
  3. [クエリ]セクションで[ソース]を "以下のサイトおよびそのサブサイトからアイテムを表示する" を選択し営業部サイトのURLを指定します。
    Cqwpquery

  4. [リストの種類] から [このリストの種類のアイテムを表示する] を "お知らせ" に変更します。また、[コンテンツ タイプ] で "リスト コンテンツ タイプ" を指定し、さらに[このコンテンツ タイプのアイテムを表示する] で "お知らせ" を指定します。
    Cqwplisttype

  5. [プレゼンテーション] セクションでは [アイテムのグループ化キー] を "<サイト>" とし降順で並び替えます。続いて [アイテムの並び替えキー] を"作成日時" とします。

    Cqwpgroupandsort_2

  6. 表示するアイテム数を今回は "5" に変更します。また、[グループ スタイル] を "帯状" 、[アイテムのスタイル] を "タイトルのみ" に設定します。

    Cqwpstyle

  7. [外観] セクションの [タイトル] に "すべてのお知らせ" と入力します。

    Cqwptitle

  8. [OK] ボタンをクリックします。

  9. 画面上部の[発行]をクリックします。

以上の設定で複数サイトから「お知らせ」を表示できるようになりました。

次回は、SharePoint Designer 2007 を使用して、パーツのヘッダー部分に 今日の日付を表示するようにカスタマイズします。

※なお、ルートのサイトコレクションを作成していない場合、各アイテムのリンク先は表示されません。このことは以前の記事でもご紹介しました。
http://shanqiai.weblogs.jp/sharepoint_technical_note/2007/12/web_f315.html
が、ルートのサイトコレクションを作成しなくても、これを回避する方法を見つけたので別途改めてご紹介します。

2008年1月30日 (水)

先日、「ブログのカテゴリごとに10件しか表示できない」ことをご紹介しましたが、これに関連して調べたことがありましたので、まとめておきます。

トップページに表示される既定の投稿数を変更するには

以前、ブログを利用されようとしている方で、最近の主流は「1ページ 1投稿」というスタイルが多いらしいので SharePoint でも同じようにできないかというご質問をいただきました。トップページの投稿の表示部分は Webパーツですから、Web パーツのビューを編集すれば対応できます。

手順(1件ずつ表示する例)

  1. [サイトの操作] メニューから[ページの編集]をクリックします
  2. "投稿" Web パーツの [編集]から[共有Webパーツの変更]をクリックします
  3. 画面右側のツールパーツ部分に表示される "現在のビューの編集" をクリックします
  4. ビューの編集画面の最下部にある [アイテムの制限] セクションで [表示するアイテム数]を "1" に変更します(ここで表示したい数を指定します)
  5. [OK] をクリックします

さてここからがポイントです。本来これで、問題なさそうなものなのですがブログサイトだけは違います。実は既定のビューを変更すると、カテゴリ別で表示したときに正しくフィルタされず、どのカテゴリをクリックしてもすべてのアイテムが表示される(といっても10件までですが) ようになってしまいます。

このことはサポート技術文書が出ています。
[KB 939310] The blog posts are not filtered correctly when you click a link to a category on a Windows SharePoint Services 3.0 blog site

要するにCategory.aspx 内のListView Webパーツのフィルタ設定情報が壊れるということのようです。

ということで、サポート技術文書の手順に基づいて最後に SharePoint Designer 2007 を使用してWebパーツを一部修正します。

  1. 正しく動作するブログサイトからフィルタ構成情報を取得するため、一時的なブログサイトを別途作成しておきます
  2. 修正したいブログサイトを SharePoint Designer 2007 で開き、Listsフォルダ内の Category.aspx を開きます。これは GUID を取得するためです。
  3. 分割ビューで表示しておいて、デザインビュー側で投稿情報が表示される部分を選択します。するとコードビューの中に<ListViewXML>タグが見つかりますので、この中の"Veiew Name={GUID}" のGUID 部分をコピーしておきます。
  4. 今度は正しく動作している一時作成したブログサイトを SharePoint Designer 2007 で開きます。
  5. 分割ビューに切り替え、デザインビュー側で投稿情報が表示される部分を選択します。するとコードビュー内に先ほどと同様、<ListViewXML>タグが見つかります。この中の、"View Name={GUID}" の GUID を3.でコピーしたGUIDに置き換えます。
  6. <ListViewXML>開始タグから</ListViewXML>終了タグまでをコピーします。
  7. SharePoint Designer 2007 の画面を修正目的のブログサイトに切り替え、同じく<ListViewXML>から</ListViewXML>までをコピーした内容で置き換えます。
  8. 目的のブログサイトの Category.aspx を上書き保存します。
  9. 一時作成したブログサイトの方は変更を保存せずに、SharePoint Desiger 2007 を終了します。

以上です。正しく動くようになったら、一時作成したブログサイトは削除しておきます。

2008年1月29日 (火)

MSDN のフォーラムの方に「SharePoint ブログ サイトで カテゴリごとに 10件以上表示できない」というご質問があり調べてみました。自分への備忘録として結果をこちらにも投稿しておきます。

いろいろと調べたところ、「ブログ サイトで カテゴリごとに 10件以上表示できない」というのはわりと周知の問題で (バグも絡んだ) 仕様のようです。MOSS SP1 環境でも再現します。

問題は Category.aspx にあります。実はこのファイル、他にも不具合が生じることがあることがわかりました。これについては別途、投稿します。

再現方法

  1. SharePoint 上に任意のブログサイトを作成します。
  2. 11件の投稿をしますが、このとき"カテゴリ1"を選択して投稿しておきます。
  3. サイドリンクバーに表示される "カテゴリ1" をクリックします。10件までしか表示されません。
  4. 画面下部に表示される "次へ" の矢印をクリックします。
  5. 実際にはあと1件表示されるはずが、「投稿はありません」と表示されます。

仕様として、そもそもカテゴリごとに10件しか表示できないようです。なのに、10件以上の投稿にカテゴリ属性を設定でき、かつ既定で"次へ"が表示されてしまうようになっています。

なお、ブログサイトのトップページの方に表示される「投稿」 を表示するWeb パーツ部分は既定ではカテゴリに関係なく、すべての投稿が表示されますので全く確認できなくなるわけではありません。

解決策

10件以上登録する必要がある場合は、SharePoint Designer 2007でサイトを開き、Lists フォルダ内にある Category.aspx を編集します。
この中の <ListViewXml>タグ内の

  • "&lt;RowLimit Paged="TRUE" &gt;10&lt;/RowLImit&gt;"
    →<RowLimit Paged="TRUE">10</RowLimit>

この 10 という値が表示数を制限している値です。この値を最大投稿数に変更します。また、Paged 属性値を"TRUE" から "FALSE" に変更しておくと、"次へ" の矢印は表示されなくなります。

補足

もうひとつおまけの情報として、「投稿」リスト内にすべての投稿が格納されますが、ここのページは単純にリストページですから、通常のビューと同様で「すべての投稿」ビュー(AllPosts.aspx) があります。このビューは既定では100アイテムごとに表示されるようになっています。一方、カテゴリごとに表示するときには Category.aspx が使用されます。


参考:SharePoint Solution Blog (英語)

2008年1月28日 (月)

Windows SharePoint Services 3.0 を使用していると、削除されたはずのアイテムが検索されてしまうことがあるようです。本来、検索に使用されるインデックスは定期的に更新されるはずですが、うまく更新できていないことが原因だと思われます。

実際にこの現象は以前受講された方の環境で実際に発生しておりまして、以下のようにインデックスの再構築を試みることで解消されたというご連絡をいただきました。

MOSS であれば共有サービス管理からクロールを管理できますが、WSS にはありませんのでコマンドラインから実行する必要があります。

インデックスの再構成を行う

stsadm.exe -o spsearch -action fullcrawlstop
stsadm.exe -o spsearch -action fullcrawlstart

きっと同じような状況に遭遇されてしまうも方いらっしゃると思いますので、ご参考まで。

2008年1月25日 (金)

MSDN フォーラムに同タイトルの質問がありました。手軽に実装できないかと考えていたところふと、SharePoint Designer 2007でJavaScript を用いてコーディングできないかと思い、試してみました。なんとかなりそうです。MSDN フォーラムには返信していますが、こちらのブログにもエントリをポストしておこうと思います。

検証環境ではカスタムリストを作成し、そのNewForm.aspx を編集しました。

まず、JavaScript を用いて「ユーザーまたはグループフィールド」のオブジェクトをどうやって取得するかがポイントです。他の列の種類とは異なり、「ユーザーまたはグループフィールド」列のオブジェクトの取得はコツが必要です。なぜかというと、他のフィールドは "input" タグなどが生成されるのですが、これは 複雑なテーブル内に含まれるDivタグが生成されるからです。このあたりは IE Developer Toolbar を活用して調査しました。IE Developer Toolbar は IE 6.0 以降にインストールできる無償のアドインです。これを使うと、画面上に表示されるテーブルやセル構造、CSS などを GUI で確認できます。ツールは次のURLからダウンロードできます。

次のようにコードを記述しました。

  1. 1. NewForms.aspx のContentPlaceHolderId属性が"PlaceHolderMain"となっているコンテンツ コントロール("asp:Content "で始まるタグ) を見つけます。
  2. 1のコンテンツ コントロール タグの直後に以下のスクリプトコードを追加します。

    <script type="text/jscript">
    _spBodyOnLoadFunctionNames.push("getUserName");
    function getUserName()
    {
    '「ユーザーとグループ フィールド」のオブジェクトを取得
    var nameTags=document.getElementById("ctl00_m_g_3405cb6d_6769_4048_a928_
    ec0098015995_ctl00_ctl04_ctl01_ctl00_ctl00_ctl04_
    ctl00_ctl00_UserField_upLevelDiv
    ");

    '既定値を指定 
    nameTags.innerText="<loginUserName>";
    }
    </script>

  3. "ctl00_m_g_3405cb6d_6769_4048_a928_ec0098015995_ctl00_ctl04_
    ctl01_ctl00_ctl00_ctl04_ctl00_ctl00_UserField_upLevelDiv"の部分はご自身の環境に合わせて変更してください。この id は NewForm.aspx をブラウザ表示してソースを確認してください。「ユーザーまたはグループフィールド」はソース内では "Divタグ" になっています。この Div タグの id を取得して設定してください。とはいえ、ソースの確認は大変ですから、IE Developer Toolbar を使用して探すのが一番です。

残る課題はユーザーのログイン名の取得ですが、とりあえずてっとり早く実装したかったので「ようこそ○○さん」の表示部分から取得してみました。完成版のコードは以下の通りです。

<script type="text/jscript">
_spBodyOnLoadFunctionNames.push("getUserName");
function getUserName()
{
'「ようこそ」の部分からユーザー名を取得
var loginNameTags= document.getElementById("zz7_Menu");
var loginDisplayName=loginNameTags.innerText;
var loginName=loginDisplayName.substring(
4,loginDisplayName.lastIndexOf("さ",loginDisplayName.length));

'「ユーザーまたはグループ 」フィールドにユーザー名を表示
var nameTags=document.getElementById("ctl00_m_g_3405cb6d_6769_4048_a928_ec0098015995_ctl00
_ctl04_ctl01_ctl00_ctl00_ctl04_ctl00_ctl00
_UserField_upLevelDiv
");
nameTags.innerText=loginName;
}
</script>

ちなみに、この方法では必要となるページごとにコーディングが必要となります。もう少し簡単に再利用させたいのであれば、カスタムフィールドを開発するのがよいと思います。