Bug(バグ) #1793
完了【不具合報告】フレンドの数が減らない?増える?
0%
説明
http://sns.openpne.jp/diary/25574 より転記
OpenPNE3.4.7 Myhomeと他人のhomeの左下に表示されるフレンドの数が、退会者がいても変わらない。 また、フレンド招待中のメールアドレスを削除したらフレンドの数が増える。 ちなみにフレンドリストの表示は正しいようだ。
Mutsumi Imamura さんが13年以上前に更新
- 優先度 を Normal(通常) から High(高め) に変更
- 対象バージョン を OpenPNE 3.7.0 にセット
Minoru Takai さんが13年以上前に更新
- ステータス を New(新規) から Invalid(無効) に変更
- 優先度 を High(高め) から Normal(通常) に変更
- 3.6 で発生するか を削除 (
Yes)
OpenPNE3.4.7
Myhomeと他人のhomeの左下に表示されるフレンドの数が、退会者がいても変わらない。
また、フレンド招待中のメールアドレスを削除したらフレンドの数が増える。
ちなみにフレンドリストの表示は正しいようだ。
との報告を元に、新規インストールした OpenPNE-3.4.7 を検証しました。
結論¶
報告の問題は再現できず、OpenPNE側の不具合に因る同様の問題が起こりうることも推測できなかった(例えば、2系からのアップグレードを行った3系などで起こりうるか等)。仮に報告のような問題が起こるとしても再現条件等の情報が足りないためこれ以上の検証ができないように思われる。
この検証結果を以て「再現せず」としてクローズします。もしこの問題(あるいはこれに類する問題)が発覚した場合は別チケットで扱うか、このチケットを再オープンしてください。
検証¶
まず、インストールした OpenPNE-3.4.7 にメンバーAでログインし、ブラウザから以下の一般的な操作を行った。
- フレンドを何人か作ったが、表示されるメンバーAのフレンド数は想定通りだった。
- そのフレンドでログインし退会したり、フレンドを強制退会させても、メンバーAのフレンド数は想定通りだった。
- メンバーAから招待状を送ったが、フレンド数の表示には影響しなかった。招待中メールアドレス一覧から招待したアドレスを削除してもフレンド数に影響はなかった。
次に、実装を確認した。
- 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,
- lib/model/doctrine/Member.class.php
81: public function countFriends() 82- { 83- return count(Doctrine::getTable('MemberRelationship')->getFriendMemberIds($this->getId())); 84- }
- 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- }
- 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- }
- 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- }
- 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 であればフレンド数に影響があるが、その状況は新規登録が完了しているものと同じであり招待中とは見做されなくなるため「フレンド招待中のメールアドレスを削除」することはできない。
「フレンド招待中のメールアドレスを削除したらフレンドの数が『増える』」というのは(仮に異常なレコードが存在していたとしても)実装上起こり得ないように思う。