SNSっぽい友達系の処理をつくってみる(CakePHP修行 #39)

SPONSORED LINK

Pocket

さて友達系処理の続き。

■ アソシエーション

そうだった。前回の記事でアソシエーションについて書くのを忘れた。

UsersとFriendsのアソシエーションですが、よくよく考えたら1:nなので$hasManyで定義していきます。

まずはUser側。

var $hasMany = array ('Post',
                      'Friend'=>array('className'=>'Friend',
                                      'conditions' => 'Friend.status = 1',
                                      'foreignKey' => 'user_id'
                                      )
                      );

ここではconditionsを使ってstatus=1のものだけ取り出すようにしてみました(ただ、これがうまく利いていないよう・・・あとで後述しますが)。

で、次にFriend側。

var $belongsTo = array('User' =>
                        array('className' => 'User',
                              'foreignKey' => 'friend_user_id'
                              )
                      );

こちら側から見るとアソシエーションする外部キーはuser_idではなくて、friend_user_idになるので注意・・・でいいんだよね?

こうした下準備を経て次へ移ります。

■ 友達一覧、送った招待状一覧を出す

さて/friends/の画面では友達一覧&送信済み招待状一覧を出すのですが、ここがちょっとわからない。

friends_top.gif

↑ 画面はこれね。

現在のコードはこんな感じ。まずはコントローラー側。

function index() {
  // check login
  $this->_checkLogin();
  // sys message
  $this->set('sys_msg', $this->Session->read('sys_msg'));
  $this->Session->delete('sys_msg');
  // get "my info"
  $me = $this->User->findById_hash($_COOKIE['my_id']);
  $this->set('me', $me);
  $this->pageTitle = 'My Friends';
  // set list
  $this->set('friends', $this->Friend->findAllByUser_id($me['User']['id']));
}

で、View側。

<h3>My Friends</h3>
<ul id="friends" class="clear">
<?php 
foreach ($friends as $friend) { 
  if ($friend['Friend']['status']==1) {
?>
<li><a href="/friends/detail/<?= $friend['User']['id']; ?>"><img src="<?= $friend['User']['pic_loc']; ?>" width="<?= $friend['User']['pic_width']; ?>" height="<?= $friend['User']['pic_height']; ?>" border="0" alt="<?= $friend['User']['name']; ?>" /></a></li>
<?php
  } 
}
?>
</ul>
<h3>Invitations sent</h3>
<ul>
<?php 
foreach ($friends as $friend) { 
  if ($friend['Friend']['status']==0) {
?>
<li><?= $friend['User']['email']; ?> <a href="">[resend!]</a></li>
<?php
  } 
}
?>

これをみるとわかるとおり、とってきた$friendsの配列の中からstatusで分けて表示しています。これってなんかだめな感じだよね?本当はfindActiveFriends()とかを作ったほうがいいのだよね・・・その作り方がいまいちわからない・・・。モデルを拡張するのだと思うのだけど。

うーん、明日考えてみます。と、とりあえず寝る。

※ CakePHP修業は百式管理人がSNSっぽいものをCakePHPで作ろうとして挫折するまでの日記です。前回までのあらすじはこちらへ。

ツイッターもやっています!

SPONSORED LINK

  1. No comments yet.

  1. No trackbacks yet.