Home > Archives > 2010-11

2010-11

CakePHPのお勉強(#018)

ユーザのホーム画面の変更を行いました。
具体的には以下。

ユーザホーム画面変更

  • ログイン後のURIにユーザIDを付与
  • 処理をTweetsコントローラからUsersコントローラに変更

ホーム画面をUserコントローラに変更するとそのままではユーザのツイートが表示されなくなる(使用するテーブルが変わる)ため、アソシエーションを使用してユーザIDからそのユーザのツイートを取ってくるように処理を変更させました。

ログイン後のURIにユーザIDを付与

cakephpではURIに変数をつけてあげるとコントローラ側からその変数を取得できるので(説明が全然わからないw)、処理自体はそんなに難しい物ではありませんでした。

URI処理に関して


通常は

http://localhost/プロジェクト名/コントローラ名/アクション名

でアクセスしますが、これを

http://localhost/プロジェクト名/コントローラ名/アクション名/変数

としても処理自体は変わらず、さらにアクション側からこの変数を取得することができる。

これができると、例えはログイン時にユーザIDを付与してユーザのホーム画面に飛ばすことができ、そのIDを使ってユーザの情報を取ってこれるため処理が楽になる。

$this->redirect('home')

としていたのを

$this->redirect('home/1')

とすることができるという意味。
アクション側では

function home($id = null) {
  // ホーム画面の処理
}

とすることでユーザ変数が取ってこれる。

処理をTweetsコントローラからUsersコントローラに変更

変更点としては以下になる

  • mypageアクションをTweetsコントローラからUsersコントローラに移動
  • ビューを/views/tweets以下から/views/users以下に移動
  • 各アクションのリダイレクト先を変更
  • ツイートの表示処理方法を変更

ツイートの表示処理方法を変更に関して

mypageアクションをTweetsからUsersに変更すると、DBへのアクセス方法が変わる

今までのままではUsersからtweetsテーブルへのアクセスはできないため、アソシエーションを使用する。


以下、コード

コントローラ

PHPでDIRECTORY_SEPARATORという定数がありますが、CakePHPではDSとして使えるのでそれを使いました。


% vim controllers/users_controller.php
function login() {

  $this->set("page_title", "fake twit");
  $this->set("content_header", "fake twit");
  $this->set("content_footer", "Copyright 2010 kichon fake twit, All Rights Reserved.");

  if (!empty($this->data)) {
    $someone = $this->User->findByEmail($this->data['User']['email']);
    if (!empty($someone) && $someone['User']['passwd'] == $this->data['User']['passwd']) {
      // ユーザIDの取得
      $id = $someone['User']['id'];
      $this->Session->write('myname', $someone['User']['name']);
      // リダイレクト時にユーザIDを付与
      $this->redirect('mypage' . DS . $id);
    } else {
      $this->set('err', 'ユーザ名かパスワードが間違っています。');
    }
  }

}

loginアクションから渡されたユーザIDを使用して$dataにそのユーザの情報を格納する。

% vim controllers/users_controller.php
function mypage($id = null) {

  $this->set("page_title", "fake twit");
  $this->set("content_header", "fake twit");
  $this->set("content_footer", "Copyright 2010 kichon fake twit, All Rights Reserved.");

  $this->_checkSession('myname');
  $data = $this->User->findById($id);
  $this->set('id', $id);
  $this->set('datas', $data);

}

モデル

Userモデルにアソシエーションの設定を行う


% vim models/user.php
<?php

class User extends AppModel {

  public $name = 'User';
  public $hasMany = 'Tweet';

}

ビュー

mypageのテンプレートをviews/tweets以下からviews/usersに移動し、ツイートの表示設定を変更する


% vim views/users/mypage.ctp
<div id="main-content">
  <div id="home-header">
    <div id="tweet-box-title">
      <h2>いまなにしてる?</h2>
    </div>
    <div id="tweet-box">
      <?php echo $form->create('Tweet', array('type' => 'post', 'action' => 'add')); ?>
      <?php echo $form->textarea('Tweet.tweet', array('cols' => 55, 'rows' => 2)); ?>
    </div>
    <div id="tweet-box-button">
      <?php echo $form->end('ツイート'); ?>
    </div>
    <div id="tweets-area">
      <?php if (!empty($datas)): ?>
        <?php foreach ($datas['Tweet'] as $data): ?>
          <p><?php echo $data['tweet']; ?>
        <?php endforeach; ?>
      <?php endif; ?>
    </p></div>
  </div>
</div>
<div id="dashboard">
  <div id="my-prof">
    <div id="my-photo">
      <?php echo $html->image('_sized/sml_kichon.png', array('alt' => 'my-photo')); ?>
    </div>
    <div id="my-name">
      <b>kichon</b>
    </div>
    <div id="my-comment">
      <p>はじめまして。kichonといいます。</p>
    </div>
    <div id="my-id">
      <?php if (!empty($id)): ?>
        <?php echo $id; ?>
      <?php endif; ?>
    </div>
    <div id="signout">
      <?php echo $form->create('User', array('type' => 'post', 'action' => 'logout')); ?>
      <?php echo $form->end('ログアウト'); ?>
    </div>
  </div>
</div>

アソシエーションの表示に関して

Userモデルにアソシエーションの設定をして表示を行うと以下のようになる。

Array
(
    [User] => Array
        (
            [id] => 1
            [name] => kichon
            [email] => kikuchi@gmail.com
            [passwd] => kichon
            [profile] =>
            [created] =>
            [modified] =>
        )

    [Tweet] => Array
        (
            [0] => Array
                (
                    [id] => 1
                    [user_id] => 1
                    [tweet] =>
                    [created] => 2010-11-15 23:15:22
                    [modified] => 2010-11-15 23:15:22
                )

            [1] => Array
                (
                    [id] => 2
                    [user_id] => 1
                    [tweet] => hogehoge
                    [created] => 2010-11-24 18:37:14
                    [modified] => 2010-11-24 18:37:14
                )

            [2] => Array
                (
                    [id] => 3
                    [user_id] => 1
                    [tweet] => hogehoge
                    [created] => 2010-11-26 16:17:25
                    [modified] => 2010-11-26 16:17:25
                )
        )
)

その為、mypageアクションとmypageビューを以下のように設定している。

mypageアクション


$data = $this->User->findById($id);
$this->set('id', $id);
$this->set('datas', $data);

mypageビュー


<?php if (!empty($datas)): ?>
  <?php foreach ($datas['Tweet'] as $data): ?>
    <p><?php echo $data['tweet']; ?>
  <?php endforeach; ?>
<?php endif; ?>

次回は新規登録の部分をもっと進めていこうかなと思います。

CakePHPのお勉強(#017)

では新規登録機能を実装していきます。
まず新規登録に関する流れを書きます。

新規登録に関する手順

1.新規登録ページにアクセス
2.名前、メールアドレス、パスワード、パスワード確認を記入し、新規登録ボタンを押す
3.必要項目が記入されていなければエラーを表示
4.パスワードとパスワード確認に入力した値が違っていればエラーを表示
5.チェックがOKであればメールを送信
6.メールにプロフィール変更ページへのリンクを張る
7.プロフィール情報記入
8.自分のホームページにリダイレクトして完了

メールにプロフィール変更ページのリンクを張って飛ばすところの認証?周りが
よくわかりませんが、気にせず行きます。

新規登録リンク作成

ログインページに新規登録に関するリンクを作成しました。

デザインはあとで調整するとしてとりあえずリンク作成ー。
20101127163640-1

次に新規登録ページを作成しました。

signup

メール処理作成

マニュアルを参考にサンプルをそのまま書いたらいけました。

注意する点としてはコンポーネントの設定を追加してあげなければならないということです。

メール送信処理

・app_controller.phpにメール送信メソッド(_sendNewUserMail)を作成
・users_controller.phpからメール送信メソッドを呼ぶ($this->_sendNewUserMail())
・メールの文面はビューのレイアウトとエレメントから作成する

以下、コードです。

コントローラ

データがなければ新規登録ページを表示

データがあればそれをチェックして、メール送信処理を行う


% vim controllers/users_controller.php
function signup() {

  $this->set("page_title", "fake twit");
  $this->set("content_header", "fake twit");
  $this->set("content_footer", "Copyright 2010 kichon fake twit, All Rights Reserved.");

  $err = Array();

  if (!empty($this->data)) {
    if (empty($this->data['User']['name'])) {
      $err['name'] = 'ユーザ名は必須です.';
    }
    if (empty($this->data['User']['email'])) {
      $err['email'] = 'メールアドレスは必須です.';
    }
    if (empty($this->data['User']['passwd'])) {
      $err['passwd'] = 'パスワードを記入してください.';
    }

    if (!$err) {
      if ($this->data['User']['passwd'] == $this->data['User']['passwdVerify']) {
        // ユーザ登録作業
        $this->_sendNewUserMail();
      } else {
        $err['missmach'] = 'パスワードが異なっています.';
      }
    }
    $this->set('errors', $err);
  }

}

メール送信処理


コンポーネントのところを書きたかったので全部のコードを書きました。

今回はユーザを固定にしていますが、後々ユーザIDを取ってきてユーザごとの処理に変更します。


% vim controllers/app_controller.php
<?php

class AppController extends Controller {

  public $components = array('Email', 'Session');

  function _checkSession() {

    if (!$this->Session->check('myname')) {
      $this->redirect('/users/login');
    }

  }

  function _sendNewUserMail($id = null) {

    //$User = $this->User->read(null, $id);
    $this->Email->to = 'kichon@kichon.net';
    $this->Email->subject = 'Welcome to fake twit';
    $this->Email->replyTo = 'support@kichon.net';
    $this->Email->from = 'Fake Twit App <support @kichon.net>';
    $this->Email->template = 'simple_message';
    $this->Email->sendAs = 'both';
    $this->set('User', 'kichon');
    $this->Email->send();

  }

}

ビュー


% vim views/users/signup.ctp
<div id='signup_form'>
  <?php echo $form->create('User', array('type' => 'post', 'action' => 'signup')); ?>
  <table class='signup_table'>
    <tr>
      <th>username</th>
      <td><?php echo $form->text('User.name', array('size' => 20)); ?></td>
    </tr>
    <tr>
      <th>email</th>
      <td><?php echo $form->text('User.email', array('size' => 20)); ?></td>
    </tr>
    <tr>
      <th>password</th>
      <td><?php echo $form->password('User.passwd', array('size' => 20, 'value' => '')); ?></td>
    </tr>
    <tr>
      <th>password again</th>
      <td><?php echo $form->password('User.passwdVerify', array('size' => 20, 'value' => '')); ?></td>
    </tr>
    <tr>
      <th></th>
      <td><?php echo $form->end('Create my account'); ?></td>
    </tr>
  </table>
</div>
<div id="print_data">
  <?php if (!empty($errors)): ?>
    <?php foreach($errors as $error): ?>
      <?php echo $error; ?><br />
    <?php endforeach; ?>
  <?php endif; ?>
  <?php if (!empty($data)): ?>
    <?php print_r($data); ?>
  <?php endif; ?>
</div>

メール本文

メールの本文はビュー内にtextメールとhtmlメールの両方を作成してあげる。


レイアウト



% vim views/layouts/email/text/default.ctp
<?php echo $content_for_layout; ?>



% vim views/layouts/email/html/default.ctp
< !DOCTYPE HTML PUVLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<html>
  <body>
    <?php echo $content_for_layout; ?>
  </body>
</html>

エレメント



% vim views/elements/email/text/simple_message.ctp
Dear <?php echo $User; ?>
Thank you for interest.



% vim views/elements/email/html/simple_message.ctp
<p>Dear <?php echo $User; ?></p><br />
Thank you for interest.

メールの送信完了画面は今度あげます。
(イーモバイルからだとOP25Bの影響でメールが送れないので。。)

またプロフィール変更などはまた今度書いていきます。

CakePHPのお勉強(#016)

IDEA*IDEAの田口さんのブログを流し読みして、何の機能を実装したいのか、する必要があるのか、何の情報をだす必要があるのかを再度自分の中で考え直してみました。

以下に書きます。(というかツイッターの機能を洗い出したみたいな感じですw)
足りなければ随時追加していきます。
やっぱり自分が作りたい物や機能はできるだけ初期の段階ではっきりさせた方がぶれがすくなくなるなと改めて思いました。あと、デザインもw

ページ/機能一覧

  • xトップページ
    • xログイン機能
    • パスワード忘れ機能
    • 情報保持機能
    • 新規登録
  • xホームページ
    • ツイート機能
    • TL表示
    • プロフィール表示
    • 画像表示
    • 名前表示
    • ツイート数表示
    • フォロー数表示
    • フォローワー数表示
    • ログアウト機能
    • フレンドリンク機能
    • プロフィール変更機能
    • DM機能
    • お気に入り機能
    • お気に入り数表示
  • プロフィールページ
    • ツイート表示
    • プロフィール表示
    • 画像表示
    • ユーザ名表示
    • プロフ表示
    • フォロー、アンフォロー機能
  • 設定変更ページ
    • プロフィール変更機能
    • パスワード変更機能
    • プロフィール画像変更機能
  • 友達検索ページ
    • 検索機能
    • メールで招待

次回は新規登録機能を実装していきます。
でわー。

CakePHPのお勉強(#015)

現在ログイン機能を実装していますが、その中でセッションがでてきたので
そちらのマニュアルをさらりと確認しています。

cakephpのセッション

マニュアルを読んでみてとりあえず、write, read, check, deleteあたりを押さえておけばいいかなと。

挙動

1. “http://localhost/users/index”(/users/index)にアクセス
2. セッションをチェック($this->checkSession())
3-1. セッションがあれば”http://localhost/tweets/mypage”(/tweets/mypage)にリダイレクト
3-2. セッションがなければ”http://localhost/users/login”(/users/login)にリダイレクト

ポイント

1. ログインページにアクセスがあった際にもセッションを確認してあればマイページに飛ばしたかったがそうすると無限ループに陥る為、そこは考え中 (>。<。。

2. セッションのチェックはapp_controller.phpというコントローラを作成し、その中にcheckSession関数を作成。各クラスはAppControllerクラスを継承しているため、$this->checkSession()という使い方ができる。

3. tweetsコントローラはいらないかもしれない。。。アソシエーションとか使ってユーザIDからひもづけてユーザデータ取ってくればうまく行くかな。

コード

app_controller.php


% vim controllers/app_controller.php
<?php

class AppController extends Controller {

  function checkSession() {

    if (!$this->Session->check('myname')) {
      $this->redirect('/users/login');
    }

  }

}

users_controller.phpのindexアクション


% vim controllers/users_controller.php
function index() {

  $this->checkSession('myname');
  $this->redirect('/tweets/mypage');

}

users_controller.phpのloginアクション


% vim controllers/users_controller.php
function login() {

  $this->set("page_title", "fake twit");
  $this->set("content_header", "fake twit");
  $this->set("content_footer", "Copyright 2010 kichon fake twit, All Rights Reserved.");

  if (!empty($this->data)) {
    $someone = $this->User->findByEmail($this->data['User']['email']);
    if (!empty($someone) && $someone['User']['passwd'] == $this->data['User']['passwd']) {
      $this->Session->write('myname', $someone['User']['name']);
      $this->redirect('/tweets/mypage');
    } else {
      $this->set('err', 'ユーザ名かパスワードが間違っています。');
    }
  }
}

ログアウトはセッションを削除してリダイレクトさせた

users_controller.phpのlogoutアクション


% vim controllers/users_controller.php
function logout() {

  $this->set("page_title", "fake twit");
  $this->set("content_header", "fake twit");
  $this->set("content_footer", "Copyright 2010 kichon fake twit, All Rights Reserved.");

  $this->Session->delete('myname');
  $this->flash('signout', '/users/login', 1);

}

次回は・・・
IDEA*IDEAさんブログを読み進んでいきますw

CakePHPのお勉強(#014)

cakephpのアソシエーションに関して見ています。

Home > Archives > 2010-11

Search
Feeds
Meta

Return to page top