日記投稿系の処理をガツンとつくる(CakePHP修行 #35)

SPONSORED LINK

Pocket

さて続けてCakePHP修行。今度は日記投稿系の処理をつくっちゃいます。とりあえずSNSっぽい友達の日記はおいておいて、自分で投稿したり削除したりできるようにします。

pic_top.gif

↑ 今回はここのメニューをガツンと。

■ モデルの設定

まずはモデルから。今回設定しなくてはいけないのはUserとPostの紐付け。UserとPostは1:Nの関係なので$hasManyなどでアソシエーションを作ります。

まずは/models/user.phpの方。

class User extends AppModel {
  var $name = 'User';
  var $validate = array (
    'email' => VALID_EMAIL,
  );
  var $hasMany = array ('Post');
}

次にPostの方。

class Post extends AppModel {
  var $name = 'Post';
  var $belongsTo = array('User');
}

アソシエーションはもっと細かく設定できるはずですが、今回はざくっとこんな感じで。

■ コントローラー&Viewを作りこんでいく

今回は日記一覧を/posts/(index)、追加・更新系を/posts/add、/posts/edit、/posts/delで作っていきます。簡単、簡単!と思ったのですが最初にはまったのはposts_controller.phpからUserのデータが見えない問題。あれれ、と思いちょっと調べてギブアップ(=青い人と世間話するふりしてちょっとヒントもらう)、結局これが足りませんでした。

  var $uses = array('User','Post');

$usesで設定しておけば、そのコントローラー内から紐づいた形でモデルが参照できるようです。そのあとは普通にロジックを書いていきます。コードは以下。

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 Diaries';
  // set list
  $this->set('posts', $this->Post->findAllByUser_id($me['User']['id']));
}
function view($id) {
  // 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);
  // set list
  $post = $this->Post->findById($id);
  $this->set('post', $post);
  $this->pageTitle = $post['Post']['title'];
  $this->set('owner',$this->User->findById($post['Post']['user_id']));
}
function add() {
  // check login
  $this->_checkLogin();
  // get "my info"
  $me = $this->User->findById_hash($_COOKIE['my_id']);
  $this->set('me', $me);
  // main
  $this->set('error', false);
  if (!empty($this->data)) {
    $this->data['Post']['user_id'] = $me['User']['id'];
    if ($this->Post->save($this->data['Post'])) {
      $this->Session->write('sys_msg', 'Your post has been added.');
      $this->redirect('/posts/');
    }
  }
}
function edit($id = null) {
  // check login
  $this->_checkLogin();
  // get "my info"
  $me = $this->User->findById_hash($_COOKIE['my_id']);
  $this->set('me', $me);
  // main
  $this->set('error', false);
  if (empty($this->data)) {
    $this->Post->id = $id;
    $this->data = $this->Post->read();
  } else {
    $this->data['Post']['user_id'] = $me['User']['id'];
    if (empty($this->data['Post']['title']) || empty($this->data['Post']['body'])) { $this->set('error', true); return false; }
    if ($this->Post->save($this->data['Post'])) {
      $this->Session->write('sys_msg', 'Your post has been updated.');
      $this->redirect('/posts/view/'.$this->data['Post']['id']);
    }
  }
}
function del($id) {
  // check login
  $this->_checkLogin();
  $this->Post->del($id);
  $this->Session->write('sys_msg', 'Your post has been deleted.');
  $this->redirect('/posts/');
}

なんかちょっとリファクタリングしたくなってきましたが、まぁ、こんな感じです。ちなみに自分の日記じゃないと削除や変更できないように権限チェックなどもするべきだと思いますが、まぁ、今はこんな感じです。

■ 動作テスト

テストも完了、ちゃんと動きます。

post_1.gif

↑ リスト画面。一覧が出てきます。

post_2.gif

↑ 変更もできます。

post_3.gif

↑ 削除もできます。

削除の際はhtmlヘルパーを使えば簡単に「Are you sure?」みたいな確認ダイアログを出せて便利。やるなぁ、CakePHP・・・。

さて次は何をするべきか・・・青い人が突っ込みを入れてくれたのでちょっとバグFixというか、細かいところを直したいと思います。

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

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

SPONSORED LINK

  1. No comments yet.

  1. No trackbacks yet.