Revision 1 as of 2009-12-31 03:04:24

Clear message
Locked History Actions

wicket/BreadCrumbs

パンくずリストの実現

wicket-extensionsにパンくずリストパネルが用意されているが、これは使い物にならない。 ここでは独自のパンくずリストの実装について考えてみる。

目標とする形

パンくずリストは以下のような構成となる。

トップ / 顧客グループ一覧 / A店顧客一覧 / 顧客X
~~~~  ~~~~~~~~~~~~~~   ~~~~~~~~~~

現在ページをトップからのパスで示し、現在ページ以外のページ名はそのページへのリンクとする。これらのリンクをクリックすることで、そのページへの遷移を行う。

構成ページの要件

要件1

当然のことながら、パンくずリストに表示されるページは「最後のページ」(この場合は顧客A)を除いてブックマーク可能でなくてはいけない。でなければ、リンクをクリックした時にそのページに戻ることができない。

もちろん、Wicketの場合は、ブックマーク不可能なページでもページキャッシュに格納されているため、何らかの方法でそのページを「再生」することはできると思われるがしかし、ページキャッシュはいつクリアされるかわからない。リンクをクリックされた時に「ページキャッシュに格納されたであろう個別状態」を再生するには、ページキャッシュから取得するか、それができなければそのページが作成された時の条件(ページパラメータ)を指定して再作成するしかない。

結局のところ、ページキャッシュに依存することはできないので、そのページを再生成可能なように、ページパラメータ付のコンストラクタを用意し、生成時のページパラメータ自体をパンくずリストに保持しなければならない。

もちろん、ページパラメータ不要な場合は、引数無しコンストラクタがあればよい。

要件2

ページ階層は「最後のページ」を除いて、固定していなければならない。逆に言えば、階層の固定していないページは、「最後のページ」以外には現れることができない。これは純粋にユーザビリティ上の問題である。

例としたパンくずリストでは、以下のようになっているが、

トップ / 顧客グループ一覧 / A店顧客一覧 / 顧客X
~~~~  ~~~~~~~~~~~~~~   ~~~~~~~~~~

以下のようなパンくずが作成できてしまってはいけない。

トップ / A店詳細 / A店顧客一覧 / 顧客X
~~~~  ~~~~~~~   ~~~~~~~~~~

なぜなら、いずれの場合でも「A店顧客一覧」をクリックすると、その顧客一覧ページが表示されるが、このときのパンくずは、

トップ / 顧客グループ一覧 / A店顧客一覧
~~~~  ~~~~~~~~~~~~~~   

とすべきか、

トップ / A店詳細 / A店顧客一覧
~~~~  ~~~~~~~ 

とすべきか決定することができないからである。「パンくずの内容を見て、それぞれの階層として表示すればいいではないか」と思うかもしれないが、それではうまくいかない。 もしユーザがA店顧客一覧を表示中にそれをブックマークしたとする。それを後で表示した場合、パンくずとしてどちらの階層を表示すべきかは決定できない。

したがって、パンくずリストに現れる最後のページ以外は、以下のようなきれいな木構造となっていなければならない。

A
+- B
|  +- D
|     +- E 
+- C
   +- F
   +- G

最後のページについて

トップ / 顧客グループ一覧 / A店顧客一覧 / 顧客X
~~~~  ~~~~~~~~~~~~~~   ~~~~~~~~~~