ログイン画面を作っていくぞ、と(CakePHP修行 #011)

SPONSORED LINK

Pocket

さてCakePHP。前回までのあらすじはこちら。

» CakePHP修行! アーカイブ | i d e a * i d e a

今回はログイン画面を作っていきます。参考にするのはここらへん。

» CakePHP Manual

■ /app/views/users/login.thtml

まずはログイン画面を作ります。チュートリアルを参考にしながら作りこんでいきます。

前回のモックアップで作った画面のHTMLはこんな感じなのでここにコードを入れこんでいきます(テーブルタグかよー、とか言わないw)。

<form>
<div id="sys_msg">email and password do not match!</div>
<table border="0" cellspacing="2" cellpadding="2">
<tr><td width="40%" align="right">email</td><td><input type="text" size="30" name="email" value="" /></td></tr>
<tr><td width="40%" align="right">password</td><td><input type="password" size="20" name="password" value="" /></td></tr>
<tr><td width="40%">&nbsp;</td><td><input type="checkbox" name="save" value="" /> save my info?</td></tr>
<tr><td width="40%">&nbsp;</td><td><input type="submit" value="Let me in!" /></td></tr>
<tr><td width="40%">&nbsp;</td><td><a href="">forgot your password?</a></td></tr>
</table>
</form>

チュートリアルによれば「$html->url」とか「$html->input」とかいれていけばいいらしい。あまり考えずにやってみます。

<form action="<?php echo $html->url('/users/login'); ?>" method="post">
<?if ($error): ?>
<div id="sys_msg">email and password do not match!</div>
<? endif; ?>
<table border="0" cellspacing="2" cellpadding="2">
<tr><td width="40%" align="right">email</td><td><?php echo $html->input('User/email', array('size' => 30)); ?></td></tr>
<tr><td width="40%" align="right">password</td><td><?php echo $html->input('User/pwd', array('size' => 20)); ?></td></tr>
<tr><td width="40%">&nbsp;</td><td><input type="checkbox" name="save" value="" /> save my info?</td></tr>
<tr><td width="40%">&nbsp;</td><td><?php echo $html->submit('Let me in!'); ?></td></tr>
<tr><td width="40%">&nbsp;</td><td><a href="">forgot your password?</a></td></tr>
</table>
</form>

うーん、と。「save my info?」のところをどう処理したらいいかわかりません。checkboxの表現もわからなければ、データとしてどう持つべきかもよくわかりません。そういうときは「ザ・後回し!」。とりあえずチェックボックスだけ表示させておいて機能はあとで作るようにします。

■ /app/controllers/users_controller.php

次にControllerでlogin()を作ります。チュートリアルをコピーして適宜変えてみます。長くなるのでコード内のコメントは削除。

<?php
class UsersController extends AppController
{
  function login()
  {
    $this->set('error', false);
    if (!empty($this->data))
    {
      $someone = $this->User->findByEmail($this->data['User']['email']);
      if(!empty($someone['User']['pwd']) && $someone['User']['pwd'] == $this->data['User']['pwd'])
      {
        $this->Session->write('User', $someone['User']);
        $this->redirect('/');
      }
      else
      {
        $this->set('error', true);
      }
    }
  }
  function logout()
  {
    $this->Session->delete('User');
    $this->redirect('/');
  }
}
?>

えーと、これはこれでいいのかな。リダイレクト先をどうすべきかがいまいちわからん。あとpwdはまんまで比較しているのでいまいちですね。これはあとでやることにしましょう。

■ /app/app_controller.php

さて次はセッションをチェックして、ログインしていなかったらログイン画面に飛ばすロジックを作成(かな?)。

<?php
class AppController extends Controller
{
  function checkSession()
  {
    if (!$this->Session->check('User'))
    {
      $this->redirect('/users/login');
      exit();
    }
  }
}
?>

■ /app/controllers/users_controllers.php

そんでもって、User関係のすべてのアクションの前にこのセッションチェックをしてみましょう。

<?php
class UsersController extends AppController
{
  function beforeFilter()
  {
    $this->checkSession();
  }
}

■ テスト!

さて、ここまで出来たらテストです!おもむろに http://www.codexcode.com/users/ にアクセス!

code_error.gif

↑ キターーーーーーーーーーーーーーーーーーーー・・・じゃねー、キテネェ・・・。

しかし http://www.codexcode.com/users/login にはリダイレクトされていますね。/app/views/users/login.thtml があればアクセスできんじゃねぇの?と思うのですが・・・。

しかもエラーメッセージがリダイレクト関係の変なメッセージなのが気になります。

うーん。眠いから寝る。

ツイッターもやっています!

SPONSORED LINK

  1. Re: CakePHP修行 #011 無限リダイレクトに気をつけろ

    ログイン画面を作っていくぞ、と(CakePHP修行 #011) | i d e a * i d e aで、ブラウザのエラー画面が出たところで作業が終了しま…

  1. April 8th, 2009