AlbumControlページ移動不具合修正
ATPhotoのAlbum、Photo各AlbumControlにて前のページに戻ると表示がおかしくなる不具合を修正。
【環境】
- Zope-2.8.6-final (Linux)
- Plone-2.1.3
- ATPhoto-1-0-alpha1
- FileSystemStorage-2.5rc1
alpha1の既存バグ。本家のIssue trackerを見ても放置プレイ状態なので独自に直します。不具合はこの一点。
Album、Photoの各AlbumControlにて、「<< 12 previous items」とかで前のページに戻るとアイテム表示がおかしくなる。
具体的な症状は最終ページから前のページに戻ると有るべきアイテムが一つ減った状態で表示される(↓のSS参照)。また、1~3ページある状態で2→1と移動すると、3ページ目にあるはずのアイテムの一つが先頭になり、それ以降のアイテムが1ページ目にあるアイテムとなる・・・と。
【不具合動作ScreenShot(GIFアニメにしてるのでクリックして元画像を見てちょ)】
これはブラウザで動作が異なるとかはなく、IE、Firefox共通。・・・はぁ、またJavascriptなんですよね~これorz
【ロジック解析】
もうFirefox&Firebugでstep実行しまくりで、なんとか解析できました。それにしてもこのFirebug、最強デバッガなんでね?IEでもこんなのがあったらいいなぁ・・・。
1.移動すると先頭表示アイテムindex(0)を引数に以下のfunctionが発動。
[ZMI]/portal_skins/ATPhoto/batch.js: Batch.gotoPage(0)
・
・
・
細かく書くのがめんどくさい・・・。
Batchオブジェクトの振る舞い的には、Batch.getBatch()で指定されたindex = Batch.start
から、Batch.end-1(Step=Batch Size分) まで各アイテム情報が格納されている
Batch.getItem{...]の中から現在地アイテムを示す Batch.current を更新して順に情報を
引っ張ってくるというもの。
その問題となる制御をざばっと書くとこんな感じでした。間違ってたらごめんちゃい。
アイテム総数=13(Batch Sizeは最小12ですが、ここでは6として説明。ページ総数=3)
【初期状態(1ページ目表示完了時)】
0 1 2 3 4 5 6 7 8 9 10 11 12 | (←アイテムindex)
--------------------------------------------------
* * * * * * | (←*付き=表示中)
Batch.start = 0
Batch.end = 6
Batch.current = 6のアイテム
【次ページ移動開始時(2ページ目表示制御開始前)】
0 1 2 3 4 5 6 7 8 9 10 11 12 | (←アイテムindex)
--------------------------------------------------
| (←*付き=表示中)
Batch.start = 6 ← Batch.getBatch(6)で設定
Batch.end = 12 ← Batch.getBatch(6)で設定
Batch.current = 12のアイテム
【次ページ移動完了時(2ページ目表示制御終了後)】
0 1 2 3 4 5 6 7 8 9 10 11 12 | (←アイテムindex)
--------------------------------------------------
* * * * * * | (←*付き=表示中)
Batch.start = 6
Batch.end = 12
Batch.current = 12のアイテム
【前ページ移動開始時(1ページ目表示制御開始前)】
0 1 2 3 4 5 6 7 8 9 10 11 12 | (←アイテムindex)
--------------------------------------------------
| (←*付き=表示中)
Batch.start = 0 ← Batch.getBatch(0)で設定
Batch.end = 6 ← Batch.getBatch(0)で設定
Batch.current = 12のアイテム
【前ページ移動完了時(1ページ目表示制御終了後)】
0 1 2 3 4 5 6 7 8 9 10 11 12 | (←アイテムindex)
--------------------------------------------------
* * * * * | (←*付き=表示中)
Batch.start = 0
Batch.end = 6
Batch.current = 6のアイテム
↑
移動開始時に”現在入っているBatch.currentから表示"というロジックになってるので、
12を先頭に1,2,3,4,5を表示。これが最終ページから前ページに行くとcurrentがNULLになってる
ので一つ足りない状態で表示されちゃってた。
あ~~~なんかうまく説明できませんがとりあえずそんなかんじで~す。
【対策&修正ソース】
解析には時間が掛かりましたけど、対策はスマートに出来たと思います。・・・というか、これはどう見ても単なる初期化漏れですほんとうにあ(ry。
解決策は単純。AlbumControlでページ移動する都度、Batch.getBatch(開始位置index)
で初期化された Batch.start
と Batch.current
を Batch.init(開始位置index)
を使って一致させればやればいいと。
まぁ・・・step実行してると、1→2と行く場合は、1のページを書き終わった時点でBatch.currentが2ページ目の先頭アイテムを指していたのでそれでおkと判断したんだろうかと。