プロジェクト

全般

プロフィール

Bug(バグ) #1790

2.14→3.6beta バージョンアップ後に「参加人数No1コミュニティ」でFatal error

Kiwa Sakai13年以上前に追加. 12年以上前に更新.

ステータス:
Fixed(完了)
優先度:
High(高め)
担当者:
対象バージョン:
開始日:
2010-11-17
期日:
進捗率:

100%

3.6 で発生するか:
Yes
[QA]バグ通知済:
はい
3.8 で発生するか:
Unknown (未調査)

説明

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で試したところ、この現象は見られず、ランキングページが正常に表示されました。

サーバ側、もしくは手順に何か足りないものがありますでしょうか?
解決方法を教えてください。

既出の問題でしたらすみません。


関連するチケット

関連している opRankingPlugin - Bug(バグ) #2310: [PATCH] アクセスランキングに退会者が含まれる場合、アクセスランキング画面で Fatal error が発生する Fixed(完了) 2011-07-27

履歴

#1 Kousuke Ebihara13年以上前に更新

  • 3.6 で発生するかYes にセット

#2 Kousuke Ebihara13年以上前に更新

  • 優先度Normal(通常) から High(高め) に変更

#3 Kousuke Ebihara13年以上前に更新

  • 対象バージョンOpenPNE 3.7.0 にセット

#4 Masato Nagasawa13年以上前に更新

  • プロジェクトOpenPNE 3 から opRankingPlugin に変更
  • 対象バージョン を削除 (OpenPNE 3.7.0)
  • [QA]バグ通知済いいえ にセット

#5 Kousuke Ebihara13年以上前に更新

  • [QA]バグ通知済いいえ から はい に変更

#6 Masato Nagasawaほぼ13年前に更新

  • ステータスNew(新規) から Accepted(着手) に変更
  • 担当者Masato Nagasawa にセット
  • 対象バージョンv1.0.1 にセット

コミュニティのランキングは、
メンバーの参加人数から結果を算出していますが、
今回の問題は community_member に存在しない
community_id が含まれていたことによって発生したものと考えられます。
本来であればcommunityが削除される際に
リレーション情報に基づいて community_member のレコードも削除されるはずですが、
何らかの原因によってレコードが残ってしまっていたと考えられます。

ソース上で存在しないコミュニティidの対応は可能なので、対応を行います。

#7 Masato Nagasawaほぼ13年前に更新

  • ステータスAccepted(着手) から Fixed(完了) に変更
  • 進捗率0 から 100 に変更

#8 Minoru Takai12年以上前に更新

  • ステータスFixed(完了) から Pending Review(レビュー待ち) に変更
  • 進捗率100 から 50 に変更

OpenPNE-3.6.0 にバンドルするプラグインとして、対応されたチケットをレビューします。

このプラグインはもともと長澤氏(github.com/nothan)の元で管理されていましたが、現在は github.com/tejimaya で管理されています。次のコミットを確認します。 https://github.com/tejimaya/opRankingPlugin/commit/43218a74d4156f632d290442bc39e63359ce4978

#9 Minoru Takai12年以上前に更新

  • ステータス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とします。

#10 Yuma Sakata12年以上前に更新

  • ステータスPending Testing(テスト待ち) から Fixed(完了) に変更
  • 進捗率70 から 100 に変更

テストOKです。

他の形式にエクスポート: Atom PDF