CakePHP1.3で作る会員管理システム(13) checkbox、 戻るボタン、年月セレクト、完了画面
checkbox、 戻るボタン、年月セレクト、完了画面
次に、add.ctp 入力フォームの、Favorite(好きな物)が multiple セレクトになってるのを直します。
日本では複数選択にセレクトなんてほとんど使われないですよね。
こうなっているのを、
echo $this->Form->input('Favorite');こうします。
echo $this->Form->input('Favorite', array('multiple'=>'checkbox', 'label' => '好きな物'));
これでとりあえずチェックボックスになるんですが、
どうも一つのチェックで一行になっているので収まりが悪いです。
横に並べたいですね。
生成されたHTMLを確認すると、以下のようになっています。
<div class="input select"> <label for="FavoriteFavorite">好きな物</label> <input type="hidden" id="FavoriteFavorite" value="" name="data[Favorite][Favorite]"> <div class="checkbox"> <input type="checkbox" id="FavoriteFavorite1" value="1" name="data[Favorite][Favorite][]"> <label for="FavoriteFavorite1">apple</label> </div> <div class="checkbox"> <input type="checkbox" id="FavoriteFavorite2" value="2" name="data[Favorite][Favorite][]"> <label for="FavoriteFavorite2">orange</label> </div> <div class="checkbox"> <input type="checkbox" id="FavoriteFavorite3" value="3" name="data[Favorite][Favorite][]"> <label for="FavoriteFavorite3">grape</label> </div> </div>
チェックボックス一つにつき一つの div で囲まれています。
css を書くのもしんどいので、jQuery で処理することにします。
jQuery をダウロードして解凍しておいてください。
/app/webroot/js 以下に jquery.js としてコピーしておきます。
で、さらに /app/webroot/js 以下に、新規に util.js という名前でファイルを作ります。
中身は、こんな感じで。
$(document).ready(function() { $('div.checkbox').css('display','inline'); $(':checkbox').css('float','none'); });
周りを囲んでいる div を inline 表示に変えて、左に float しているチェックボックスの float を解除しているだけです。
で、 add.ctp の一番上に、
<?php echo $javascript->link(array('jquery','util'), false); ?>を追加します。
さらに、members_controller.php の 上の方に $helpers を追加します。
<?php class MembersController extends AppController { var $name = 'Members'; var $helpers = array('Javascript'); function index() { $this->Member->recursive = 0; $this->set('members', $this->paginate()); }
ブラウザで確認してみると、チェックボックスが横に並んでいます。
これはあくまでその場しのぎの付け焼刃ですので、本来はきちんとデザイナーさんに css を書いてもらいましょう。
ついでなので、さきほどのJavascriptの util.js の $(document).ready(function() {});の中に、以下を追加しておきます。
$('#back').click(function(){ $('#MemberMode').val('back'); $("#MemberConfirm").submit(); });
解説:
1行目:id="back" のボタンをクリックしたら
2行目:id="MemberMode" の valueを "back" にして(hidden で追加した mode の value です)
3行目:id="MemberConfirm" のフォームをサブミットする(確認画面の form です)
confirm.ctp の一行目に以下を追加します。
<?php echo $javascript->link(array('jquery','util'), false); ?>
members_controller.php の前回追加した if ~ else の中に以下の elseif を追加します。{} の中は空でいいです。
if ($this->data['Member']['mode'] == 'confirm') { //・・・ } elseif ($this->data['Member']['mode'] == 'back') { } else { //・・・ }
これで、確認画面から入力画面への「戻る」ボタンが動くようになります。
いろいろエラーが出ているかもしれませんが、たいした問題ではないので気にしないで進みます。
あとは、誕生日の入力フォームが洋風で気に入らないので、変更します。
今こうなってるのを、
echo $form->input('birthday');以下に変更します。
echo $this->Form->input('birthday',array('dateFormat'=>'YMD','maxYear'=>date('Y'),'minYear'=>date('Y')-100,'monthNames'=>false, 'label' => array('text'=>'誕生日')));
最後、一応公開側は完了画面を出すことにするので、「登録されました」みたいな適当なビューを complete.ctp という名前で作っておきます。
<div class="members form"> <h2><?php __('会員登録'); ?></h2> <p>登録されました。</p> </div>
そして、members_controller.php の add アクションの save の後の、
$this->redirect(array('action' => 'index'));となっているのを、
$this->redirect(array('action' => 'complete'));に変更し、さらに、
function complete() { }を追加しておきます。
ブラウザで完了画面が表示されることを確認します。