dari88's diary

これから趣味にするプログラミング/PHP/javascript/kohana/CMS/web design/

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 そのものといった感じに仕上がっています。

 いよいよ次は新規投稿画面とトップページへの反映に取組みます。