Project

General

Profile

Bug(バグ) #1793

【不具合報告】フレンドの数が減らない?増える?

Added by pnetan   over 10 years ago. Updated almost 10 years ago.

Status:
Invalid(無効)
Priority:
Normal(通常)
Assignee:
Target version:
-
Start date:
2010-11-17
Due date:
% Done:

0%

3.6 で発生するか:
3.8 で発生するか:
Unknown (未調査)

Description

http://sns.openpne.jp/diary/25574 より転記

OpenPNE3.4.7
Myhomeと他人のhomeの左下に表示されるフレンドの数が、退会者がいても変わらない。
また、フレンド招待中のメールアドレスを削除したらフレンドの数が増える。
ちなみにフレンドリストの表示は正しいようだ。

Related issues

Related to OpenPNE 3 - Backport(バックポート) #2309: 【不具合報告】フレンドの数が減らない?増える? Invalid(無効) 2011-07-27

History

#1 Updated by Kousuke Ebihara over 10 years ago

  • 3.6 で発生するか set to Yes

#2 Updated by isao sano over 10 years ago

以下の環境では再現せず。

  • 環境
    Windows XP
    Firefox 3.6.13/IE8
  • バージョン
    3.7.0-dev
    3.6beta8-dev
    3.4.10-dev
    3.0.9-dev

#3 Updated by Mutsumi Imamura almost 10 years ago

  • Priority changed from Normal(通常) to High(高め)
  • Target version set to OpenPNE 3.7.0

#4 Updated by Minoru Takai almost 10 years ago

  • Assignee set to Minoru Takai
  • Target version deleted (OpenPNE 3.7.0)

検証します。

#5 Updated by Minoru Takai almost 10 years ago

  • Status changed from New(新規) to Invalid(無効)
  • Priority changed from High(高め) to Normal(通常)
  • 3.6 で発生するか deleted (Yes)

OpenPNE3.4.7
Myhomeと他人のhomeの左下に表示されるフレンドの数が、退会者がいても変わらない。
また、フレンド招待中のメールアドレスを削除したらフレンドの数が増える。
ちなみにフレンドリストの表示は正しいようだ。

との報告を元に、新規インストールした OpenPNE-3.4.7 を検証しました。

結論

報告の問題は再現できず、OpenPNE側の不具合に因る同様の問題が起こりうることも推測できなかった(例えば、2系からのアップグレードを行った3系などで起こりうるか等)。仮に報告のような問題が起こるとしても再現条件等の情報が足りないためこれ以上の検証ができないように思われる。

この検証結果を以て「再現せず」としてクローズします。もしこの問題(あるいはこれに類する問題)が発覚した場合は別チケットで扱うか、このチケットを再オープンしてください。

検証

まず、インストールした OpenPNE-3.4.7 にメンバーAでログインし、ブラウザから以下の一般的な操作を行った。

  • フレンドを何人か作ったが、表示されるメンバーAのフレンド数は想定通りだった。
  • そのフレンドでログインし退会したり、フレンドを強制退会させても、メンバーAのフレンド数は想定通りだった。
  • メンバーAから招待状を送ったが、フレンド数の表示には影響しなかった。招待中メールアドレス一覧から招待したアドレスを削除してもフレンド数に影響はなかった。

次に、実装を確認した。

  1. apps/pc_frontend/modules/friend/templates/_friendListBox.php
    4-  'list' => $friends,
    5-  'link_to' => 'member/profile?id=',
    6:  'moreInfo' => array(link_to(sprintf('%s(%d)', __('Show all'), $member->countFriends()), 'friend/list?id='.$member->getId())),
    7-  'type' => $sf_data->getRaw('gadget')->getConfig('type'),
    8-  'row' => $row,
    
  2. lib/model/doctrine/Member.class.php
    81:  public function countFriends()
    82-  {
    83-    return count(Doctrine::getTable('MemberRelationship')->getFriendMemberIds($this->getId()));
    84-  }
    
  3. lib/model/doctrine/MemberRelationshipTable.class.php
    47:  public function getFriendMemberIds($memberId)
    48-  {
    49-    $result = array();
    50-
    51-    $friendMemberIds = $this->createQuery()
    52-      ->select('member_id_to')
    53-      ->where('member_id_from = ?', $memberId)
    54-      ->andWhere('is_friend = ?', true)
    55-      ->execute(array(), Doctrine::HYDRATE_ARRAY);
    56-
    57-    $inactiveMemberIds = Doctrine::getTable('Member')->getInactiveMemberIds();
    58-
    59-    foreach ($friendMemberIds as $friend)
    60-    {
    61-      if (!in_array($friend['member_id_to'], $inactiveMemberIds))
    62-      {
    63-        $result[] = $friend['member_id_to'];
    64-      }
    65-    }
    66-
    67-    return $result;
    68-  }
    
  4. lib/model/doctrine/MemberTable.class.php
    50:  public function getInactiveMemberIds()
    51-  {
    52-    $e = opActivateBehavior::getEnabled();
    53-    opActivateBehavior::disable();
    54-
    55-    $members = $this->createQuery()
    56-      ->select('id')
    57-      ->andWhere('is_active = ?', false)
    58-      ->execute(array(), Doctrine::HYDRATE_ARRAY);
    59-
    60-    if ($e)
    61-    {
    62-      opActivateBehavior::enable();
    63-    }
    64-
    65-    $memberIds = array();
    66-    foreach ($members as $member)
    67-    {
    68-      $memberIds[] = $member['id'];
    69-    }
    70-
    71-    return $memberIds;
    72-  }
    
  5. plugins/opAuthMailAddressPlugin/lib/user/opAuthAdapterMailAddress.class.php
    18-class opAuthAdapterMailAddress extends opAuthAdapter
    19-{
    20-  protected $authModuleName = 'opAuthMailAddress';
    21-
    22- /**
    23-  * @see opAuthAdapter::activate()
    24-  */
    25:  public function activate()
    26-  {
    27-    parent::activate();
    28-
    29-    $member = sfContext::getInstance()->getUser()->getMember();
    30-    if ($member)
    31-    {
    32-      if ($token = Doctrine::getTable('MemberConfig')->retrieveByNameAndMemberId('mobile_address_token', $member->getId()))
    33-      {
    34-        $token->delete();
    35-      }
    36-
    37-      if ($token = Doctrine::getTable('MemberConfig')->retrieveByNameAndMemberId('pc_address_token', $member->getId()))
    38-      {
    39-        $token->delete();
    40-      }
    41-    }
    42-
    43-    return $member;
    44-  }
    
  6. lib/user/opAuthAdapter.class.php
    296- /**
    297-  * Activates the member
    298-  */
    299:  public function activate()
    300-  {
    301-    opActivateBehavior::disable();
    302-    $member = sfContext::getInstance()->getUser()->getMember();
    303-    $member->setIsActive(true);
    304-    $result = $member->save();
    305-    opActivateBehavior::enable();
    306-    return $result;
    307-  }
    
  • マイホームで表示されるフレンドリストのフレンド数部分は $member->countFriends() メソッドの結果である。
  • Member::countFriends() メソッドは内部で MemberRelationshipTable::getFriendMemberIds() をコールして、その結果を count() 関数にかけている。
  • MemberRelationshipTable::getFriendMemberIds() では、フレンド関係のメンバーの一覧から isActive が false のメンバーを除いたメンバーリストを返している
    • OpenPNE の opAuthMailAddressPlugin の仕様では、メンバーAがメンバーX(登録前なのでメンバーXというのも変だが)の招待を行った場合、 MemberRelationship テーブルにはお互いがフレンドであるようなレコードが作成され、 Member テーブルには isActive カラム値が false(=0) のレコード(メンバーXのもの)が作成される。

考察

Myhomeと他人のhomeの左下に表示されるフレンドの数が、退会者がいても変わらない。

この問題が生じる不具合は見当たらない。しかしながら、このような表示が行なわれる可能性として、ブラウザのキャッシュや、ファンクションキャッシュ(PHPアクセラレータを使用している場合など)がある場合に、キャッシュが使われていたことが考えられる。

また、フレンド招待中のメールアドレスを削除したらフレンドの数が増える。

現状のソースコードを見る限りは、メンバー登録が完了しない限りは、そのメンバー(招待を受けた仮メンバー)の isActive 値は false であり、 MemberRelationshipTable::getFriendMemberIds() でのメンバーリストに招待中のメンバーは含まれないはずである。

また、仮に招待中のメンバーの isActive 値が true であればフレンド数に影響があるが、その状況は新規登録が完了しているものと同じであり招待中とは見做されなくなるため「フレンド招待中のメールアドレスを削除」することはできない。

「フレンド招待中のメールアドレスを削除したらフレンドの数が『増える』」というのは(仮に異常なレコードが存在していたとしても)実装上起こり得ないように思う。

Also available in: Atom PDF