Bug(バグ) #1790
完了2.14→3.6beta バージョンアップ後に「参加人数No1コミュニティ」でFatal error
100%
説明
OpenPNE2からOpenPNE3へバージョンアップさせた際、以下のような現象が起こりました。
【バージョンアップ前提条件】
OpenPNE2
OpenPNE-2.14.7.3
を、
OpenPNE3
OpenPNE-3.6beta6
に、以下の手順を元にバージョンアップを行いました。
http://github.com/openpne/OpenPNE3/blob/master/doc/ja/Upgrade_From_2_Guide.txt
【現象】
「ランキング」から「参加人数No1コミュニティ」を見ようとすると白紙のページが表示される
【対応】
DEBUGGINGモードでランキングのページを確認したところ
以下のようなエラーが見られました。
http://sns.example.com/pc_frontend_dev.php/ranking/community
Fatal error: Call to a member function getName() on a non-object in /OPENPNE_DIR/plugins/opRankingPlugin/apps/pc_frontend/modules/ranking/templates/_community.php on line 8
新規で設置したSNSで試したところ、この現象は見られず、ランキングページが正常に表示されました。
サーバ側、もしくは手順に何か足りないものがありますでしょうか?
解決方法を教えてください。
既出の問題でしたらすみません。
Masato Nagasawa さんがほぼ14年前に更新
- プロジェクト を OpenPNE 3 から opRankingPlugin に変更
- 対象バージョン を削除 (
OpenPNE 3.7.0) - [QA]バグ通知済 を いいえ にセット
Masato Nagasawa さんが13年以上前に更新
- ステータス を New(新規) から Accepted(着手) に変更
- 担当者 を Masato Nagasawa にセット
- 対象バージョン を v1.0.1 にセット
コミュニティのランキングは、
メンバーの参加人数から結果を算出していますが、
今回の問題は community_member に存在しない
community_id が含まれていたことによって発生したものと考えられます。
本来であればcommunityが削除される際に
リレーション情報に基づいて community_member のレコードも削除されるはずですが、
何らかの原因によってレコードが残ってしまっていたと考えられます。
ソース上で存在しないコミュニティidの対応は可能なので、対応を行います。
Masato Nagasawa さんが13年以上前に更新
- ステータス を Accepted(着手) から Fixed(完了) に変更
- 進捗率 を 0 から 100 に変更
Minoru Takai さんが約13年前に更新
- ステータス を Fixed(完了) から Pending Review(レビュー待ち) に変更
- 進捗率 を 100 から 50 に変更
OpenPNE-3.6.0 にバンドルするプラグインとして、対応されたチケットをレビューします。
このプラグインはもともと長澤氏(github.com/nothan)の元で管理されていましたが、現在は github.com/tejimaya で管理されています。次のコミットを確認します。 https://github.com/tejimaya/opRankingPlugin/commit/43218a74d4156f632d290442bc39e63359ce4978
Minoru Takai さんが約13年前に更新
- ステータス を Pending Review(レビュー待ち) から Pending Testing(テスト待ち) に変更
- 進捗率 を 50 から 70 に変更
https://github.com/tejimaya/opRankingPlugin/commit/43218a74d4156f632d290442bc39e63359ce4978
この修正についてレビューしました。
- (1) まず、この修正後には、修正前に生じていた Fatal error は解消されていると思われます。
- (2) この修正後には、 Fatal error は解消されていますが、「参加人数No1コミュニティ」で表示されるアイテムについて、順位が飛び飛びになる(1位の次に3位が表示されるなど)可能性があるかもしれません。これは http://redmine.openpne.jp/issues/2310#note-10 で指摘されています。
- (3) !$community->getId() という条件式がありますが、ここで取得している $community に対して getId() の返り値の真偽値を確認している意図がよく分かりません。 Community のオブジェクトが取得できていれば getId() の値は常に取得でき、その値は常に真になるはずです。 http://redmine.openpne.jp/issues/2310#note-8 でも同じ内容に関する指摘がされています。
- しかし、この記述が残ったままであっても、無意味な記述があるだけで動作には影響しません。
- 補足: $community の真偽値が真であることをチェックした後に $community->getId() が真であることをチェックする必要がある場面は、 Community クラスに関して Null Object パターンを採用している場合が考えられます。例えば http://redmine.openpne.jp/issues/1944#note-22 ではそのような記述が有効な場合について記述しています。しかし Null Object パターンを実装している場合でも Null Object かどうかを判断するためのメソッドを記述した方が見通しがよいはずで、 getId() の値を真偽値として扱うのは好ましくないと思います。
関連する問題は #2310 で修正されており、そこでは (1) と (3) が修正されています。このチケットでは (1) のみが修正されています。
#2310 と同じ判断基準でよければ (2) については(仮に問題が発生していても別チケット扱いでよいため)ここでは扱わず、(3) については修正が必須なものではない(無駄な記述があるだけ)と判断できるため、このチケットでの修正内容はこのままで問題なしと判断します。
なお、加えられた修正に関してエンバグしていないかなどをチェックしましたが、このチケットに対する修正として適切かどうかはチェックしていません(妥当そうだというチェックをしたまでです)。場合によっては他にも修正すべき箇所があるといったことがあるかもしれません。バグが直っているかどうかについてはテストのフェーズできちんと確認してください。
レビューOKとします。
Yuma Sakata さんが約13年前に更新
- ステータス を Pending Testing(テスト待ち) から Fixed(完了) に変更
- 進捗率 を 70 から 100 に変更
テストOKです。