.ログイン
ユーザ名:

パスワード:


パスワード紛失

新規登録

.検索

.メインメニュー

.フォーラムメニュー

.オンライン状況
13 人のユーザが現在オンラインです。 (13 人のユーザが フォーラム を参照しています。)

登録ユーザ: 0
ゲスト: 13

もっと...

.
.リンク集

メイン
   CakePHP ビュー(View)
     確認画面追加でバリデートエラーが表示されなくなった
投稿するにはまず登録を

スレッド表示 | 新しいものから 前のトピック | 次のトピック | 下へ
投稿者 スレッド
masa2
投稿日時: 2009-5-7 20:53
Baker 常連
登録日: 2008-12-27
居住地:
投稿: 46
確認画面追加でバリデートエラーが表示されなくなった
ブログチュートリアルで、add画面とデータ保存の間に「確認画面」を作ったのですが、
「確認画面」を作る前は、add画面で何も入力せずに「Save Post」ボタンを押すと
テキストエリアの下に「This field cannot be left blank」と言うバリデートエラー
メッセージが表示されていました。しかし、「確認画面」作ったら、このバリデート
エラーメッセージが表示されなくなってしまいました。

add画面で何も入力せずに「Save Post」ボタンを押した時、バリデートエラーメッセ
ージがまた表示される様にするには、どの様な工夫が必要なのでしょうか?
アドバイス頂けると助かります。よろしくお願いします。

/app/models/post.php

<?php
class Post extends AppModel
{
    var 
$name 'Post';
    var 
$validate = array(
        
'title' => array(
            
'rule' => array('minLength'1)
        ),
        
'body' => array(
            
'rule' => array('minLength'1)
        )
    );
}
?>



/app/controllers/posts_controller.php

<?php
class PostsController extends AppController {

    var 
$name 'Posts';

    function 
add() {
        if (!empty(
$this->data)) {
            if (
$this->data['Post']['mode'] == 'confirm') {
                
$this->render('confirm');
            } else {
                
$this->Post->create();
                if (
$this->Post->save($this->data)) {
                    
$this->flash('Your post has been saved.','/posts'); 
                }
            } 
        }
    }

}
?>



/app/views/posts/add.ctp

<h1>Add Post</h1>
<?= $form->create('Post'); ?>
    <?= $form->input('title'); ?>
    <?= $form->input('body', array('rows' => '3')); ?>
    <?= $form->hidden('mode', array('value' => 'confirm')); ?>
<?= $form->end('Save Post'); ?>


/app/views/posts/confirm.ctp

<h1>この内容でよろしいですか?</h1>
<?= $form->create('Post', array('action' => 'add', 'type' => 'post')); ?>
    タイトル:<?= h($form->value('Post.title')); ?><br>
              <?= $form->hidden('Post.title'); ?>
    本文:<?= h($form->value('Post.body')); ?><br>
          <?= $form->hidden('Post.body'); ?>
    <?= $form->hidden('mode', array('value' => 'ok')); ?>
<?= $form->end('Save Post'); ?>
<?= $form->button('戻る', array('onclick' => 'history.back()')); ?>
ksz
投稿日時: 2009-5-9 23:15
Baker スタート
登録日: 2009-5-9
居住地:
投稿: 11
Re: 確認画面追加でバリデートエラーが表示されなくなった
バリデーションはモデルのsave前に行われ、エラーの表示はFormHelperのinput()を使用してフォームを出力した場合のみ自動的に行われるので、フォーム送信時に明示的にバリデーションを行い、確認画面に遷移するかどうかを分けると良いと思います。
/app/controllers/posts_controller.php

<?php
class PostsController extends AppController {

    var 
$name 'Posts';

    function 
add() {
        if (!empty(
$this->data)) {
            if (
$this->data['Post']['mode'] == 'confirm') {
                
$this->Post->set($this->data);
                if (
$this->Post->validates()) {
              $this->render('confirm');
           }
            } else {
                
$this->Post->create();
                if (
$this->Post->save($this->data)) {
                    
$this->flash('Your post has been saved.','/posts'); 
                }
            } 
        }
    }
}
?>

masa2
投稿日時: 2009-5-10 1:03
Baker 常連
登録日: 2008-12-27
居住地:
投稿: 46
Re: 確認画面追加でバリデートエラーが表示されなくなった
kszさん、アドバイスありがとうございます。
add画面で何も入力しないで「Save Post」ボタンを押すと、テキストエリアの下にバリデ
ーションエラーメッセージが表示される様になりました。ありがとうございました。

$this->Post->validates()を利用するんだろうなあ。までは試していたのですが、
$this->Post->set($this->data);を記述する所に知恵が回りませんでした。
$this->Post->set($this->data);を記述しなくても、confirm.ctp画面でdata配列変数
の内容が表示されていましたので。

add画面でバリデーションエラーメッセージが表示されなかった問題は解決出来たのです
が、今度は、「確認画面」で入力内容に不備が見付かった際、「戻る」ボタンで
add画面に戻るのですが、add画面に戻ったら、折角入力したデータが消えてしまう様に
なってしまいました。(以前は、入力データが残っており、add画面に表示されていた。)

(この「確認画面」作成の考え方の根本が間違っているのかなあ?)
ksz
投稿日時: 2009-5-10 2:18
Baker スタート
登録日: 2009-5-9
居住地:
投稿: 11
Re: 確認画面追加でバリデートエラーが表示されなくなった
戻るボタンの実装方法は色々あるみたいですが、例えばjavascriptではなくsubmitボタンのvalueで処理を分けるのはどうでしょうか?
submitであればコントローラの$this->dataにフォームの値も入ってくるので。

/app/controllers/posts_controller.php

<?php
class PostsController extends AppController {

    var 
$name 'Posts';

    function 
add() {
        if (!empty(
$this->data)) {
            if (
$this->data['Post']['mode'] == 'confirm') {
                
$this->Post->set($this->data);
                if (
$this->Post->validates()) {
              $this->render('confirm');
           }
            } else {
                if(
$this->data['Post']['submit'] == 'Save Post') {
                    
$this->Post->create();
                    if (
$this->Post->save($this->data)) {
                        
$this->flash('Your post has been saved.','/posts'); 
                    }
                }
            } 
        }
    }
}
?>



/app/views/posts/confirm.ctp

<h1>この内容でよろしいですか?</h1>
<?= $form->create('Post', array('action' => 'add', 'type' => 'post')); ?>
    タイトル:<?= h($form->value('Post.title')); ?><br>
              <?= $form->hidden('Post.title'); ?>
    本文:<?= h($form->value('Post.body')); ?><br>
          <?= $form->hidden('Post.body'); ?>
    <?= $form->hidden('mode', array('value' => 'ok')); ?>
<?= $form->submit('Save Post', array('name' => 'data[Post][submit]')); ?>
<?= $form->submit('戻る', array('name' => 'data[Post][submit]')); ?>
<?= $form->end(); ?>


ただFormHelper的にname属性を直接入れるのはあまり美しくない気がしますですね…orz

参考URL
戻るボタンの実装方法について
masa2
投稿日時: 2009-5-10 13:59
Baker 常連
登録日: 2008-12-27
居住地:
投稿: 46
Re: 確認画面追加でバリデートエラーが表示されなくなった
kszさん、希望通りに動作する「確認画面」が出来ました。ありがとうございました。
バリデーションエラーメッセージは表示されるし、「戻る」ボタンで戻った時も入力データ
が保持されているし、希望通りの動きです。

kszさんのコードをヒントに、data[Post][mode]の変数内容情報で全体を制御する様にし
てみました。

また「戻るボタンの実装方法について」の記事も参考になりました。
http://espion.just-size.jp/archives/06/167174521.html
「戻る」ボタンと「Save Post」ボタンがあった場合、エンターキーを押した時、
「Save Post」ボタンが機能する様にするのは、今後の課題としたいです。

/app/models/post.php

<?php
class Post extends AppModel
{
    var 
$name 'Post';
    var 
$validate = array(
        
'title' => array(
            
'rule' => array('minLength'1)
        ),
        
'body' => array(
            
'rule' => array('minLength'1)
        )
    );
}
?>



/app/controllers/posts_controller.php

<?php
class PostsController extends AppController {

    var 
$name 'Posts';

    function 
add() {
        
//var_dump($_POST);
        
if (!empty($this->data)) {
            if (
$this->data['Post']['mode'] == 'confirm') {
                
$this->Post->set($this->data);
                if (
$this->Post->validates()) {
                    
$this->render('confirm');
                }
            } else {
                if(
$this->data['Post']['mode'] == 'Save Post') {
                    
$this->Post->create();
                    if (
$this->Post->save($this->data)) {
                        
$this->flash('Your post has been saved.','/posts'); 
                    }
                }
            } 
        }
    }

}
?>



/app/views/posts/add.ctp

<h1>Add Post</h1>
<?= $form->create('Post'); ?>
    <?= $form->input('title'); ?>
    <?= $form->input('body', array('rows' => '3')); ?>
    <?= $form->hidden('mode', array('value' => 'confirm')); ?>
<?= $form->end('Save Post'); ?>


/app/views/posts/confirm.ctp

<h1>この内容でよろしいですか?<h1>
<?= $form->create('Post', array('action' => 'add', 'type' => 'post')); ?>
    タイトル:<?= h($form->value('Post.title')); ?><br>
              <?= $form->hidden('Post.title'); ?>
    本文:<?= h($form->value('Post.body')); ?><br>
          <?= $form->hidden('Post.body'); ?>
    <?= $form->submit('戻る', array('name' => 'data[Post][mode]')); ?>
    <?= $form->submit('Save Post', array('name' => 'data[Post][mode]')); ?>
<?= $form->end(); ?>
スレッド表示 | 新しいものから 前のトピック | 次のトピック | トップ

投稿するにはまず登録を
 


. .