kohanaのテスト12-6・・・WordPressのログインページを書く
今日はログインページとログアウトページを書きます。また、トップページはログインするとアドミンバー(画面上部に現れる灰色のメニューバー)が出てくるので、この仕様を追加します。
Auth の定義ファイルを書き換える
昨日作った Auth ドライバに対応して定義ファイルを一行書き換えます。
・kohana/application/config/auth.php
'driver' => 'wplogin',
ビューを書く
WordPress のログインページにアクセスした直後とエラーを発生させた場合のソースを見比べて作戦を立てます。エラーを発生させた状態のソースをゲットしてビューを作ります。スタイルシートのリンクとか修正していきますが、主要な変更部分のみ記載します。
・kohana/application/views/test12/auth/login.php
<div id="login"><h1><a href="http://wordpress.org/" title="Powered by WordPress">WordPress</a></h1> <?php if ($errors): echo '<div id="login_error">' . "\n"; foreach ($errors as $value) { echo "<strong>エラー</strong>: $value<br />"."\n"; } echo '</div>' . "\n"; endif; ?> <form name="loginform" id="loginform" action="" method="post">
コントローラを書く
テスト11で作ったコントローラを改造して作ります。まあ単純な作業なので、特にコメントすることはありません。
・kohana/application/views/test12/auth/login.php
<?php defined('SYSPATH') OR die('No direct access allowed.'); class Controller_Test12_login extends Controller { public function action_index() { if (isset($_POST['user_login'])) { $post = Validation::factory($_POST) ->rule('user_login', 'not_empty') ->rule('user_login', 'max_length', array(':value', 24)) ->rule('user_login', 'regex', array(':value', '/^[a-z0-9_.]++$/iD')) ->rule('user_pass', 'not_empty') ->rule('user_pass', 'min_length', array(':value', 6)) ->rule('user_pass', 'max_length', array(':value', 12)); $posts = $post->data(); $user_login = $posts['user_login']; $user_pass = $posts['user_pass']; $autherror = NULL; if ($post->check()) { $auth = Auth_Wplogin::instance(); $result = $auth->login($user_login, $user_pass); if ($result) { $this->request->redirect('test12'); } $autherror = 'ログイン認証エラーです<br />' . 'ユーザー名とパスワードを確認して下さい'; } $errors = $post->errors('test11'); if ($autherror) $errors[] = $autherror; $user_login = HTML::chars($_POST['user_login']); } else { $user_login = ""; } $this->response->body(View::factory('test12/auth/login') ->bind('user_login', $user_login) ->bind('errors', $errors) ); } } ?>
ログアウト用のページを書く
これはページを描画せずにログアウトしてトップページにリダイレクトします。
・kohana/application/views/test12/auth/logout.php
<?php defined('SYSPATH') OR die('No direct access allowed.'); class Controller_Test12_logout extends Controller { public function action_index() { Auth::instance()->logout(); $this->request->redirect('test12'); } } ?>
トップページを改造する
ユーザーがログイン状態の場合、トップページの HTML にはアドミンバーの記述が追加される仕様になっています。Auth ドライバーでログイン状態の判定をして、出力する HTML を変更するようにコントローラとビューを書き換えます。
前回トップページを作った時は画面の要素ごとにフォルダーを作りましたが、ページが増えていくと訳がわからなくなるので、ページ種別ごとに整理する方針に変更しました。
トップページのコントローラ
Auth ドライバーからログインユーザー名をゲットしています。ログインしていなければ FALSE か NULL だと思います。ログイン状態に応じて HTML の出力を変えている要素に $loginuser を渡しています。
・kohana/application/classes/controller/test12
<?php defined('SYSPATH') OR die('No direct access allowed.'); class Controller_Test12 extends Controller { public function action_index() { $loginuser = Auth_Wplogin::instance()->get_user(); $view = view::factory('test12/test12'); $view->head01 = view::factory('test12/toppage/head01'); $view->head01->loginuser = $loginuser; $view->loginuser = $loginuser; $view->header01 = view::factory('test12/toppage/header01'); $view->primary01 = view::factory('test12/toppage/primary01'); $view->primary01->nav_above = view::factory('test12/toppage/nav_above'); $view->primary01->article01 = view::factory('test12/toppage/article01'); $view->primary01->nav_below = view::factory('test12/toppage/nav_below'); $view->secondary01 = view::factory('test12/toppage/secondary01'); $view->secondary01->search_2 = view::factory('test12/toppage/search_2'); $view->secondary01->recent_posts_2 = view::factory('test12/toppage/recent_posts_2'); $view->secondary01->recent_comments_2 = view::factory('test12/toppage/recent_comments_2'); $view->secondary01->archives_2 = view::factory('test12/toppage/archives_2'); $view->secondary01->categories_2 = view::factory('test12/toppage/categories_2'); $view->secondary01->meta_2 = view::factory('test12/toppage/meta_2'); $view->secondary01->meta_2->loginuser = $loginuser; $view->footer01 = view::factory('test12/toppage/footer01'); $view->adminbar = view::factory('test12/toppage/adminbar'); $view->adminbar->loginuser = $loginuser; $this->response->body($view); } } ?>
トップページのビュー
WordPressのログイン前後のソースを比較するとどうやってアドミンバーを表示しているかが分かります。$loginuser を判定して HTML の出力を制御するように書けば完成です。
ログイン状態によってサイドメニューのリンクも変化します。ログイン後にはログアウトのリンクが表示されますが、この辺りのリンクを適切に書き換えます。下記に部分的な一例を示します。
・kohana/application/views/test12/toppage/meta_2.php
<aside id="meta-2" class="widget widget_meta"><h3 class="widget-title">メタ情報</h3> <ul> <?php if ($loginuser): echo <<<EOT <li><a href="/kohana/test12_admin">サイト管理</a></li> <li><a href="/kohana/test12_logout">ログアウト</a></li>\n EOT; else : echo <<< EOT <li><a href="/kohana/test12_register">登録</a></li> <li><a href="/kohana/test12_login">ログイン</a></li> EOT; endif; ?>
動作試験
以上でトップ画面からユーザー登録→ログイン→ログアウトの仕組みが完成しました。どの画面も WordPress そのものといった感じに仕上がっています。
いよいよ次は新規投稿画面とトップページへの反映に取組みます。