cakephperの日記(CakePHP, Laravel, PHP) Twitter


継続的WebセキュリティテストサービスVAddyを始めました!

2010-02-24

フォーム入力画面と確認画面で共通で使えるXformHelper

Cakephp1.2.6

追記(2010/12/16):

コメントでPHP5.3の動作不具合報告を頂いたので対応しました。報告ありがとうございました。現状、PHP5.2.15, PHP5.3.4で確認し、CakePHPは1.3.6, 1.2.9で確認しました。gitの最新版か、githubにあるダウンロードボタンから0.02というバージョンのコードをダウンロードしてご利用ください。


入力項目が多くなると、確認画面を作るのも時間がかかりますよね、面倒ですし。今までは、確認画面で別途 $form->value使うとか、Postの値をそのまま表示するようにしてたのですが、デザインが入力画面とほぼ同じなのに別に実装するのがなんだかなと思ってました。それに嫌気がさして、フォーム入力画面でも確認画面でも同じメソッドで、フォームタグと値の表示を切り替えるXformHelperを開発しました。

機能は色々つけてあります。大体のメソッドはカバーできてるんじゃないかと思いますが、不具合があれば教えてください。


機能一覧

  • その他の入力画面機能
    • passwordフィールドの値は常に空にする(プロパティの変更で回避可能)
    • 日付関係のセパレータを拡張(プロパティにて、日本語の年月日、時分をセパレータに指定可能)
  • その他の確認画面機能
    • 出力はエスケープ、nl2brを自動でかける(プロパティの変更で回避可能)
    • passwordフィールドは、*****の固定文字列を表示(ただしinput()ではなくpassword()メソッドの利用に限り)
    • checkboxなどの複数選択時は、カンマ区切りで表示(プロパティの変更でカンマ以外も指定可能)
    • 日付関係のセパレータを指定可能(2010年2月24日という表示が可能)

前提

入力画面と確認画面の制御方法は、下記の2パターンあり、どちらかを実行ください。

1. コントローラの確認画面のアクションで、$this->params['xformHelperConfirmFlag'] = true;をセット(バリデーション成功後が望ましい)

2. 確認画面のviewファイルの最初に、$xformjp->confirmScreenFlag = true; とする



使い方

http://github.com/ichikaway/xformHelper/downloads

ここからダウンロード、もしくはgit cloneして設置下さい。

views/helpers/xform.php

views/helpers/xformjp.php

xform.phpが基本的な実装で、xformjpはxformを継承して、プロパティのみ日本語仕様(自分仕様で不要なものは極力false)に変更してます。お好きなほうをご利用下さい。xformjpを自分用に変更しても良いですし、myxform.phpみたいな別のクラスを作るのも良いかと思います。

xformを使ってプロパティのみ変更したい場合は、コントローラからhelpersプロパティで宣言する際に、下記の様に配列引数で指定すれば変更できます。

<?php
    var $helpers = array('Html', 'Form',  
          'xform' => array('changeDatetimeSeparator' =>
                    array(
                        'datefmt' => array(
                            'year' => '',
                            'month' => '',
                            'day' => '',
                            'afterDateTag' => '&nbsp;&nbsp;&nbsp;', //dateとtimeの表示の間に入れる文字列
                            ),
                        'timefmt' => array(
                            'hour' => '',
                            'min' => '',
                            'meridian' => '',
                            )
                        )
                    )
    );

上記のように、引数が多くなると面倒なので、自分はxformjpヘルパーを作りました。

これ以降は、xformjpヘルパーを前提に書きますが、xformヘルパーを利用する場合は全てxformjpをxformに置き換えて頂ければ大丈夫です。


コントローラ設定

<?php

var $helpers = array('Html', 'Form', 'xformjp');

//入力画面アクション
function add(){

}

//確認画面アクション
function add_confirm(){
    //確認画面の表示に切り替える(バリデーション成功後が望ましい)
    $this->params['xformHelperConfirmFlag'] = true;
}

Viewの設定

基本的には、使っているViewの$formを$xformjpに置換するだけで動きます(上記のようにコントローラ側で表示切替をする場合)

自分の場合は、$xformjp::input()関係を切り出してエレメント化して、入力画面用add.ctpと確認画面用add_confonfirm.ctpから同じエレメントを呼んでます。

まずは入力画面用add.ctp

<?php echo $xformjp->create('Modelname', array('action' => 'add_confirm'));?>

<?php
//外部ファイル読み込み
//views/elements/base_input.ctp
echo $this->element("base_input");
?>

<?php echo $xformjp->submit('確認', array('name' => 'confirm_action')); ?>
<?php echo $xformjp->end();?>

次に確認画面用add_confirm.ctp



<?php
//外部ファイル読み込み
//views/elements/base_input.ctp
echo $this->element("base_input");
?>

<?php echo $xformjp->create('Modelname', array('action' => 'add_finish'));?>
ここにHiddenでPostデータを出力 or セッションでPostデータを管理
<?php echo $xformjp->submit('送信', array('name' => 'finish')); ?>
<?php echo $xformjp->submit('戻る', array('name' => 'back')); ?>
<?php echo $xformjp->end();?>

hiddenでデータを一括で書き出す場合は、「よくある確認画面でのhiddenデータの持ち回り ver2」を使うと便利です! その更に改良版のformhiddenヘルパーgithubにあげてあります


最後に、共通で呼んでるエレメント base_input.ctp

今回は、text, password, select, checkboxを利用。

名前
<?php echo $xformjp->input('name'); ?>


パスワード
<?php echo $xformjp->password('password'); ?>


メール
<?php echo $xformjp->input('email'); ?>

<?php if($xformjp->checkConfirmScreen() === false) : // 確認画面では非表示  ?>
<?php echo $xformjp->input('email_conf'); ?>(確認)
<?php endif; ?>



チェックボックス
<?php
echo $xformjp->input('checkbox1',
array(
    'type' => 'select',
    'multiple' => 'checkbox',
    'options' => array('key1' => 'checkテスト', 'key2' => 'checkテスト2'),
    )
);
?>


セレクト
<?php echo $xformjp->input( 'select1' ,
array(
    'type' => 'select',
    'options'=> array('key1' => 'selectテスト', 'key2' => 'selectテスト2'),
    'label' => false,
    'empty' => '', 
    )
); ?>

メールの入力確認などは、確認画面で出力したくないので、$xformjp->checkConfirmScreen()を使って判定しています。falseが返ってきたら入力画面、trueが返ってきたら確認画面なので、これを使えば細かく制御できます。


既存のシステムで利用する場合は、views以下のフォルダのctpファイルで、$formを$xformjpに一括置換すればOK。あとはコントローラにちょっと追記するだけ。viewファイルの文字列一括置換は、例えばLinuxなどの場合であれば、下記のようにするだけです。

cd app/views
find . -type f -name "*.ctp" -exec perl -p -i -e 's/\$xform/\$xformjp/g' {} \;

これで面倒な確認画面がちょっと楽に実装できるようになった! 改良や不具合修正があれば連絡してもらえるとうれしいです。Twitterとかgithubのpullリクエストなどで。

Enjoy!

ななしななし 2010/03/29 13:57 フォーラムからきました。
丁度確認画面系の情報を探していたので参考にさせて頂きます。
ちなみにViewの設定の所にある
add.ctpとadd.confirm.ctpのアクション先って
逆ではないでしょうか。(add_confirmとadd_finishの部分)
ちょっと気になりましたので・・・

cakephpercakephper 2010/03/29 14:13 コメントありがとうございます。

>add.ctpとadd.confirm.ctpのアクション先って
>逆ではないでしょうか。(add_confirmとadd_finishの部分)

逆でした^^; 修整しました。
ご指摘ありがとうございます。使って何か気になった点などありましたら教えて貰えるとうれしいです。

質問です質問です 2010/12/14 17:52 こんにちは。初めての来た者です。
いきなり質問ですみません。

PHP5.2のサーバーでxformHelderを使わせていただいているのですが、PHP5.3のサーバーではCakePHPごと動かなくなってしまいます。(完全な白紙ページが表示される)
なにか対応策や動かすヒントがありますでしょうか?
CakePHPは1.2.9です。

cakephpercakephper 2010/12/16 19:01 php5.3の動作不具合報告ありがとうございました!
原因を特定し、対応をしました。下記より最新版をgitで取得するか、ダウンロードボタンより0.02というバージョンをダウンロードしてご利用ください。
https://github.com/ichikaway/xformHelper

質問者です質問者です 2010/12/17 18:36 う、動いた~!
対応ありがとうございました!
全部標準のFormに書き換えまくるところでした。
本当に助かりました!

xFormHelperは本当に便利で管理画面が作りやすいです。
これからも使わせていただきます。

ありがとうございました!

ななしななし 2012/02/18 22:09 cakephp2.0.5で確認画面を表示したくこの機能を使わせていただいております。
しかし、以下のエラーがでてきてしまいどうすればいいのか困っています。
Warning (4096): Argument 1 passed to FormHelper::__construct() must be an instance of View, none given, called in /Applications/MAMP/htdocs/tsetcake/app/View/Helper/xform.php on line 141 and defined [CORE/Cake/View/Helper/FormHelper.php, line 121]

Notice (8): Undefined variable: View [CORE/Cake/View/Helper/FormHelper.php, line 122]

Warning (4096): Argument 1 passed to Helper::__construct() must be an instance of View, null given, called in /Applications/MAMP/htdocs/tsetcake/lib/Cake/View/Helper/FormHelper.php on line 122 and defined [CORE/Cake/View/Helper.php, line 144]

Notice (8): Trying to get property of non-object [CORE/Cake/View/Helper.php, line 146]

Notice (8): Undefined variable: xformjp [APP/View/Posts/add.ctp, line 1]

大変長くなってしまいましたがよろしくお願いします!

cakephpercakephper 2012/02/22 10:35 >ななしさん
ご指摘ありがとうございます。Cake2にも対応しました。
詳細は下記をご覧ください。
http://d.hatena.ne.jp/cakephper/20120222/1329874432

スパム対策のためのダミーです。もし見えても何も入力しないでください
ゲスト


画像認証