無知な自分の学びブログ
Amebaでブログを始めよう!
1 | 2 | 3 | 4 | 5 | 最初次のページへ >>

「日記投稿系処理」を作る(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%">&nbsp;</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)

「ログイン情報を保存する」オプションを有効にする(CakePHP1.3修行 #034)

今日の目標


ログインするときに毎回emailとpasswordを
入れるのがめんどいけーその情報を保存する。

チェックボックスをonにすると保存できる感じにする。

クッキーを使う


今までのログイン情報にはセッションを使っていた。

しかし、これだとブラウザを閉じたらその情報を保持してくれない。
それをクッキーを使って保存する。

とりあえず元ブログ通り、setcookieやら$_COOKIEを使ってみる。

DB変更


id_hashというカラムを追加。
コードは元ブログと同じ。
CREATE TABLE users (
id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
id_hash VARCHAR(50),
name VARCHAR(50),
email VARCHAR(255) BINARY NOT NULL UNIQUE,
pwd VARCHAR(255),
pic VARCHAR(255),
profile TEXT,
created DATETIME DEFAULT NULL,
modified DATETIME DEFAULT NULL
);


id_hashには「適当な文字列」「ID」「パスワード」を連結してハッシュ化。

適当な文字列はパスワードに使ったPWD_KEYを使い回すと良くないって
言っとるし、ID_HASHって定数で定義しておく。
define('ID_HASH', 'fghij');


ログイン画面、ロジック変更


まずViewを変更。

今までは上側を使っていたけど、
変な情報が入るので、下側に変更
views/login.ctp
<tr><td width="40%">&nbsp;</td><td><?php echo $form -> input('save', array('type' => 'select', 'multiple' => 'checkbox', 'label' => false, 'div' => false, 'options' => array('save my info?'))); ?></td></tr>
<tr><td width="40%">&nbsp;</td><td><?php echo $form -> checkbox('save', array('label' => false, 'div' => false)); ?>save my info?</td></tr>

次に、users_controller.php内のlogin()を次のように修正。
$someone = $this->User->findByEmail($this->data['User']['email']);
if(!empty($someone['User']['pwd']) && $someone['User']['pwd'] == sha1(PWD_KEY.$this->data['User']['pwd']))
{
if ($this->data['User']['save']) {
setcookie('my_id', $someone['User']['id_hash'], time()+60*60*24*365*5, '/'); // save it for 5 years
} else {
setcookie('my_id', $someone['User']['id_hash'], NULL, '/');
}
if (isset($login_back_url))
{
$this->redirect($login_back_url);
$this->Session->delete('login_back_url');
} else {
$this->redirect('/users/home/');
}
}

これでcookieが保存されるはず!

コントローラー中の処理


以上の処理で「セッション中にUser IDを保持」から
「Cookie中にid_hashを保持」に変わったらしいので
コントローラー内の$meを以下に修正。
$me = $this->User->findById_hash($_COOKIE['my_id']);

ログアウト処理


users_controller.php内のlogout()を以下に修正。
function logout()
{
setcookie('my_id','',time()-60*60,'/');
$this->redirect('/users/home/');
}

これでログアウト処理が終了。

テスト


これでテストをしたら、ログインできず。。。

とりあえず、データベース内のid_hashが空なんで、
そこに値を入れてやる。

そしたらログインできるようになった☆☆

でも、情報の保存ができず。。。

あー、調べてみたけどよくわからんかった。

これはパスして、先に進もう。

次回以降の課題


・cookieの使い方、利用法の勉強
・save my info? が機能しないので、できるように。
(分かる人がいたら教えてください。)


「情報を保存する」オプションを有効にする(CakePHP修行 #34)

デフォルト画像を表示する(CakePHP1.3 #33)

フロフィールのデフォルト画像


写真をアップする前の段階で、
デフォルト画像を表示するようにする。

画像は無料のところから取ってきました。
無知な自分の学びブログ-NoImage

デフォルト画像設定のコード


users_controller.php の home の $this->set('me', $me); の前に
以下のコードを挿入します。

if (empty($me['User']['pic']))
{
$me['User']['pic'] = 'noImage.gif';
}


【元ブログ】
デフォルト画像を用意する(CakePHP修行 #33)

1 | 2 | 3 | 4 | 5 | 最初次のページへ >>