プチ感動がおさまる前に

作りたいものは

  • トップ画面
    • ログイン済ユーザと非ログインユーザで表示が異なる
  • ユーザ情報画面
    • ログイン済ユーザ専用


で、作る。
HTMLは


Top.html

<html>
<body>

<p>%message%</p>

<!-- define:IS_LOGINED -->
<p>ようこそ%name%さん</p>
<p><a href="?action=UserData">ユーザ情報</a></p>
<p><a href="?action=Logout">ログアウト</a></p>

<!-- else -->

<form action="./">
<input type="hidden" name="action" value="Login">
<input type="text" name="id">
<input type="password" name="password">
<input type="submit">
</form>
<!-- endif -->

</body>
</html>

UserData.html

<html>
<body>
<p>id : %id%</p>
<p>name : %name%</p>
<p>phone : %phone%</p>
</body>
</html>

LoginRequiredError.html

<html>
<body>
<p>会員専用のページです</p>
</body>
</html>


取り敢えずこれだけテンプレートのHTMLを用意する。



そしてここからがPHP
何もないところから(と言ってもコンポーネントや共通で使うライブラリはある)作る。



まずはトップページの処理。

class Top
{
    var $message;

    function execute(){
    }
}


やることは無いが初期化用の変数だけ設定しておく。
これでトップページが表示可能。


次にログイン処理を作る。

Login.class.php

class Login{
    var $_UserUtils;
    var $_Request;
    var $id;
    var $password;

    function execute(){
        if ($_UserUtils->checkLogin($this->id, $this->password)){
            $this->_Request->add('message', 'ログイン成功');
            return 'success';
        }else{
            $this->_Request->add('message', 'ログイン失敗');
            return 'error';
        }
    }
}

Login.ini

[module]
module = Login

[results]
success = Top
error   = Top


これでログイン処理の完了。
しかしこのままだとログインが成功してもしなくても、ログインフォームが表示されてしまう。



そこで表示の切り替えフィルタを作る。


GlobalFilter.php

class GlobalFilter
{
    var $_UserUtils;
    var $_View;

    var $name;

    function actionFilter(){
        if ($_UserUtils->isLogined()){
            $this->_View->add('IS_LOGINED', true);
            $this->name = $this->_LoginUtils->getName();
        }
    }
}


これでユーザがログイン済かどうかでの切り替え処理が完了。
フィルタで設定した変数も表示に反映される。


そして会員専用ページの作成。


UserData.class.php

class UserData
{
    var $_UserUtils;
    var $id;
    var $name;
    var $phone;

    function execute(){
        $this->id    = $_UserUtils->getId();
        $this->name  = $_UserUtils->getName();
        $this->phone = $_UserUtils->getPhone();
    }

    function checkLoginedUser(){
        if(!$_UserUtils->isLogined()){
            return 'login_required_error';
        }
    }
}

フィルタも同じクラスに作成。規模が大きければ分けたらいいし、それは自由。
このフィルタを使うための設定は

UserData.ini

[module]
module = UserData

[filters]
action1 = UserData.checkLoginedUser

[results]
login_required_error = LoginRequiredError

これでログイン済ユーザ専用ページの完成。




いつも書きながら頭の中の考えが変わるんだけど・・・これ、楽になってるんかな。

そしてこのまま規模が大きくなっても破綻しないんかな。



取り敢えず今後のために現時点ではこんな動き考えててここまで出来ましたよーってことで。