研修(フレームワーク:入力フォーム作成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タグはフォームテンプレートで作成した。非常に簡単に記述できる。
以上が入力フォームまでの部分。