cakephpでfollowとfollower機能実装について

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 2,230

usuallyi

score 36

User、Tweet、Followのテーブルを作成しており、

ユーザー名を検索して、
結果を表示し、

ログインしているusernameを検索として出てきた、User.usernameが、
既にfollowしているならボタンを表示せず、
フォローしていないならfollowボタンを表示、
押したら、followし、表示を非表示にするプログラムを作成してるのですが、
なかな機能実装することができず、困っています。

現在、
UserとTweetをhasManyのアソシエーションにしており、

ビューにて、
ユーザーネームと一番新しいtweetを表示しており、
そこに、followボタンを設置している状況です。

追記しました。
かなり、色々試したので、
コードがひどいと思いますが、
よろしくお願いいたします。

cakephp2.×を仕様しています。

理想は
viewで$data['User']['username']を値として渡せば、
わかる関数を作成し、帰ってきた値で、
このユーザーはfollowしているか、していないか。分かるのが一番理想です。

現在のプログラムだと、
foreach文で、以下のプログラムで
followボタンを表示させています。

その後、コントローラにて、
postされたら、データベースに保存し、
findにリダイレクトで返すプログラムにしているのですが、
下記のプログラムが、リダイレクトした後も、saveし続けており、
$this->Follow->save($this->request->data['Follow'])
データベースには登録しているものの、
確認してみてもfollowボタンが表示されているという状態です。

---contoroller---

public function find($searchname = NULL){
  $this->loadModel('Tweet');
  $this->loadModel('Follow');

  $data=$this->User->find('all',array('conditions' => array('or' => array( array("User.name like '%$searchname%'"),array("User.username like '%$searchname%'")))));

  $follows = $this->Follow->find('all',array('conditions' => array('Follow.follow' => AuthComponent::user('username'))));

  //$da = $this->User->find('all',array('conditions' => array('User.username'=>$follows['follow'])));

  if(empty($data)){
  $this->Session->setFlash('対象のユーザーは見つかりません。');
}
  $this->set('searchname', $searchname);
  $this->set('username',$this->Auth->user());
  $this->set('userdata',$data);
  $this->set('follows',$follows);

if($this->request->is('post')){
    if(isset($this->data['Search']['title'])){
      $search = $this->request->data['Search']['title'];
      $this->redirect(array('action'=>'find', $search));}

    else if($this->Follow->save($this->request->data['Follow'])){
      //$this->requset->deleteAll($data['Follow']);
      $this->redirect(array('action'=>'find', $searchname));}

}
}

--view find.ctp--

<?php echo $searchname; ?>
<?php if($searchname==NULL):?>
検索結果
<?php else: ?>
の検索結果
<?php endif; ?>
 <br/>
<?php
 echo $this->Form->create('Search');
 echo $this->Form->input('title',array('label'=>'')); 
 echo $this->Form->end('検索');
 ?>

ユーザー名や名前で検索<br />
<?php echo $this->Session->flash(); ?>
 <?php 
 foreach ($userdata as $data){
     if(empty($data)):
     echo print(h("データが見つかりませんでした。"));
     else:
    echo $this->HTML->link($data['User']['username'],array('action'=>'mypage'));   
    echo("<br>");
    echo nl2br($data['joinTweet'][0]['tweet']);
    echo("<br>");
    echo($data['joinTweet'][0]['tweettime']);
    echo("<br>");
    //if($follows !=NULL):
    $count = 0;
    foreach ($follows as $searchcheck){

    if(($searchcheck['Follow']['follower']==$data['User']['username'] || ($data['User']['username'] == $username['username']))):
    $count++;
    //if(($searchcheck['Follow']['follower']==$data['User']['username'])):
    else:
    //if($data['User']['username']==$searchcheck['Follow']['follow']):

    endif;

    if($count == 0):
    echo $this->Form->create('Follow');
    echo $this->Form->hidden('follow',array('value'=>$username['username']));
    echo $this->Form->hidden('follower',array('value'=>$data['User']['username']));
     echo $this->Form->end('follow');
     $count++;
    endif;
 }
    echo("<br>");
    endif;
   }
    ?>
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • kunai

    2016/10/05 18:12

    せめて実装されているコードの提示をいただけませんか

    キャンセル

  • kunai

    2016/10/05 18:24

    コードはコードブロックで囲って頂けると可読性がよくなるので助かります。```で囲うだけです

    キャンセル

  • popobot

    2016/10/05 20:55 編集

    具体的にこのコードのどの部分で困っているのでしょうか?
    関数の感じからするとCakephp2ですかね? 必ずバージョンを書いてください。

    キャンセル

回答 2

checkベストアンサー

0

軽く触ってみたコードを貼っておきますので、参考にしてください。
※できれば、これを参考に自分でコードを直したほうがいいかと思います。

  • 自分の環境はModel側がないので、データは捏造しています。最終的にはfindのコメントアウトを外して、データは消してください。あと、Authもないのでその部分もですね。
  • View側では、フォロー済み判定とボタン表示の処理を分けることで、うまく処理できていると思います。また、どのボタンを押されたかは、submitボタンのnameの値を利用するといいと思います。debug出力を参考にしてください。
    Controller側ではその値をもとにsaveかdeleteすればいいと思います
  • もともとのコードでは、Follow.followの値をView側からフォームで取得していましたが、これはよくないので直してください。これでは他のユーザのフォロワーとかを勝手に追加できてしまいます。Controller側で$this->Auth->user()をもとに値を設定してください。

Controller側

public function find($searchname = NULL){
        //$this->loadModel('Tweet');
        //$this->loadModel('Follow');
        //$data=$this->User->find('all',array('conditions' => array('or' => array( array("User.name like '%$searchname%'"),array("User.username like '%$searchname%'")))));
        //$follows = $this->Follow->find('all',array('conditions' => array('Follow.follow' => AuthComponent::user('username'))));
        //$da = $this->User->find('all',array('conditions' => array('User.username'=>$follows['follow'])));
        $data = [
            ['User' => ['username' => 'USER1'], 'joinTweet' => [['tweet' => 'TWEET1', 'tweettime' => '11']]],
            ['User' => ['username' => 'USER2'], 'joinTweet' => [['tweet' => 'TWEET2', 'tweettime' => '22']]],
            ['User' => ['username' => 'USER3'], 'joinTweet' => [['tweet' => 'TWEET3', 'tweettime' => '33']]],
        ];
        $follows = [
            ['Follow' => ['follower' => 'USER1']],
        ];
        $user = ['username' => 'USER3'];

        if(empty($data)){
            $this->Session->setFlash('対象のユーザーは見つかりません。');
        }
        $this->set('searchname', $searchname);
        $this->set('username',$user);
        $this->set('userdata',$data);
        $this->set('follows',$follows);

        debug($this->request->data);
        if($this->request->is('post')) {
            if(isset($this->request->data['Search']['search'])) {
                debug('search');
                $search = $this->request->data['Search']['title'];
                $this->redirect(array('action'=>'find', $search));
            } else if(isset($this->request->data['Follow']['follow'])) {
                debug('follow');
                //$this->Follow->save($this->request->data['Follow']);
            } else if(isset($this->request->data['Follow']['nofollow'])) {
                debug('nofollow');
                //$this->requset->deleteAll($data['Follow']);
            }
            //$this->redirect(array('action'=>'find', $searchname));
        }
    }
}

View側

<?php echo $searchname; ?>
<?php if($searchname==NULL):?>
検索結果
<?php else: ?>
の検索結果
<?php endif; ?>
<br/>
<?php
echo $this->Form->create('Search');
echo $this->Form->input('title',array('label'=>''));
echo $this->Form->submit('検索', ['name' => 'search']);
echo $this->Form->end();
?>

ユーザー名や名前で検索<br />
<?php echo $this->Session->flash(); ?>
<?php
foreach ($userdata as $data){
    if(empty($data)):
        echo print(h("データが見つかりませんでした。"));
    else:
        echo $this->HTML->link($data['User']['username'],array('action'=>'mypage'));
        echo("<br>");
        echo nl2br($data['joinTweet'][0]['tweet']);
        echo("<br>");
        echo($data['joinTweet'][0]['tweettime']);
        echo("<br>");
        //if($follows !=NULL):
        $is_followed = false;
        foreach ($follows as $searchcheck){
            // 自分自身ならスルー
            if($data['User']['username'] == $username['username']) {
            // フォローしていたらフラグを立てる
            } else if($data['User']['username'] == $searchcheck['Follow']['follower']) {
                $is_followed = true;
            }
        }
        if($is_followed) {
            echo $this->Form->create('Follow');
            echo $this->Form->hidden('follower',array('value'=>$data['User']['username']));
            echo $this->Form->submit('unfollow', ['name' => 'unfollow']);
            echo $this->Form->end();
        } else {
            echo $this->Form->create('Follow');
            echo $this->Form->hidden('follower',array('value'=>$data['User']['username']));
            echo $this->Form->submit('follow', ['name' => 'follow']);
            echo $this->Form->end();
        }
        echo("<br>");
    endif;
}

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

ありがとうございました。
cakephpまだ触って、1週間くらいなので、
解答例を出していただいて参考になりました。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/10/06 12:31

    参考になって良かったです。今からやるならcakephp3の方がいい気もしますが...
    ってかベストアンサーをつけてよw

    キャンセル

  • 2016/10/06 16:19

    そうなんですよね....
    cakephp3の方が、機能的に便利なのも多いですよね...

    間違えて、自己解決にしてしまいました.....
    ベストアンサーつけさせていただきました!!
    ありがとうございます!!

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.21%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

同じタグがついた質問を見る