パンくずリストの実現
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 ~~~~ ~~~~~~~~~~~~~~ ~~~~~~~~~~