ユーザーの登録~完了まで。
入力項目は名前と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> <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便利なんだけどメッセージが英語なんだよね。
日本語対応とかしないとダメだよね。きっと^^;