開発メモ,主に補足by子連れ親父プログラマー

2011-09-16

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() {
}
を追加しておきます。
ブラウザで完了画面が表示されることを確認します。

ブログ アーカイブ

このブログを検索

Powered by Blogger.

ラベル

php (17) jQuery (13) OSX (10) MySQL (8) Javascript (7) Postgres (7) port (7) apache (6) Java (3) Smarty (2) html (2) pear (2) FCKEditor (1) XAMPP (1) css (1) git (1) perl (1) ruby (1)

Facebookバナー