Kohanaで入力→確認→完了までを作ってみた

By | 2008/2/6 水曜日

ユーザーの登録~完了まで。
入力項目は名前とmailアドレス。

guesswork利用した時と似た感じになった。
自分がやりやすいからだと思うのだけど、これ正しいやり方?
CodeIgniter利用しても似た感じになるのかなー。

テンプレートエンジンにPHPTAL使ったのでview系のヘルパーは一切利用してません。

■コントローラ

・/application/controllers/reg.php

<?php defined('SYSPATH') or die('No direct script access.');

class Reg_Controller extends Controller {

  function __construct()
  {
    parent::__construct();

    $this->validation->error_format('{message}');
  }

  function index($status='init')
  {
    $fields = array('username', 'mail', 'mail_confirm');

    $methodName = sprintf('index_%s', $status);
    if (!method_exists($this, $methodName)) {
      throw new Kohana_Exception('status error $status');
    }

    $this->$methodName($fields);
  }

  private function index_init($fields)
  {
    $data = array();
    foreach($fields as $key) {
      $data[$key] = '';
      $data[$key.'_error'] = '';
    }
    $this->ptal->view('reg/index', $data);
  }

  private function index_edit($fields)
  {
    $confirmData = $this->session->get('confirmData');
    $data = array();
    foreach($fields as $key) {
      $data[$key] = $confirmData[$key];
      $data[$key.'_error'] = '';
    }
    $this->ptal->view('reg/index', $data);
  }

  private function index_confirm($fields)
  {
    $data = $this->getInput($fields);

    $rules['username'] = 'required';
    $rules['mail'] = 'required|valid_email';
    $rules['mail_confirm'] = 'required|valid_email|matches[mail]';
    $this->validation->set_rules($rules);

    if ($this->validation->run() == FALSE)
    {
      foreach(array_keys($rules) as $key) {
        $fieldName = $key.'_error';
        $data[$fieldName] = $this->validation->$fieldName;
      }

      // 入力画面
      $this->ptal->view('reg/index', $data);
      return;
    }

    foreach($fields as $name) {
      $confirmData[$name] = $data[$name];
    }

    $this->session->set('confirmData', $confirmData);

    // 確認画面
    $this->ptal->view('reg/confirm', $data);
  }

  function send()
  {
    $confirmData = $this->session->get_once('confirmData');
    if (!$confirmData) {
      url::redirect('/reg');
      return;
    }

    // TODO:DB登録処理

    // TODO:メール送信処理

    $data['mail'] = $confirmData['mail'];

    // 完了画面
    $this->ptal->view('reg/send', $data);
  }

  private function getInput($nameList)
  {
    $data = array();
    foreach($nameList as $name) {
      $data[$name] = $this->input->post($name);
    }

    return $data;
  }

}

■テンプレート

・/application/views/reg/index.html(入力)

<html>
  <head>
    <title>入力画面</title>
  </head>
  <body>
    <!-- ここから上はダミー -->
    <div id="content" metal:define-macro="content">
      <form action="/reg/index/confirm" method="post">
        <table>
          <tr>
            <td class="label">*ユーザー名</td>
            <td class="input"><input tal:attributes="value username" name="username" type="text" /></td>
            <td class="msg" tal:content="username_error"></td>
          </tr>
          <tr>
            <td class="label">*mail</td>
            <td class="input"><input tal:attributes="value mail" name="mail" type="text" /></td>
            <td class="msg" tal:content="mail_error"></td>
          </tr>
          <tr>
            <td class="label">*mail(確認)</td>
            <td class="input"><input tal:attributes="value mail_confirm" name="mail_confirm" type="text" /></td>
            <td class="msg" tal:content="mail_confirm_error"></td>
          </tr>
        </table>
        <input type="submit" value="確認" />
      </form>
    </div>
  <!-- ここから下はダミー -->
  </body>
</html>

・/application/views/reg/confirm.html(確認)

<html>
  <head>
    <title>確認画面</title>
  </head>
  <body><!-- ここから上はダミー -->
<div id="content" metal:define-macro="content">
  <table>
    <tr>
      <td class="label">ユーザー名</td>
      <td class="value" tal:content="username">ユーザー名</td>
    </tr>
    <tr>
      <td class="label">mail</td>
      <td class="value" tal:content="mail">mail</td>
    </tr>
  </table>
  <div>
    <a href="/reg/index/edit/">修正</a>&nbsp;&nbsp;<a href="/reg/send">送信</a>
  </div>
</div>
  <!-- ここから下はダミー -->
  </body>
</html>

・/application/views/reg/send.html(完了)

<html>
  <head>
    <title>完了画面</title>
  </head>
  <body><!-- ここから上はダミー -->
<div id="content" metal:define-macro="content">
  <p><span tal:content="mail">メアド</span>に確認メールを送信しました。</p>
</div>
  <!-- ここから下はダミー -->
  </body>
</html>

Validation便利なんだけどメッセージが英語なんだよね。
日本語対応とかしないとダメだよね。きっと^^;

コメントを残す

メールアドレスが公開されることはありません。