質問をすることでしか得られない、回答やアドバイスがある。

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

ただいまの
回答率

90.48%

  • PHP

    20812questions

    PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

  • CakePHP

    2355questions

    CakePHPは、PHPで書かれたWebアプリケーション開発用のフレームワークです。 Ruby on Railsの考え方を多く取り入れており、Railsの高速性とPHPの機動性を兼ね備えています。 MVCやORMなどを「規約優先の考え方」で利用するため、コードを書く手間を省くことができます。 外部のライブラリに依存しないので、単体での利用が可能です。

【CakePHP 3.0】ログインユーザーのみの記事投稿を表示させたい

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 269

DaisukeMori

score 64

【前提条件(環境)】
CakePHP 3.0

【現状(今できていること)】
現在SNSの仕組みをCakePHPで構築中でございます。
できていることとして、ログインしたユーザーで記事を投稿し、
その記事を表示させる仕組みは作れました。
ただ別のユーザーでログインしてそのユーザーでも記事は投稿できるのですが、
全ての投稿を表示させることまでしか、どうしてもできません。

【要件(したいこと)】
SNSの個人ページみたいに、ログインユーザーのみの記事だけを表示させたい。
どうやって判定させて実現させていくのかの糸口がつかめず、停滞中で困っております。
誰か詳しい方ご教授いただけないでしょうか?

参考までにビューとコントローラーのコード載せておきます。
イメージ説明

ビュー
src/Template/Contents/index.ctp

<?php
// ログイン認証判定
$user_login_id = $this->request->session()->read('Auth.User.id');
?>
<div class="UsersForm">
    <div class="form">
        <?= $this->Form->create($data,['type'=>'post','url'=>['action'=>'add','type'=>'file']]) ?>
        <legend>今なにしてる?</legend>
            <?= $this->Form->hidden('Contents.user_id',['type'=>'text','value'=>$user_login_id]);?>

            <?= $this->Form->input('Contents.title',['type' => 'text','placeholder'=>'20文字以内でタイトルを入れてね','label' => '']) ?>
            <?= $this->Form->input( 'Contents.body', ['type' => 'textarea','cols' => 10,'rows' => 7,'placeholder'=>'140文字以内でコメントしてね','label' => '' ] ); ?> 
       <?= $this->Form->button('投稿する'); ?>
    <?= $this->Form->end() ?>
    </div>

    <div class="content">
        <?php foreach($data as $obj): ?>
            <div class="post">
                <div class="post_name"><?= h($obj['user']['username']) ?>さんから投稿</div>
                <div class="post_title"><?= h($obj->id) ?> : <?= h($obj->title) ?></div>
                <div class="post_body"><?= h($obj->body) ?></div>
                <?= $this->Form->create(null,['type'=>'post','url'=>['action'=>'delRecord']]) ?>
                <?= $this->Form->hidden('id',['type' => 'text','placeholder'=>'削除した記事のIDを入力','label' => '','value'=>h($obj->id)]) ?>
                <?= $this->Form->submit('削除') ?>
                <?= $this->Form->end() ?>
            </div>
        <?php endforeach; ?>
    </div>

        <div class="paginator">
            <ul class="pagination">
                <?= $this->Paginator->numbers([
                    'before'=>$this->Paginator->first('< 最初').' ',
                    'after'=>' '.$this->Paginator->last('> 最後'),
                    'modulus'=>9,
                    'separator'=>'・'
                ]) ?>
            </ul>
        </div>
</div>
コントローラー
src/Controller/ContentsController.php

<?php
namespace App\Controller;

use App\Controller\AppController;
use Cake\Event\Event;
use Cake\Filesystem\Folder;
use Cake\Filesystem\File;
use RuntimeException;
use Cake\ORM\TableRegistry;
use \Exception;
use Cake\Log\Log;

class ContentsController extends AppController{

    private $users;
    public $paginate = [
        'limit' => 5,
        'order' => [
            'id'=> 'DESC'
        ],
        'contain' => ['Users']
    ];

    public function initialize(){
        parent::initialize();
        $this->users = TableRegistry::get('Users');
        $this->set('header','User/header');
        $this->set('footer','User/footer');
        $this->viewBuilder()->autoLayout(true);
        $this->viewBuilder()->Layout('content');
    }

    public function index(){
        $data = $this->paginate($this->Contents);
        $this->set('data',$data);
        $this->set('count',$data->count());
    }

    public function add(){

        $content = $this->Contents->newEntity();
        if ($this->request->isPost()) {
            $PostData = $this->request->data();
            $content = $this->Contents->patchEntity($content, $PostData);
            if ($this->Contents->save($content)) {
                return $this->redirect(['action' => 'index']);
            }else{
                return $this->redirect(['action' => 'index']);
            }
        }
    }

    public function delRecord(){
        if($this->request->isPost()){
            try{
                $entity = $this->Contents->get($this->request->data['id']);
                $this->Contents->delete($entity);
            }catch(Exception $e){
                Log::write('debug',$e->getMessage());
            }
        }

        $this->redirect(['action' => 'index']);
    }

    // アクセス権限
        public function isAuthorized($user = null){
            $action = $this->request->params['action'];

            if(in_array($action,['index','view'])){
                return true;
            }
            if($user['role'] === 'admin'){
                return true;
            }
            if($user['role'] === 'author'){
                return true;
            }
        }

}    

?>
  • 気になる質問をクリップする

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 1

checkベストアンサー

+1

現在ログインしているユーザが投稿した記事のみを表示ですよね。

DBから記事を取得するときにログインユーザの記事に絞れば良いと思います。

クエリはこのようになると思います。

$query = $this->Contents
->find()
->contain('Users')
->where(['Users.id' => $this->Auth->user('id')]);

$this->paginate($query);

参考
https://book.cakephp.org/3.0/ja/controllers/components/authentication.html#id20

https://book.cakephp.org/3.0/ja/controllers/components/pagination.html#controller-paginate

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2018/05/07 21:00

    ご回答ありがとうございました。
    一度、試作してみます。

    キャンセル

  • 2018/05/07 21:36

    先ほど試してみまして、この方法でログインユーザーのみの記事表示に成功しました。
    無事この要件は達成できました。

    この度はご丁寧にありがとうございました。

    キャンセル

  • 2018/05/07 21:42

    【追記】
    ビューに$dataでsetしていたので、以下のように書き換えさせていただきました。
    $this->paginate($query);
          ↓
    $data = $this->paginate($query); // 記事情報を$dataに代入
    $this->set('data',$data); // それをビューにセット

    キャンセル

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

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

関連した質問

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

  • PHP

    20812questions

    PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

  • CakePHP

    2355questions

    CakePHPは、PHPで書かれたWebアプリケーション開発用のフレームワークです。 Ruby on Railsの考え方を多く取り入れており、Railsの高速性とPHPの機動性を兼ね備えています。 MVCやORMなどを「規約優先の考え方」で利用するため、コードを書く手間を省くことができます。 外部のライブラリに依存しないので、単体での利用が可能です。