GROUP BYの指定について
ググると古い情報がたくさん引っかかるので、メモ。
以前の方法
$cond = array("1 = 1 GROUP BY Tag.id");
$this->Tag->find("all", array("conditions" => $cond));
↓
NowでYoungな方法
$group = "Tag.id";
$this->Tag->find("all", array("group" => $group));
CakePHPはどんどん進化していくなぁ~
参考:http://cakephp.jp/modules/newbb/viewtopic.php?topic_id=1202&forum=6
Cakeをphpeditor、UTF-8で利用する際の注意
Cakephpをphpeditorに取り込む際に、
自動取り込みにするとshift-jisで取り込んでしまう。
かといって、UTF-8で取り込むと、
アクセスしたときにpreg_replaceでエラーが出る。
-対策-
すべてのファイルをUTF-8指定で取り込む。
※フォルダを指定して取り込み
このままだとエラーが出るので、
cakeフォルダのファイルだけを元のcakeフォルダのファイルで上書きする。
これでOKになるということは、
cakeフォルダの中身がUTF-8で取り込んだときに
書き換えられてしまうということなんだろうか…。
ともかくこれは私の環境でのはなし。
ネットで探しても同じような現象はないようだから
うちだけの問題かもしれないな。
RC1に移行したらsaveできない
RC1がついにリリースされました。
すぐに移行してみたらトラブル発生!
saveができなくなったorz
Google先生や、フォーラムを見ても解決策は無く、
恐らく他の人は困ってないんだと思うけれども、
うちではどうやってもsaveできない…。
で、原因はmodelのgetColumnTypeにあるようなのでチェック。
結論から言うと、引数で渡される$columnにモデル名が含まれていないために、
if (strpos($column, '.')) {
list($model, $column) = explode('.', $column);
}
を通らず$modelがNullのまま
if ($model != $this->alias && isset($this->{$model})) {
return $this->{$model}->getColumnType($column);
}
の処理が走り、
if文の$this->{$model}が$this->Nullというおかしなことになってエラーになることがわかった。
(これって$columnがモデル名を含まずフィールド名だけだったらエラーになりますよね?ね?)
だったら$this->{$model}を$modelにしちゃえ!ってな乱暴なことをしたら、
model->delが効かなくなっちゃったので、
if (isset($model)) { // このif文を勝手に追加
if ($model != $this->alias && isset($this->{$model})) {
return $this->{$model}->getColumnType($column);
}
}
とりあえずこんな感じに修正しました。
getColumnTypeのソースを読むと、
まず$modelにnullを代入してから、わざわざif文でstrpos($column, '.')をチェックして$modelに代入してるから、
$modelにモデル名が含まれないことを想定していると思うんだけど…。
どこを探しても同様の問題で悩んでいる人がいないみたいだから、
他では起こっていないんだと思うんですけど、いったい何がいけないんでしょう?
もしお分かりの方がいらっしゃいましたら、
ぜひ教えていただけると有難いです。
ディレクトリにあるファイルの最終更新時間を取得するメモ
ディレクトリにあるファイルの最終更新時間を取得するメモ
// test code
//ディレクトリとファイルを格納する配列
$dir_array = array();
$files = array();
$path = "./img/upload/demo/";
//ディレクトリの中身を取得する
$handle = opendir($path) or die('ディレクトリが開けません');
while ($fname=readdir($handle)) {
if (is_dir($path . $fname)) {
array_push($dir_array, $fname);
} elseif (is_file($path . $fname)) {
array_push($files, $fname);
}
}
closedir($handle);
foreach ($files as $key => $value) {
$filen[$key]['path'] = $path.$value;
$filen[$key]['timestamp'] = filemtime($filen[$key]['path']);
$filen[$key]['updated'] = date("Y-m-d H:i:s", $filen[$key]['timestamp']);
}
pr($filen);
urlにbase64を埋め込む
通常URLにbase64エンコードした文字列を埋め込むと、
「+」とか「/」が問題を起こしてしまう。
なので、base64をURLに埋め込むためには、
ちょいとひねってやる必要がある。
エンコード
str_replace(array('+','/'), array('-','_'), base64_encode(文字列));
デコード
base64_decode(str_replace(array('-','_'), array('+','/'), 文字列));
今回はCakePHPはあんまり関係ないお話。
コントローラ間で共通のビューを使用したい場合
別々のコントローラから同じビューを使いたい時ってありません?
たとえば同じようなCRAD処理が書かれたコントローラが複数ある場合とか。
そんなときは、$this->viewPathが利用できます。
/view/common/にビューがあるなら、
コントローラのbeforeFilterなどで、
$this->viewPath = "common";
これでOK!
hasAndBelongsToManyについて
現時点(20080508)では、よくわからない。
使いどころも、どう使うのかすらわからない。
ただ意味はなんとなくわかるし、
使ってみたい場面はあるので、いろいろ試行錯誤しながら使ってみたいと思ふ。
何かわかったことがあればここにメモする。