Thursday, December 18, 2008

Bug - Blog Template on WSS 3.0

現象:
Category.aspx上のポストWebPartのビューを変更すると、QuickLinkからのCategory別フィルターが機能しない。

詳細:
Blogテンプレートを使って作成されたサイトで、ポストWebPartのビューに変更を加えると、それ以降、QuickLink(ページ左のリンク)からCategory別のページに移動しても、投稿済みのポストがカテゴリー別に表示されない様になる。
実際はビューになんら変更を加えずに、ビューの変更画面でキャンセルではなく保存をクリックして抜けた場合でも、上記の現象は発生する。

再現方法:
1.Blogテンプレートを使って新規サイトを作成
2.新規ポスト(TEST)を投稿、カテゴリーにはカテゴリー1を選択
3.メイン画面のQuickLinkからカテゴリー1をクリック
4.TESTのみ表示され、既存のWelcomeポストは表示されない(Category別フィルターはまだ機能している)
5.カテゴリー1を表示している状態でページの編集、ポストWebPartを選択し編集
6.ビューの編集画面を開き、何も変更せず保存をクリック
7.ページの編集を終了
8.上記のステップ3を再度実行するとTESTは表示されず、既存のWelcomeポストだけ表示される。(Category別フィルターが機能しない)
9.Category2.3も同様に、既存のWelcomeポストのみの表示になる

対処法:
Category.aspxのCAML部分を直接修正する。
Category.aspxはSiteRoot>Lists>Categories以下にあり、SharePoint Designerが有る場合にはファイルをTextモードで開き以下の部分を修正する。
<ListViewXml xmlns="http://schemas.microsoft.com/WebPart/v2/ListView">&lt;View Name="...
...&lt;Where&gt;&lt;IsNull&gt;&lt;FieldRef Name="PostCategory"/&gt;&lt;/IsNull&gt;&lt;/Where&gt;...

&gt;を>, &lt;を< に変換してみると読みやすくなる。

...<Where>
<IsNull>
<FieldRef Name="PostCategory"/>
</IsNull>
</Where>...

変更前は以下

...<Where>
<Eq>
<FieldRef Name="PostCategory"/><Value Type="">
<GetVar Scope="Request" Name="Name"/></Value>
</Eq>
</Where>...

変更前本来の以下のコードで変更した部分を上書きしてCategory.aspxを保存。

...&lt;Where&gt;&lt;Eq&gt;&lt;FieldRef Name="PostCategory"/&gt;&lt;Value Type=""&gt;&lt;GetVar Scope="Request" Name="Name"/&gt;&lt;/Value&gt;&lt;/Eq&gt;&lt;/Where&gt;

推測:
ビューの変更画面では表示しきれないカスタム変更(GetVarタグなど)が加わっているWebPartへの変更だったため、キャンセルではなく保存で変更画面を抜けた時に
変更画面のバックエンドロジックが違った解釈をして下手な上書き更新がかかってしまい、本来動作していたはずのCategory別表示も機能しなくなったという訳ではないでしょうか。
ビューの変更画面にバグがあるのは確かですが、やはりこのようなCAMLでのガリガリに作りこまれたロジックをWebから設定できるように設定内容を拡張するのは無理でしょうね。
もしワーニングかメッセージかを、このようなロジックが組み込まれているWebPartのビュー変更画面を開けようとしている時に出してくれると、不意な障害から避けられると思うのですが。どうでしょうね。

0 comments: