CakePHP バリデートで入力した値が消えてしまう
バリデートをモデルに作るやり方でも、コントローラーに書いて処理させる、でもよいのですが、エラーになって戻る画面で、せっかく入力した値が消えてしまうと困りますよね。
普通にCakePHPのデフォルトで吐き出すコードで作っていれば、そんなことはないのですが…。
そんな入力した値が保持されない場合は、ビューファイルに初期値を設定していないか確認してみてください。
初期値の設定を外すと治る場合があります。
バリデートをモデルに作るやり方でも、コントローラーに書いて処理させる、でもよいのですが、エラーになって戻る画面で、せっかく入力した値が消えてしまうと困りますよね。
普通にCakePHPのデフォルトで吐き出すコードで作っていれば、そんなことはないのですが…。
そんな入力した値が保持されない場合は、ビューファイルに初期値を設定していないか確認してみてください。
初期値の設定を外すと治る場合があります。
レンタルサーバー等、PHPの設定によってはDB接続時の文字コードを指定したいことがあります。
CakePHPでは、app/config/database.phpで文字コードを以下のように指定することができます。
var $default = array('driver' => 'mysql', 'connect' => 'mysql_connect', 'host' => 'my_host', 'login' => 'my_name', 'password' => 'my_pass', 'database' => 'my_database', 'encoding' => 'utf8', 'prefix' => '');
コントローラーに下記のように記述します。
前回と同じく、wimagesというテーブルのデータを全部取得する、という例です。
例:wimagesというテーブルのデータを取得し、id順に表示する <?php class WimagesController extends AppController { var $name = 'Wimages'; function index() { $this->set('wimages', $this->Wimage->find('all',array('order' => "id"))); } } ?>
下記CakePHPのマニュアルサイトにあるように、
http://book.cakephp.org/2.0/en/core-libraries/logging.html#
コントローラー内に
$this->log('received', LOG_DEBUG);
などと書いておけば
2013-04-01 13:40:47 Debug: received
などと、
/app/tmp/logs/debug.log
に記述されます。
変数を記録したい時は
$this->log('received'.$data, LOG_DEBUG);
などとしておけばOKですが、配列を記録したい時はprint_rの第2引数をtrueにして、画面に出力せずreturnするようにしてからログに保存しましょう。
$debug_data = print_r($data, true); $this->log('received'.$debug_data, LOG_DEBUG);
CakePHPの一覧画面をprettyPoppin.jsのモーダルダイアログ表示する方法です。
add/edit画面などで、モーダルダイアログで一覧画面を表示して項目を選択させることができます。
prettyPoppinでは、タグにrel=”internal”をつけるとポップアップウィンドウ内で画面遷移します。
CakePHPのページングのリンク部分を以下のようにarray(‘rel’ => ‘internal’)を渡すようにすると、ポップアップウィンドウ内でページングさせることができます。
<div class="paging"> <?php echo $this->Paginator->prev('<< ' . __('previous', true), array('rel' => 'internal'), null, array('class'=>'disabled'));?> | <?php echo $this->Paginator->numbers(array('rel' => 'internal'));?> | <?php echo $this->Paginator->next(__('next', true) . ' >>', array('rel' => 'internal'), null, array('class' => 'disabled'));?> </div>
またrel=”close”を付けるとポップアップウィンドウを閉じることができます。
一覧から項目を選択すると閉じるようにするには、以下のようにします。
<td class="actions"> <a rel="close" href="#" onclick="user_id=<?php echo $user['User']['id']; ?>;">選択</a> </td>
ここではonclickでjavascript変数に選択された項目のIDを代入して、コールバック関数で処理できるようにしています。
呼び出し側のコードは例えば、以下の様になります。
<form> <input type="text" id="UserId" > </form> <?php echo $this->Html->link('検索', '/users/popup', array('rel' => 'browse_user')); ?> <script type="text/javascript" charset="utf-8"> user_id = 0; $(document).ready(function(){ $("a[rel^='browse_user']").prettyPopin({ modal : true, width : 800, height: 400, opacity: 0.5, animationSpeed: '0', followScroll: false, loader_path: '<?php echo $this->webroot; ?>/images/prettyPopin/loader.gif', callback: function(){ if(user_id > 0) { $("#UserId").val(user_id);
}
user_id = 0;
} }); </script>
onclickでuser_idに選択された項目IDが格納され、コールバックでinputタグの値を更新します。
prettyPoppin.js
http://www.no-margin-for-errors.com/projects/prettyPopin/