確認画面その1

まず、確認画面のビューを作ります。 bake で自動生成した、 view.ctp がそのまま使えそうなので、 view.ctp を開いてから「名前を付けて保存」で confirm.ctp を作成します。

今回確認画面はhidden方式でいくので、

<div class="members view">
となっている所の、直下にフォームを作ります。

<?php echo $this->Form->create('Member', array('id'=>'MemberConfirm')); ?>

こんな感じです。 ただの

$this->Form->create('Member');
だけでもいいっちゃいいんですが、そうすると、以下のような add の画面と全く同じ id でフォームタグが生成されてしまうので、
<form id="MemberAddForm" accept-charset="utf-8" method="post" action="/~myname/cake/members/add">
これはなんとなく気持ち悪いので、
array('id'=>'MemberConfirm')
を指定して、確認画面用のフォームの id を指定しておきます。

で、その下に add.ctp のフォーム部分、

<?php
    echo $this->Form->input('email');
    echo $this->Form->input('password');
    echo $this->Form->input('type_id');
    echo $this->Form->input('birthday');
    echo $this->Form->input('img1');
    echo $this->Form->input('img2');
    echo $this->Form->input('Favorite');
?>
をごっそりそのままコピーして貼り付けます。

hidden にするので

array('type'=>'hidden')
を一個一個全部に指定して、一応全体を div で囲んでおきます。 こんな感じになりました。

<div class="members view">
<?php echo $this->Form->create('Member', array('id'=>'MemberConfirm'));?>
<div style="display:none;">
<?php
    echo $this->Form->input('email', array('type'=>'hidden'));
    echo $this->Form->input('password', array('type'=>'hidden'));
    echo $this->Form->input('type_id', array('type'=>'hidden'));
    echo $this->Form->input('birthday', array('type'=>'hidden'));
    echo $this->Form->input('img1', array('type'=>'hidden'));
    echo $this->Form->input('img2', array('type'=>'hidden'));
    echo $this->Form->input('Favorite', array('type'=>'hidden'));
?>
</div>

<h2><?php  __('Member');?></h2>

ただ、アクションとしては同じ add で処理するので、なにかで識別するようにしないと「今は確認画面だ!」というのが分かりません。

ということで、 mode = ‘confirm’ というのを作り出して、これを add.ctp (フォーム入力画面)の方に、 hidden で入れておきます。

add.ctp 側

<div class="members form">
<?php echo $this->Form->create('Member');?>
<div style="display:none;">
    <?php echo $this->Form->hidden('mode', array('value'=>'confirm')); ?>
</div>

    <h2>
        <?php __('Add Member'); ?></h2>

confirm.ctp 側はvalueなしで。以下を追加。

    echo $this->Form->input('mode', array('type'=>'hidden','value'=>''));

これで、

  • add → confirm へは mode = ‘confirm’ で、
  • confirm → complete へは mode = ” で
行く事になります。 最後に、ボタンを追加しておきます。

<div class="submit">
    <?php echo $this->Form->button('戻る', array('id'=>'back')); ?>
</div>
<?php echo $this->Form->end('送信'); ?>

これはどっか適当に下の方に入れておきます。 一応ただの id=”back” ボタンをつけておきます。

あと、view.ctp との違いで、そっちには id がありますが、こっちにはまだ id は決まっていない、存在していないので、以下の id に関する表示部分を削除しておきます。

        <dt<?php if ($i % 2 == 0) echo $class;?>><?php __('Id'); ?></dt>
        <dd<?php if ($i++ % 2 == 0) echo $class;?>>
            <?php echo $member['Member']['id']; ?>
             
        </dd>

同様に、 Created と Modified も要らないので削除しておきます。

        <dt<?php if ($i % 2 == 0) echo $class;?>><?php __('Created'); ?></dt>
        <dd<?php if ($i++ % 2 == 0) echo $class;?>>
            <?php echo $member['Member']['created']; ?>
             
        </dd>
        <dt<?php if ($i % 2 == 0) echo $class;?>><?php __('Modified'); ?></dt>
        <dd<?php if ($i++ % 2 == 0) echo $class;?>>
            <?php echo $member['Member']['modified']; ?>
             
        </dd>

ここでもうそろそろ画面を見たいのでコントローラをいじります。

/app/controllers/members_controller.php を開いて、function add() の以下の部分、

        if (!empty($this->data)) {
            $this->Member->create();
            if ($this->Member->save($this->data)) {
                $this->Session->setFlash(__('The member has been saved', true));
                $this->redirect(array('action' => 'index'));
            } else {
                $this->Session->setFlash(__('The member could not be saved. Please, try again.', true));
            }
        }
この1行目からのif文の中にさらにもう一個if文を入れて、もとからあった部分はelseのあとにつっこみます。

構造としてはこんな感じ。

if (!empty($this->data)) {
    if () {
     
    } else {
    // もとからあった部分
    }
}

で、その新しいif文を以下のようにします。

    function add() {
        if (!empty($this->data)) {
            if ($this->data['Member']['mode'] == 'confirm') {
                $this->Member->set($this->data);
                $this->set('member', $this->data);
                $this->render('confirm');
            } else {
                $this->Member->create();
                if ($this->Member->save($this->data)) {
                    $this->Session->setFlash(__('The member has been saved', true));
                    $this->redirect(array('action' => 'index'));
                } else {
                    $this->Session->setFlash(__('The member could not be saved. Please, try again.', true));
                }
            }
        }

これで確認画面が出るはずなのでブラウザで /members/add を開いて適当に入力して進むと・・・
ぼこぼこにエラーが出てますが、入力したEmailの値とかは表示されてるはずです。
エラーは配列とかの問題だけなので今は気にしなくていいです。