Bug(バグ) #1859
完了The community category is not considered a sort of parent categories (コミュニティカテゴリが大カテゴリのソートを考慮していない)
0%
説明
Overview (現象)¶
管理画面でカテゴリ関係を下記のように定義したとする.
- A
- a
- b
- B
- c
- d
- e
これを下記の順番にしたとする.
- B
- c
- d
- e
- A
- a
- b
このときに,フロントエンド側のコミュニティ新規作成画面などでコミュニティカテゴリを選択する際に表示される select タグの option の項目が c d e a b と表示されるべきだが,a b c d e と表示されてしまう.
Causes (原因)¶
大カテゴリを考慮して小カテゴリのソートを行っていない。
Way to fix (修正内容)¶
小カテゴリと大カテゴリを別々のクエリで取得後、PHP 側でソート処理を行う。
(2系ではJOINを使用して1クエリで取得していたが、Doctrineを使用した場合テーブルの構造上の問題で同じ方法は使えない)
この結果を Doctrine_Collection で返すメソッドを CommunityCategoryTable に追加し、
既存のカテゴリ表示を行っている箇所をすべて置換する。
Masato Nagasawa さんがほぼ14年前に更新
- ステータス を New(新規) から Accepted(着手) に変更
- 担当者 を Masato Nagasawa にセット
- 対象バージョン を OpenPNE 3.7.0 にセット
- 3.6 で発生するか を Yes にセット
テスト¶
以下のデータを作成してテストを実施する。
- カテゴリA
- A1
- A2
- A3
- カテゴリB
- B1
- B2
- B3
- カテゴリB
- B3
- B2
- B1
- カテゴリA
- A3
- A2
- A1
テスト結果¶
画面 | 区分1 | 区分2 | 期待結果 | 結果 |
PCユーザー画面 | 検索フォーム | 表示が正しいか | 小カテゴリが大カテゴリの順に並んでいる | ○ |
PCユーザー画面 | 検索フォーム | 選択したカテゴリで検索 | 選択したカテゴリで検索される | ○ |
PCユーザー画面 | 検索フォーム | すべてのカテゴリで検索 | すべてのカテゴリが検索対象となっている | ○ |
PCユーザー画面 | コミュニティ作成 | 初期選択が空白であるか | 空白が選択されている | ○ |
PCユーザー画面 | コミュニティ作成 | 表示が正しいか | 小カテゴリが大カテゴリの順に並んでいる | ○ |
PCユーザー画面 | コミュニティ作成 | 選択したカテゴリで登録されるか | 選択したカテゴリで登録される | ○ |
PCユーザー画面 | コミュニティ作成 | 空白で登録されているか | カテゴリが存在しないコミュニティが作成される | ○ |
PCユーザー画面 | コミュニティ編集 | 表示が正しいか | 小カテゴリが大カテゴリの順に並んでいる | ○ |
PCユーザー画面 | コミュニティ編集 | 選択したカテゴリで登録されるか | 選択したカテゴリで登録される | ○ |
携帯ユーザー画面 | 検索フォーム | 表示が正しいか | 小カテゴリが大カテゴリの順に並んでいる | ○ |
携帯ユーザー画面 | 検索フォーム | 選択したカテゴリで検索 | 選択したカテゴリで検索される | ○ |
携帯ユーザー画面 | 検索フォーム | すべてのカテゴリで検索 | すべてのカテゴリが検索対象となっている | ○ |
携帯ユーザー画面 | コミュニティ作成 | 初期選択が空白であるか | 空白が選択されている | ○ |
携帯ユーザー画面 | コミュニティ作成 | 表示が正しいか | 小カテゴリが大カテゴリの順に並んでいる | ○ |
携帯ユーザー画面 | コミュニティ作成 | 選択したカテゴリで登録されるか | 選択したカテゴリで登録される | ○ |
携帯ユーザー画面 | コミュニティ作成 | 空白で登録されているか | カテゴリが存在しないコミュニティが作成される | ○ |
携帯ユーザー画面 | コミュニティ編集 | 表示が正しいか | 小カテゴリが大カテゴリの順に並んでいる | ○ |
携帯ユーザー画面 | コミュニティ編集 | 選択したカテゴリで登録されるか | 選択したカテゴリで登録される | ○ |
携帯ユーザー画面 | コミュニティ検索カテゴリリスト | 表示が正しいか | 小カテゴリが大カテゴリの順に並んでいる | ○ |
携帯ユーザー画面 | コミュニティ検索カテゴリリスト | リンクが正しいか | 対象のカテゴリで検索されるか | ○ |
管理画面 | コミュニティリスト | 表示が正しいか | 小カテゴリが大カテゴリの順に並んでいる | ○ |
管理画面 | コミュニティリスト | 選択したカテゴリで検索 | 選択したカテゴリで検索される | ○ |
管理画面 | コミュニティリスト | すべてのカテゴリで検索 | すべてのカテゴリが検索対象となっている | ○ |
Masato Nagasawa さんがほぼ14年前に更新
- 題名 を コミュニティカテゴリが大カテゴリのソートを考慮していない から The community category is not considered a sort of parent categories (コミュニティカテゴリが大カテゴリのソートを考慮していない) に変更
Masato Nagasawa さんがほぼ14年前に更新
- ステータス を Accepted(着手) から Pending Review(レビュー待ち) に変更
- 進捗率 を 0 から 50 に変更
更新履歴 37f8eb131767a730a46328d1eebba5d802f3036b で適用されました。
Yuma Sakata さんが12年以上前に更新
- 対象バージョン を 252 から OpenPNE 3.8beta1 に変更
- 3.6 で発生するか を Yes から Unknown (未調査) に変更
- 3.4 で発生するか を Unknown (未調査) にセット
Yuya Watanabe さんが12年以上前に更新
- ステータス を Pending Review(レビュー待ち) から Rejected(差し戻し) に変更
- 担当者 を Masato Nagasawa から Shouta Kashiwagi に変更
このあたりが非効率な気がしました.
一旦ルートとその子供をそれぞれ取る必要はなく,ソートされた状態のルートから ソートされた子供が取得できるため,これを順番に配列に追加してゆけば問題ないのではないかと思います.
パフォーマンスについては,DB 接続やソートのオーダーを無視したとして,下記のものだと 子供の数 m と 親の数 n としたときにビックオー記法で O(n+m) となります.これはおそらく O(m) になるものと思います.実際に測定しないと効果がわからいませんが,コード上ではここに記述したとおりの解釈となると思います.
lib/model/doctrine/CommunityCategoryTable.class.php
52 public function getAllChildren($checkIsAllowMemberCommunity = false) 53 { 54 $roots = $this->retrieveAllRoots(); 55 $children = $this->retrieveAllChildren(); 56 57 // sort by root category 58 $temp = array(); 59 foreach ($children as $child) 60 { 61 if ($checkIsAllowMemberCommunity && !$child->getIsAllowMemberCommunity()) 62 { 63 continue; 64 } 65 $temp[$child->getTreeKey()][] = $child; 66 } 67 68 $data = array(); 69 foreach ($roots as $root) 70 { 71 if (isset($temp[$root->getId()])) 72 { 73 $data = array_merge($data, $temp[$root->getId()]); 74 } 75 } 76 77 $collection = new Doctrine_Collection($this); 78 $collection->setData($data); 79 80 return $collection; 81 }
Shinichi Urabe さんが10年以上前に更新
- ステータス を Rejected(差し戻し) から Pending Review(レビュー待ち) に変更
- 担当者 を Shouta Kashiwagi から 誠二 天重 に変更
- 対象バージョン を OpenPNE 3.9.0-old から OpenPNE 3.8.12 に変更
- 3.8 で発生するか を Unknown (未調査) にセット
現状 master に取り込まれている修正です
パフォーマンスに問題があれば別チケットで対応でもよいかと考えます
レビュー待ちにして、対応を進めます
誠二 天重 さんが10年以上前に更新
- コピー先 Backport(バックポート) #3635: The community category is not considered a sort of parent categories (コミュニティカテゴリが大カテゴリのソートを考慮していない) を追加
Shinichi Urabe さんが10年以上前に更新
- ステータス を Pending Review(レビュー待ち) から Pending Testing(テスト待ち) に変更
- 進捗率 を 50 から 70 に変更
レビューOKです
パフォーマンスの改善については #3650 のチケットでの課題とします
isao sano さんが10年以上前に更新
- コピー先 Backport(バックポート) #3660: The community category is not considered a sort of parent categories (コミュニティカテゴリが大カテゴリのソートを考慮していない) を追加