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 "&nbsp;&nbsp;&nbsp;&nbsp;";
	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を変更します。