CakePHP バリデートで入力した値が消えてしまう

PHP

CakePHP バリデートで入力した値が消えてしまう

バリデートをモデルに作るやり方でも、コントローラーに書いて処理させる、でもよいのですが、エラーになって戻る画面で、せっかく入力した値が消えてしまうと困りますよね。

普通にCakePHPのデフォルトで吐き出すコードで作っていれば、そんなことはないのですが…。

そんな入力した値が保持されない場合は、ビューファイルに初期値を設定していないか確認してみてください。

初期値の設定を外すと治る場合があります。

CakePHP データベース接続の文字コードを指定する

PHP

レンタルサーバー等、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' => '');

参考
http://book.cakephp.org/ja/view/1531/Cake%E3%81%AE%E3%83%87%E3%83%BC%E3%82%BF%E3%83%99%E3%83%BC%E3%82%B9%E8%A8%AD%E5%AE%9A

CakePHP データの表示順をソートする

PHP

CakePHPで取得したデータを並び替える(ソートする)

コントローラーに下記のように記述します。
前回と同じく、wimagesというテーブルのデータを全部取得する、という例です。

 例:wimagesというテーブルのデータを取得し、id順に表示する
 <?php
 
 class WimagesController extends AppController {
 var $name = 'Wimages';
 
  function index() {
    $this->set('wimages', $this->Wimage->find('all',array('order' => "id")));
 	
   }
  }
 ?>

CakePHP デバッグログで配列を記録

PHP

CakePHP デバッグログで配列を記録

下記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 prettyPopin.jsのポップアップウィンドウ内でページングする

PHP

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/

参考
http://www.hideblog.net/nikkis/show/176/