Bug(バグ) #1091
完了アルバムに登録した画像の表示順の不具合
100%
説明
作成したアルバムに画像を登録した際に、
最初に5枚(仮に1,2,3,4,5とする)
その次に5枚(仮に6,7,8,9,10とする)
と登録した場合並び順が
6,7,8,9,10,1,2,3,4,5と現在はなる。
1,2,3,4,5,6,7,8,9,10となった方が自然な動作に思える。
その結果、画像をクリックして大きな画像を表示した際に「次へ」「前へ」の挙動にも不具合が生じる。
「6,7,8,9,10,1,2,3,4,5」の順番のままの場合、「次へ」「前へ」の動作は振られたIDの順序のようなので、
現在先頭にある6番をクリックして「次へ」を押してすすめていくと10番に至った段階で次の1番に進めなくなる。
Minoru Takai さんが14年以上前に更新
アルバムに含まれる画像リストを取得するクエリが次のようになっています。
- opAlbumPlugin/lib/model/doctrine/PluginAlbumImageTable.class.php (16行目あたり)
$q = $this->createQuery() ->where('album_id = ?', $args[0]->id) ->orderBy('created_at DESC');
ある投稿による複数の画像の created_at カラム値が同一であるため、例示されている 6,7,8,9,10,1,2,3,4,5 のような不自然な順序で画像が取得されてしまっています。
この画像リストを取得する部分の順序に関する設計を見直すことが本質的な解決に繋がるかもしれません。
1,2,3,4,5,6,7,8,9,10となった方が自然な動作に思える。
あるいは 10,9,8,7,6,5,4,3,2,1 という順序のどちらかが直感的には好ましいように思えます。
Minoru Takai さんがほぼ13年前に更新
- 3.6 で発生するか を Yes から Unknown (未調査) に変更
- 3.4 で発生するか を Unknown (未調査) にセット
opAlbumPlugin-0.9.4.1 を使っている環境でこの問題が発生し、その解決策を確認するため、今ここにコメントを書き込んでいます。
- opAlbumPlugin のリポジトリ
- https://github.com/openpne-ospt/opAlbumPlugin
- git://github.com/openpne-ospt/opAlbumPlugin.git
から、この問題に対する修正内容を確認しました。
- 0.9.4.1 のリリースコミット (2011/4/9) :ここには 0.9.5 開発中のコミットは含まれていません( 0.9.4 系へのセキュリティリリースです)
commit 0ad7831f053283e469d788d5cf5c401c2680e3ec Author: Kousuke Ebihara <ebihara@tejimaya.com> Date: Sat Apr 9 04:14:17 2011 +0900 version 0.9.4.1
- 0.9.4 のリリースコミット (2010/2/9)
commit 983d976f25a66257a66a1764b3cdfb34e2a02549 Author: mogi hiroki <mogi@mogi-MacBook.local> Date: Tue Feb 9 14:01:05 2010 +0900 タグ0.9.4をきる
- 0.9.5 開発中のコミット (2010/6/9)
commit e50299f392fbe2a10dd2f36cbaa4393fc748583a Author: Nguyen Ngoc Tu <tu3009@gmail.com> Date: Wed Jun 9 14:17:08 2010 +0900 added mobile_frontend albumImage/show diff --git a/lib/model/doctrine/PluginAlbumImageTable.class.php b/lib/model/doctrine/PluginAlbumImageTable.class.php index 429cb66..c00e252 100644 --- a/lib/model/doctrine/PluginAlbumImageTable.class.php +++ b/lib/model/doctrine/PluginAlbumImageTable.class.php @@ -15,7 +15,7 @@ class PluginAlbumImageTable extends Doctrine_Table $q = $this->createQuery() ->where('album_id = ?', $args[0]->id) - ->orderBy('created_at DESC'); + ->orderBy('created_at ASC'); return $this->getPager($q, $args[1], $args[2]); }
- 1.0.0 開発中のコミット (2011/9/3)
commit 830a83ba2b2fc0f24547e7e4f07b3b62a330e56a Author: Shogo Kawahara <kawahara@bucyou.net> Date: Sat Sep 3 16:42:46 2011 +0900 fixed an order of album's image (fixes #1091) diff --git a/lib/model/doctrine/PluginAlbumImageTable.class.php b/lib/model/doctrine/PluginAlbumImageTable.class.php index 2b5d14d..a2a661a 100644 --- a/lib/model/doctrine/PluginAlbumImageTable.class.php +++ b/lib/model/doctrine/PluginAlbumImageTable.class.php @@ -14,8 +14,7 @@ class PluginAlbumImageTable extends Doctrine_Table if ($args[2] == null){ $args[2] = 10;} $q = $this->createQuery() - ->where('album_id = ?', $args[0]->id) - ->orderBy('created_at ASC'); + ->where('album_id = ?', $args[0]->id); return $this->getPager($q, $args[1], $args[2]); }
どうやら orderBy 句を外しているようですが、この修正は適切なものでしょうか。ソート基準となる値が同一である(あるいは1秒程度ずれている)日付を基にソートしているのは不適切ですが、そのソートを外すだけで期待する結果となるのでしょうか。
mysql> desc album_image; +-------------+------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +-------------+------------+------+-----+---------+----------------+ | id | int(11) | NO | PRI | NULL | auto_increment | | album_id | int(11) | NO | MUL | | | | member_id | int(11) | NO | MUL | | | | file_id | int(11) | YES | MUL | NULL | | | description | text | YES | | NULL | | | filesize | bigint(20) | NO | | | | | created_at | datetime | NO | | | | | updated_at | datetime | NO | | | | +-------------+------------+------+-----+---------+----------------+
直感的には、明示的な ID によるソート( ORDER BY id DESC あるいは file_id DESC )があるべきではないかと思いました。ところで「0.9.5 開発中のコミット (2010/6/9)」で created_at を降順(DESC)から昇順(ASC)に変更している理由は何でしょうかね。