CakePHP Система дружбы - PullRequest
       5

CakePHP Система дружбы

0 голосов
/ 14 сентября 2011

Я создаю систему дружбы в CakePHP, которая использует две таблицы: Users и Friends.

Для пользователей (идентификатор, имя пользователя, адрес электронной почты, пароль) и друзей (идентификатор, user_from, user_to, status)

Пользователь просит другого пользователя стать друзьями, и это создает запись в таблице друзей, в которой хранятся оба идентификатора пользователя и устанавливается статус «Запрошено». Пользователь может принять дружбу и статус меняется на «Принят» или отменить дружбу, и запись будет удалена из базы данных.

Пример ссылки на запрос выглядит и может отображаться либо в списке пользователей, либо на странице сведений о пользователе:

<?php echo $this->Html->link('Add as Friend', array('controller'=>'friends','action'=>'add_friend',$user['User']['id'])); ?>

Вопрос 1 , как я могу изменить эту ссылку на ссылку запроса на отмену, если у пользователя есть запрос на него или он уже дружит?

Эта ссылка соответствует следующему методу в контроллере:

function add_friend ( $id )
    {
        if(!empty($this->data))
        {
            $this->Friend->Create();
            if($this->Friend->save($this->data))
            {
                $this->Session->setFlash('Friendship Requested');
                $this->redirect(array('controller'=>'users','action'=>'login'));
            }
        }
    }

Таким образом, мы передаем идентификатор методу, который будет user_to, а затем «user_from» должен быть зарегистрированным в данный момент пользователем и установить статус «Запрошенный». Вопрос 2 как мне это сделать? Также, как я могу запретить пользователю создавать несколько записей, просто вызвав этот метод и отобразив сообщение о том, что вы уже запросили дружбу.

Следующий метод:

function accept_friendship ( $id )
    {
     $this->Session->setFlash('Friendship Accepted');
                $this->redirect(array('controller'=>'friends','action'=>'index'));
            }
        }
    }

Вопрос 3: Но я опять запутался в том, как изменить статус записи и пометить пользователей как друзей при вызове метода. Также необходимо предотвратить повторный вызов этой функции для одной и той же записи.

Последний бит - список друзей для пользователя или другого пользователя:

function users_friends( $id )
{
 $this->set('friends', $this->Friend->find('all'));
}

function my_friends()
{
$this->set('friends', $this->Friend->find('all'));
}

Как вы можете видеть, первый метод требует идентификатор пользователя, которого вы просматриваете, а затем второй метод будет использовать текущий вошедший в систему идентификатор пользователя. Вопрос 4: Как я могу использовать это, чтобы перечислить друзей этого пользователя?

Если кто-то может помочь мне встать на правильный путь, это будет очень ценно, так как я остановился и не уверен, как сделать эти 4 вещи, и попытаться изучить CakePHP как можно лучше, так что я могу помочь, очень признателен. Спасибо

РЕДАКТИРОВАТЬ: мне пришло в голову, что представление со скрытыми полями может быть использовано для хранения информации о запросе на добавление в друзья, которую подтверждает пользователь, но это не идеально, так как это означает отправку пользователя в другое место, когда на самом деле я хочу просто запустить функцию и сразу же выполнить перенаправление. НЕ АЯКС МЫШЬ!

Ответы [ 2 ]

1 голос
/ 14 сентября 2011

Ответ 1 и 2:

function add_friend ( $id )
{
    if(!empty($this->data))
    {
        $this->Friend->Create();
        if($this->Friend->save($this->data))
        {
            $this->Session->setFlash('Friendship Requested');
            $this->redirect(array('controller'=>'users','action'=>'login'));
        }
    }
if(empty($this->data))
    {
        $this->set('friends', $this->Friend->find('all',array('Friend.id'=>$id));
    }
}




<?php 

if($friends['Friend']['status']=="Requested")
{
  echo $this->Html->link('Request Pending', '#'); 
}
else if($friends['Friend']['status']=="Accepted")
{
  echo $this->Html->link('Already Friend', '#');
}
else
{
      echo $this->Html->link('Add as Friend',  array('controller'=>'friends','action'=>'add_friend',$user['User']['id']));
}
?>

Ответ 3 и 4:

 funcrion friendlist($user_id)
 {
$session_user_id = $this->Session->read('Auth.User.id')
if($user_id == $session_user_id )
{
    $user_to = $session_user_id ;
}
else
{
    $user_to = $user_id;
}
$this->Friend->find('all',array('Friend.user_to'=>$user_to,'Friend.status'=>'Accepted')
 }
0 голосов
/ 14 сентября 2011

Ответ 3 выглядит примерно так:

function accept_friendship ( $id ) {
    $this->Friend->id = $id;
    $current_status = $this->Friend->field('status');

    if($current_status=='Requested') {
        $this->Application->saveField('status', 'Accepted');
    }

    $this->Session->setFlash('Friendship Accepted');
    $this->redirect(array('controller'=>'friends','action'=>'index'));
}

По сути получите идентификатор запроса на добавление в друзья, отметьте поле status и, если оно равно Requested, обновите его до Accepted. Таким образом, он будет вызываться только один раз.

А также, чтобы не допустить повторного принятия людьми друга, просто удалите ссылку "Принять", как только она будет принята. Оператор if предотвращает ненужное обновление вашего кода.

Вы также должны установить какое-то предупреждение, чтобы только 1012 * мог accept запросить. В противном случае я мог бы ввести URL yoursite.com/friends/accept_friendship/123 и принять произвольный запрос лиц без какой-либо аутентификации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...