CakePHP1.3で作る会員管理システム(11) 確認画面その1
確認画面その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の値とかは表示されてるはずです。
エラーは配列とかの問題だけなので今は気にしなくていいです。