Backport(バックポート) #1612
完了OpenPNE 2 からのアップグレードで、誤ったコミュニティカテゴリの紐付けをおこなってしまうことがある
100%
説明
Overview (現象)¶
OpenPNE 2 からのアップグレードで、誤ったコミュニティカテゴリの紐付けをおこなってしまうことがある。
この誤ったカテゴリの紐付けによって、中カテゴリにコミュニティがぶら下がってしまったり、 OpenPNE 3 からは閲覧できないコミュニティなどが生まれてしまう。
なお、この現象は OpenPNE 2 側データで「重複したコミュニティ名を持つコミュニティ」が存在している場合は発生しない(たとえば、 OpenPNE 公式 SNS には重複したコミュニティ名が存在していたため、この現象が発生しなかった)。
再現バージョン¶
- OpenPNE2.12.12 → 3.4.6
Causes (原因)¶
重複するコミュニティ名が存在しなかった場合に発行される、 OpenPNE 3 から OpenPNE 2 へのコミュニティインポート用の SQL に誤りがあった(この誤りは 2f36df96135741e537042bb028353bd1b90d83b8 で修正された)。
OpenPNE 2 からコミュニティを取得する SQL の WHERE 句の c_commu_category_id に指定される ID は、 OpenPNE 2 のコミュニティカテゴリ ID であるべきであるにも関わらず、 OpenPNE 3 のコミュニティカテゴリ ID を指定してしまっていた。
OpenPNE 2 のコミュニティカテゴリと OpenPNE 3 のコミュニティカテゴリはデータ構造が異なっており、 OpenPNE 2 では別テーブルであった中カテゴリも小カテゴリと同一のテーブルに格納される。そのため、小カテゴリの ID を OpenPNE 2 のものから意図的にずらしている。また、 OpenPNE 2 と OpenPNE 3 のどちらも、コミュニティは中カテゴリではなく小カテゴリに属するような実装になっている。
そこで、コンバータは小カテゴリに属するコミュニティ群のみを取得しにいこうとする。しかし、この誤った SQL では、コンバート対象とする小カテゴリIDの一覧は OpenPNE 3 のものであったので、 OpenPNE 2 では小カテゴリの ID だが OpenPNE 3 では中カテゴリの ID であるものはインポート対象にされていなかった。
Way to fix (修正内容)¶
1. まず、「原因」の項に示した問題を修正するために、重複するコミュニティ名が存在しなかった場合に発行する SQL でも、 OpenPNE 2 のカテゴリ ID を基にコミュニティのインポートをおこなうように修正した
2. 「1.」の修正はこれからコンバートをおこなう SNS にのみ有効なもので、既にコンバートしてしまった SNS が対象になるものではないので、このような SNS への救済措置として openpne:fix-wrong-categorized-community タスクを用意した
openpne:fix-wrong-categorized-community タスクがおこなうこと¶
- OpenPNE 2 の c_commu テーブルのうち、 OpenPNE 3 の community テーブルに移行されていないコミュニティを community テーブルにインポートする
- OpenPNE 2 と同名の中カテゴリ内に存在する同名の小カテゴリに属するコミュニティのみ、 OpenPNE 3 の正しいコミュニティカテゴリに紐付け直す
※タスクの実行中に手動で修復することを選択した場合は、上であげた処理と同等の SQL を画面に出力する。
※OpenPNE 3 からのコンバート後に名前を変更していたり、同じ名前でも属する中カテゴリが異なる小カテゴリについては、カテゴリの紐付け直しはおこなわない
報告元¶
http://sns.openpne.jp/diary/24998から転載
OpenPNE2.12.12から3.4.6へコンバートする際に、 OpenPNE2に存在していた「中カテゴリ」がそのままカテゴリの一種としてコンバートされてしまい、結果としてIDがOpenPNE2とOpenPNE3とではずれてしまう(当方では中カテゴリ一つだったので1づつずれている)。 結果、コミュニティ表示のカテゴリはまったく違うものとなる。 また、OpenPNE2で先頭のIDを持つコミュは消えてしまう (どうやらコンバート時にOpenPNE3用のテーブルにはコンバートされていない様子)
コメントにもバグに関する情報がありましたので追記します。
中カテゴリのコンバートをしないように opUpgradeFrom2ImportCommunityCategoryStrategy.class.php の61行目 $this->conn->execute($newParentSQL.' '.$oldParentSQL, array($parent['c_commu_category_parent_id'])); をコメントアウトしたところ、一応こちらの望むようにコンバートできました。 ただし、中カテゴリが1つのみの環境で行ったので、それ以上ある場合などの動作は不明です。