CakePHPで論理削除するSoft Deletable Behavior1

CakePHPはデフォルトで物理削除です。
データがあったら、そのまま削除してしまうっていう方法ですね。
WindowsでShift+Deleteを押すような感じです。

削除の仕方にはもう1つあって、もう一つが論理削除と言われるもの。
代表的なのだと、『削除フラグ』を用いたものですね。
イメージ的には、ゴミ箱にデータをいれるような感じです。


その論理削除を楽に実現するのがSoft Deletable Behaviorというビヘイビア。
導入する際は[CakePHP] SoftDeletable Behavior で論理削除 – Sun Limited Mt.を参考にするんですが、CakePHPに導入する場合、特にPostgreSQLを用いている場合は調整が必要です。
その調整にかんしてはまた明日にでも。

PHPでprint_rの出力データをファイルに保存する

プログラムを組んでいて、デバッグ時に配列の中身を確認したいなーという時によく使うprint_r。
普通に使うと画面上に構造が綺麗なツリー上で出力されるのですが、場合によってはそれが使えない時もあります。
最近だと、Ajax使っている時にエラーが出るという理由でprint_rが使えないことが多いですね。

「print_rとか使わず、統合開発環境のEclipseとか使ってデバッグモード使えばいいのに」
と言われたりもするのですが、それはそれ。

「使えないから、感と気合いでがんばるしかないのかー」
って数ヶ月間くらい思ってました。
が、ファイルに保存するって手段があるんですよね。
ob_getcontents()がミソです。

ob_start();
print "\$hogehogeのデータ -----------------------\n";
print_r($hogehoge);
$debug_data = ob_get_contents();
ob_end_clean();
$fp = fopen("debug.log", "w");
fwrite($fp, $debug_data);
fclose($fp);

こんな感じでファイルに保存して、生成されたファイルをテキストエディタで開いてデバッグしたりしてます。
使い分けると便利ですよっ。
※ただ、ファイル保存する時はファイルを保存するディレクトリのパーミッションに気をつけてください。

JavascriptでIEかどうかを判別するには?

昨日の記事に書いたなぞのJavascriptの文字列。
知っている人は知っているのですが、[JS]わずか「12文字」でIEを判別するスクリプト – コリスという記事でも紹介されていた、簡単なIE判別方法です。

IE='\v'=='v'
/* ↑これだけでいい */
if (IE) alert('IEです');
簡単な記述なので使いやすくよく使うのですが、私的にネックとなる点が。


覚えづらい、汗
なので、いつもどこかからコピペしております。

MTにSyntaxHighlighterを導入する2

先日のSyntaxHighlighter導入記事のタイトルも変更し、統一しました。


先日導入したSyntaxHighlighterですが、IEでソースコードの領域がなぜか2つ表示されてしまう問題が発生していました。
SyntaxHighlighterのバグなのかと他のサイトをIEで見てみてもおかしくはなかったので、原因はうちのサイト側なんだろうと思ってみてみたところ、どうもonLoadで呼び出すと2枚出力されることが判明。
そのあとうんたらかんたら色々探してみた結果、悪さをしていたのは『mt.js』でした。

mt.jsのファイルを開くと、かなり下の方に

window.onload();
window.onload = function() {};
という部分があるのですが、この処理を行った際にIEではonLoad処理が2回走っていたようです。
Firefoxでは2つで1セットのようなのですが、IEは単体ずつで動くようなのでどっちが正しいのか判らないからとりあえず下を活かす方向で以下のように修正。

IE='\v'=='v'
if (!IE) window.onload();
window.onload = function() {};
これで正しく出力されるようになりました。
またおかしかったりしたら修正しようと思います。

PHPのissetとarray_key_exists

先日の記事で書いたissetの挙動について、実は望む結果を返してくれる関数があります。
issetと異なりこれは配列用の関数なのですが、array_key_existsという関数です。
マニュアルにも、

isset() は NULL 値を持つ配列キーに対して TRUE を返しません。一方、array_key_exists() は TRUE を返します。

とあります。
ですので、この関数を使うと、

$data = aray(
          'a' => 'hoge',
          'b' => NULL
          );
print (array_key_exists('a', $data)) ? "a:TRUE" : "a:FALSE";
print (array_key_exists('b', $data)) ? "b:TRUE" : "b:FALSE";
print (array_key_exists('c', $data)) ? "c:TRUE" : "c:FALSE";
を実行すると、
「a:TRUE」「b:TRUE」「c:FALSE」
が返ってきます。
私はこういう結果を求めていたのですよっ!

ただ、配列用なので配列でない変数には使えないのがネックです。
そういった関数はないのかしら・・・。