「日記投稿系処理」を作る(CakePHP1.3修行 #034-1)
今回の目標
あけましておめでとうございます。
今年も少しずつ更新していきます。
よろしくお願いします!!
ということで、今回は日記の投稿系処理をやっていく。
自分で投稿して、削除してって感じの内容。
モデルの設定
まずモデルの修正。
UserとPostのひも付けをせんといけんのんじゃけど、
User一人に対して、Postは複数存在するけー
$hasManyを設定する。
models/user.php
class User extends AppModel {
public $name = 'User';
public $validate = array (
'email' => VALID_EMAIL,
);
var $hasMany = array ('Post');
}
元ブログでは、public が var になっとる。
これは修正しても大丈夫なんかな??
PHPのバージョンによるものだと思うけー行けると思う。
あと、$validate はエラーが出た。
設定が必要なんだと思うけーとりあえず後回し。
(コメントアウトではずしました。)
次にPostモデルの作成
models/post.php
class Post extends AppModel {
public $name = 'Post';
public $belongsTo = array('User');
}
最後の$belongsToはUserに設定した$hasManyと同様、
DBのひも付けに必要(なんだと思う)。
Postコントローラーの作成
まず、controllers/posts_controller.phpを作成する。
ただし、従来通りの設定だと、DBのPostしか使えないので、
public $uses = array('User', 'Post')を追加しておく。
んで、まず/posts/(index)から作って行こうかと思ったけど、
DBのPostに何も入ってないけー/posts/addから作成。
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 -> setFlash('Your post has been added.');
$this -> redirect('/posts/');
}
} else {
$this -> set('error', true);
}
}
元ブログにある$this -> Session -> writeはうまく機能せんけー
$this -> Session -> setFlashに変更。
(これもちゃんと調べんといけんな。)
んで、views/posts/add.ctpを作成。
<div id="my_page" class="clear" style="border:4px solid #ececec">
<h2><a href="/users/home/"><?php echo h($me['User']['name']); ?></a></h2>
<?php echo $session -> flash(); ?>
<div id="contents">
<div id="menu" class="clear">
<ul>
<li><a href="/cake/users/home">Home</a></li>
<li><a href="/cake/posts/">Diary</a></li>
<li><a href="">Friends</a></li>
<li><a href="/cake/users/edit/">Settings</a></li>
<li><a href="/cake/users/logout/">Logout</a></li>
</ul>
</div><!-- /menu -->
<h3>Diary</h3>
<div id="my_profile" class="clear">
<h3>Change it as you like!</h3>
<?php echo $form -> create('Post', array('type' => 'post')); ?>
<?if ($error): ?>
<div id="sys_msg">"Title" and "So what?" are required.</div>
<? endif; ?>
<table border="0" cellspacing="2" cellpadding="2">
<tr><td width="40%" align="right">Title</td><td><?php echo $form -> input('title', array('size' => 30, 'label' => false, 'div' => false)); ?></td></tr>
<tr><td width="40%" align="right">Say what?</td><td><?php echo $form -> textarea('body', array('cols' => 40, 'rows' => 10)); ?></td></tr>
<tr><td width="40%"> </td><td><?php echo $form -> end('Update now!'); ?></td></tr>
</table>
</div>
</div>
</div>
ここまで作ってみたけど、
Titleがなぜか、textareaで表示される。
んで、からでsubmit押したら、
emptyじゃなくて、何か値が入って空のまま通る。。。
これもとりあえずほっといて先に進もう。。。
って今回は長いのでここで一区切り。
今回の課題
・モデル同士のひも付け方法($hasManyなど)の理解
・モデルの$validateの設定
・$this -> Session -> writeと$this -> Session -> setFlash
・Titleがinputで作成したのに、textareaで表示される。
・未入力でも通るので、TitleとBosyで分けてempty??
日記投稿系の処理をガツンとつくる(CakePHP修行 #35)