たきゃはしです

もう日常ブログにしよう

CakePHP2に対応した XFormHelper を試してみた


けっこう面倒な入力・確認画面の実装が楽チン♪

Cake使いはご存知の「XFormHelper」がCake2に対応したようです。ぱちぱち。
 →フォーム入力画面と確認画面で共通で使えるXFormヘルパーをCakePHP2.0対応しました - @さん

Xformヘルパーは、まったく同じ記述で、フォーム入力画面ではinputタグを出力、確認画面ではPostデータを表示するヘルパーです。これにより、確認画面のViewファイルが入力画面と同じものが使えるようになり工数削減できます。

早速試してみて特に問題は起きませんでしたが、ハマった部分とか勝手な試み(笑)もありますので、そこをコメントしてまとめました。なので、コピペで再現できるようになってます。あと、この記事のソースの90%以上が以下の記事を参考にしています。
 →フォーム入力画面と確認画面で共通で使えるXformHelper

インストールは始めのURLに書いてあるんではしょります。

・コントローラ(ContactsController.php

<?php

class ContactsController extends AppController {

    public $name = 'Contacts';
    public $helpers = array('Xform.Xformjp'); //ここを'Xform.xformjp'とすれば$xformjp(先頭小文字)でオブジェクトが扱える。ハマった。
    public $uses = array('Contact');

    function index() {
        $this->redirect(array('action' => 'send')); //何もないので、入力画面にリダイレクト
    }

    /**
     * 入力画面です。何もありません
     */
    function send() {
        
    }

    /**
     * 確認画面です。
     */
    function send_confirm() {
        $this->params['xformHelperConfirmFlag'] = true; //確認画面であることを宣言
    }

    /**
     * 完了画面です。
     */
    function send_finish() {
        //「戻る」はJavaScriptで制御しているため、これが実行される事はないはず。念のため
        if (isset($this->request->data['back'])) {
            $this->redirect(array('action' => 'send')); 
        }
        //ここで登録メソッドやメール関数を呼んで色々する。
        pr($this->request->data); //送信内容を表示
        $this->render(false); //ビューは用意してないので
    }

}

・モデル(Contact.php

<?php

class Contact extends AppModel {

    public $useTable = false;
    //何も書いてません。バリデーションなどご自由に

}

・ビュー(Contacts/send.ctp)

<?php echo $this->Xformjp->create('Contact', array('action' => 'send_confirm')); ?>

<?php

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

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

・ビュー(Contacts/send_confirm.ctp)

<?php

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

<?php echo $this->Xformjp->create('Contact', array('action' => 'send_finish')); ?>

<?php
//ここのhidden達を一括出力するヘルパーがあるけど、Cake2に対応してるか不明なので直書き
echo $this->Xformjp->hidden('name');
echo $this->Xformjp->hidden('password');
echo $this->Xformjp->hidden('email');
echo $this->Xformjp->hidden('checkbox1');
echo $this->Xformjp->hidden('select1');
?>

<?php echo $this->Xformjp->submit('送信', array('name' => 'finish')); //押せばsend_finishアクションへ ?>
<?php 
// 面倒なのでJavaScriptで戻す。こうすると入力画面に戻っても内容は消えない。
echo $this->Xformjp->submit('戻る', array('name' => 'back', 'onClick' => 'history.back(); return false;')); 
?>
<?php echo $this->Xformjp->end(); ?>

・ビュー

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


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


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

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



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


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


すごく簡潔ですが、以上です。
何か惜しい所があればコメントください。