Personal tools
You are here: Home Zope&Plone Tips AlbumControlページ移動不具合修正
Document Actions

AlbumControlページ移動不具合修正

by maru last modified 2007-04-19 09:27

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アニメにしてるのでクリックして元画像を見てちょ)】
ページ移動バグ(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.startBatch.currentBatch.init(開始位置index) を使って一致させればやればいいと。

まぁ・・・step実行してると、1→2と行く場合は、1のページを書き終わった時点でBatch.currentが2ページ目の先頭アイテムを指していたのでそれでおkと判断したんだろうかと。