研修(フレームワーク:入力フォーム作成1)
社内のフレームワーク(ベースはEthna)で入力フォームを作成する。
ディレクトリ構造は以下の通り。
+----app (アプリケーションのスクリプト)
| |
| +----action (アクションスクリプト)
| | |
| | +----Index.php (初期画面アクションスクリプト)
| | |
| | +----Form.php (入力フォームアクションスクリプト)
| | |
| | +----Confirm.php (入力確認スクリプト)
| | |
| | +----Finish.php (終了画面スクリプト)
| |
| +----Controller.php (コントローラ)
| |
| +----manager (アクションマネージャ)
| | |
| | +----UserManager.php (ユーザーマネージャ)
| |
| +----view (ビュースクリプト)
| |
| +----Index.php (初期画面ビュースクリプト)
| |
| +----Form.php (入力フォームビュースクリプト)
| |
| +----Confirm.php (入力確認ビュースクリプト)
| |
| +----Finish.php (終了画面ビュースクリプト)
|
+----template
| |
| +----index.tpl (初期画面テンプレート)
| |
| +----form.tpl (入力フォームテンプレート)
| |
| +----confirm.tpl (入力確認テンプレート)
| |
| +----finish.tpl (終了画面テンプレート)
|
+----htdocs (ウェブサーバ用ファイル)
|
+----index.php
まずはIndex→Formの処理。
htdocs/index.php
<?php
require_once dirname(__FILE__).'/../app/Controller.php'; ← コントローラを読み込む
Controller::main('Controller', 'index'); ← コントローラとアクションクラスを指定
?>
app/action/Index.php
リンク移動だけなので何も処理しなくて良い
<?php
class Form_Index extends ActionForm
{
var $form = array(
);
}
class Action_Index extends ActionClass
{
function prepare()
{
return null;
}
function perform()
{
return 'index';
}
}
?>
app/view/Index.php
リンク移動だけなので何も処理しなくて良い
<?php
class View_Index extends ViewClass
{
function preforward()
{
}
}
?>
app/templates/index.tpl
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>index</title>
</head>
<body bgcolor="#FFFFFF" text="#000000" link="#FF0000" vlink="#FF0000" alink="#FF0000">
<!--タイトル-->
<font size="-1">
キャンペーンに応募してオリジナル携帯ストラップを当てよう!!
</font>
<br />
<a href="?action_form=1"> ←アクションクラスのformにアクセスする
さっそく応募する
</a>
</body>
</html>
これで初期画面から入力フォームへ移動できる。
入力フォームのアクションなど、
app/action/Form.php
<?php
class Form_Form extends ActionForm
{
// 入力フォームの名前指定 属性は名前/必須/必須時エラー/最大文字数/型/フォーム型/変換処理の順
var $form = array(
'lastname' => array(
'name' => '姓',
'required' => true,
'required_error' => '姓を入力してください。',
'max' => 50,
'type' => VAR_TYPE_STRING,
'form_type' => FORM_TYPE_TEXT,
'filter' => 'mbtrim',
),
・
・
・
・
・
'opinion' => array(
'name' => 'ご意見',
'required' => false,
'type' => VAR_TYPE_STRING,
'form_type' => FORM_TYPE_TEXTAREA,
'filter' => 'mbtrim',
),
);
}
class Action_Form extends Elixir_ActionClass
{
function prepare()
{
return null;
}
function perform()
{
return 'form';
}
}
?>
app/action/view/Form.php
<?php
class View_Form extends ViewClass
{
function preforward()
{
// UserManager呼び出し
$um = $this->getManager('user');
// 全都道府県格納
$prefArray = $um->getPrefArray();
$this->af->setApp('prefArray', $prefArray);
}
}
?>
UserManagerはロジック部分の自作クラス、
$umにUserManager
$prefArrayにUsermanagerの全都道府県取得メソッドを入れてる。
app/template/form.tpl
フォーム部分
<!--応募フォーム-->
<form action="<{$script}>" method="POST">
<input type="hidden" name="action_confirm" value="dummy">
<!-- エラーメッセージ -->
<{if count($errors)}>
<{foreach from=$errors item=error}>
<font color="#FF0000"><b><{$error}></b></font><br />
<{/foreach}>
<{/if}>
<{if mb_strlen($app.hobbyError)}>
<font color="#FF0000"><b><{$app.hobbyError}></b></font><br />
<{/if}>
<br>
<div>姓(*):</div>
<div><{form_input name="lastname"}></div>
<div>ご意見:</div>
<div><{form_input name="opinion"}></div>
<br>
<div align="center"><input type="submit" value="確認" name="action_confirm" ></div>
</form>
</body>
</html>
フォームタグのhiddenはアクションクラスへ飛ばすためのもの。
エラー処理は$errorsに未入力や文字種エラーが自動的に格納されるのでそれを表示
inputタグはフォームテンプレートで作成した。非常に簡単に記述できる。
以上が入力フォームまでの部分。