初めてのシステムと日記

システムも日記も初めてです。

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


以上が入力フォームまでの部分。