5 月 07
前回の続きで、cookbookのブログチュートリアルにAuthを追加していくサンプルの続きです。
ここから来た方は、前回の記事から見て下さい。
サンプルのダウンロードはページの下あたりからできます。
修正ファイル2
cake/app/views/posts/index.ctp
PHP
<h1>Blog posts</h1>
<p>
<?php
if($user){
//var_dump($user);
echo "こんにちは".$user['User']['username']."さん<br/>";
echo $html->link("Add Post", "/posts/add");
echo " ";
echo $html->link("logout", "/posts/logout");
}
else{
echo $html->link("Login", "/users/login");
}
?></p>
<table>
<tr>
<th>Id</th>
<th>Title</th>
<th>Created</th>
</tr>
<!-- $post配列をループして、投稿記事の情報を表示 -->
<?php foreach ($posts as $post): ?>
<tr>
<td><?php echo $post['Post']['id']; ?></td>
<td>
<?php echo $html->link($post['Post']['title'],'/posts/view/'.$post['Post']['id']);?>
<?php if($user)echo $html->link(
'Delete',
"/posts/delete/{$post['Post']['id']}",
null,
'Are you sure?'
)?>
<?php if($user)echo $html->link('Edit', '/posts/edit/'.$post['Post']['id']);?>
</td>
<td><?php echo $post['Post']['created']; ?></td>
</tr>
<?php endforeach; ?>
</table>
変更箇所の説明
05行目:$userは、PostsControllerのbeforeFilter()で設定した$this->Auth->user()です。ログインしているときは、$userには値が設定されています。
07行目:$user['User']['username']でログインしたユーザー名が取得できます。
10行目:ログアウト処理は、postsのlogoutアクションを指定するようにします。PostsControllerのbeforeFilter()で設定したlogoutRedirectで設定したリダイレクトを使用するためです。
31行目:このページはログインしていなくても閲覧可能ですが、DeleteやEditはPostsControllerで許可していないため、ログインしていない人にはDeleteとEditをクリックさせない方が親切です。if($user)が真の場合のみDeleteリンクを表示するようにします。
37行目:31行目と同様です。Editリンクをログインしている人にのみ表示します。
サンプルダウンロード
app.zip
5 月 07
cookbookを使用してCakePHPをやってみたももの、Authでつまづいた。
いろいろ調べてサンプルを料理したので、皆さんにおすそわけ。
サンプルのダウンロードは、【PHP】CakePHPでAuthを使用したサンプル(2)の下あたりからできます。
このサンプルでやっていること。
1.Authを使ってユーザーログイン・ログアウトする。
2.ログインしているユーザーのみアクセス許可する。
3.ctpで、ログインしている場合とログインしていない場合で表示を変える。
(ctpで$this->Auth->user()を使えるようにする)
4.ログアウト後に好きなページにリダイレクトさせる。
使用環境
WindowsXP+Apache2.2
PHP5
CakePHP1.2.2.8
サンプルのベースプログラムはcookbookにある、ブログチュートリアルです。
修正ファイル1
cake/app/controllers/posts_controller.php
PHP
<?php
class PostsController extends AppController {
// auth
var $components = array('Auth');
var $name = 'Posts';
function beforeFilter() {
$this->Auth->authError = "ゆるされていません。";
$this->Auth->allow('index','view');
$this->Auth->logoutRedirect = array(Configure::read('Routing.admin') => false, 'controller' => 'posts', 'action' => 'index');//logout後のページ指定
$this->set('user',$this->Auth->user()); // ctpで$userを使えるようにする
}
function index() {
$this->set('posts', $this->Post->find('all'));
}
function view($id = null) {
$this->Post->id = $id;
$this->set('post', $this->Post->read());
}
function add() {
if (!empty($this->data)) {
if ($this->Post->save($this->data)) {
$this->flash('Your post has been saved.','/posts');
}
}
}
function delete($id) {
$this->Post->del($id);
$this->flash('The post with id: '.$id.' has been deleted.', '/posts');
}
function edit($id = null) {
$this->Post->id = $id;
if (empty($this->data)) {
$this->data = $this->Post->read();
} else {
if ($this->Post->save($this->data['Post'])) {
$this->flash('Your post has been updated.','/posts');
}
}
}
function logout() {
$this->Session->setFlash('ログアウトしました。');
$this->redirect($this->Auth->logout());
}
}
?>
修正箇所の説明
04行目:PostsControllerでAuthコンポーネントを使うための宣言です。
08行目:ログインしていないユーザーがアクセスしてきた際に表示するメッセージを指定します。
09行目:ログインしていなくてもアクセス可能なアクションを指定します。
10行目:ログアウト後にリダイレクトさせたいアクションを指定します。ここではpostsのindexにリダイレクトします。
11行目:views/posts/**.ctpファイル内で$userとして$this->Auth->user()が参照可能になります。
43行目:ログアウト処理を追記します。(10行目のlogoutRedirectを有効にするため、ここにlogoutアクションを追加しました。)
次回の投稿では、views/posts/index.ctpを変更します。