ロゴ
HOME > CakePHP > cakephpでサニタイズした際の改行コードを<br />に変換する-Sanitize::clean

cakephpでサニタイズした際の改行コードを<br />に変換する-Sanitize::clean

2014年10月27日

cakephpでは送信したフォームデータを自動的にサニタイズしてくれるSanitize::cleanが有ります。

SQLを扱うシステムではcakephpに限らずこの手のものは実装しなくてはなりませんが、cakephpから送信されたデータをSanitize::cleanでサニタイズすると改行コードもエスケープしますので、確認画面で入力内容を表示するような仕様だとnl2brを通しても<br />してくれません。

これはエスケープされているので\\nとなっている為ですが、これについて検索すると、コンポーネントに登録したりなど色々な方法が紹介されています。

ただ、たかが改行コードだけの為にコンポーネントを作成したりコアなファイルを修正したりなどは私的に嫌いが有ります。cakephpのアップデートなどの際に、関連ファイルのアップデートがあった場合は再実装→検収が必要になるからです。

str_replaceで変換してしまう

$post = str_replace(array("\\n"),"<br />", $post); 

まぁ単純な文字列置換です。

ちなみにですが、フォーム送信→確認画面→訂正で入力画面に戻る…という処理の際、確認画面上の送信データですが、シリアライズしておくとたくさんの項目があるフォームでも便利です。

/*
 * フォーム名は全てdata[***]とする
 * <input name="data[name]" type="text" id="name" size="35">
 */
if($this->request->isPost()) {
  $post = Sanitize::clean($this->data, array('encode' => true)); //送信データをサニタイズ
  
  switch($type){
  //確認画面 
    case 'check':
      $this->set('s_data', base64_encode(serialize($this->data))); //サニタイズ前のデータをシリアライズ
      $post = str_replace(array("\\n"),"<br />", $post); //サニタイズされた送信データの改行コードを置換
      $this->set('data', $post);
    break;
  //訂正で戻る 
    case 'edit':
      $this->set('data', unserialize(base64_decode($this->data['s_data']))); //シリアライズされたデータを元の変数に戻す
    break;
  //送信
    case 'send':
      //処理
    break;
  }
}
    <form id="form" name="form" method="post" action="<?php echo $this->webroot; ?>">
      <input type="hidden" name="data[s_data]" value="<?php if(isset($s_data)){ echo $s_data; } ?>"> <!-- シリアライズされているので1行で済む -->

3~5程度のフォームならhiddenで書いてもいいですが、大量のフォームやステップで分かれているフォームなどでは便利です。