PHPのSmartyでゼロパディングする

こんばんはっ
少し前は春がもうきたのかと思うほど暑くなったのに、また寒くなりましたね。
そして雨がつづいて、あんにゅいな気分です、あんにゅい。

最近、仕事でCakePHP+Smartyの組み合わせでやっているのですが、連番のゼロ埋め5桁のIDーみたいなのをする時、初めはPHP側でガリガリやってました。
でもふと、
「Smartyにそういう機能ないのかなぁ」
と思ったら、ありました。

続きを読む

CakePHPで論理削除するSoft Deletable Behavior3

『おにぎり家一粒』というお店を知っていますか?
関西にしかないのですが、その名のとおり、おにぎりを売っているお店です。

おにぎりとはいえ、あなどってはいけませんよっ。
注文が入ってから握ってくれるおにぎりはホクホクで、べちょっとしてることはありません。
塩と海苔もとても風味がよく、
「おにぎりってこんなに美味しかったのかー!」
って思えます。

関西に住んでいる人は、一度は食べてみるといいと思います。





本題なのですが、先日記事にしたSoft Deletable Behavior。
CakePHPで論理削除するSoft Deletable Behavior1

CakePHPで論理削除するSoft Deletable Behavior2

既にとあるシステムで積んでいるんですが、ぶっちゃけると、今後も使うにはちょっとなぁという感じです。
理由はいくつかあって、

1.削除する際、削除日時以外にも任意のパラメータを登録したいけど、それが出来ない。
2.削除に成功したかどうかが判らないので、別口でSELECTして削除されているかどうかを確認しないといけない。


というところですね。
1に関しては、たとえば削除する前にsaveで削除者を登録すればいいんですが、それならその時に削除日時と削除フラグも登録してしまう方がスマートです。

2に関しては、「きっと削除されているさ♪」なんてのはシステムの欠陥になりかねないので、削除されているかどうかははっきりしていないとマズイです。
なので別口で確認するのですが、わざわざ別口で確認しないといけないのがスマートじゃないです。
UPDATEする時にわかるはずの項目なのに。


という感じですので、記事にして紹介はしましたが、
あまりオススメしません。

CakePHPで論理削除するSoft Deletable Behavior2

最近朝方は冷え込んできました。
私も朝はミノムシのように毛布にくるまっております。


さて、昨日の記事で紹介したSoft Deletable Behaviorですが、[CakePHP] SoftDeletable Behavior で論理削除 – Sun Limited Mt.を参考にそのままやると、特にPostgreSQLの場合にいくつか問題があります。

TINYINTという型がPostgreSQLは対応していないです。
削除フラグなのでINT型にするというのも変なので、BOOL型に変更しようかと思います。
soft_deletable.phpを開き、

$attributes['field'] => 1
 ↓
$attributes['field'] => true
$purged = $Model->deleteAll(array($this->__settings[$Model->alias]['field'] => '1'), $cascade);
 ↓
$purged = $Model->deleteAll(array($this->__settings[$Model->alias]['field'] => true), $cascade);
$this->__settings[$Model->alias]['field'] => '0'
 ↓
$this->__settings[$Model->alias]['field'] => false
$queryData['conditions'] = $Db->name($Model->alias) . '.' . $Db->name($this->__settings[$Model->alias]['field']) . '!= 1 AND ' . $queryData['conditions'];
 ↓
$queryData['conditions'] = $Db->name($Model->alias) . '.' . $Db->name($this->__settings[$Model->alias]['field']) . '= false AND ' . $queryData['conditions'];
$queryData['conditions'][$Model->alias . '.' . $this->__settings[$Model->alias]['field']] = '!= 1';
 ↓
$queryData['conditions'][$Model->alias . '.' . $this->__settings[$Model->alias]['field']] = false;

と変更。
これでBOOL型で動作すると思います。

とはいえ、ではMySQLだったらそのままでいいってわけでもなく・・・
CakePHPはTINYINT型をBOOLEARN型として扱うようで、これはこれで常にデータが全削除扱いになってしまうので、結局TINYINT型は使えないようです。
CakePHPトtinyintトboolean – [k]zi.bz


それ以外にもSoft Deletable Behaviorの挙動にちょっとした難点があり、[CakePHP] SoftDeletable Behavior で論理削除 – Sun Limited Mt.によると

「SoftDeletable Behavior を使用すると Model::del は必ず false が返ります。
これは Behavior が beforeDelete で削除フラグを立てて、モデルの del メソッドを実行させないために false を返すためです。
この点だけ注意が必要です。」

とのことなので、削除に成功したか失敗したかは別過程で取得しないといけないというネックがあります。

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);

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

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」
が返ってきます。
私はこういう結果を求めていたのですよっ!

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