suzukiのCakePHPブログ -3ページ目

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

Xampp環境でPearコマンド

コマンドプロンプトから

cd xamppのphpディレクトリ

に移動して、

pear

でOK

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にモデル名が含まれないことを想定していると思うんだけど…。

どこを探しても同様の問題で悩んでいる人がいないみたいだから、
他では起こっていないんだと思うんですけど、いったい何がいけないんでしょう?

もしお分かりの方がいらっしゃいましたら、
ぜひ教えていただけると有難いです。

htmlソースをそのまま表示するhtmlタグ

いつも忘れてしまうのでメモ

<xmp></xmp>で囲う

ディレクトリにあるファイルの最終更新時間を取得するメモ

ディレクトリにあるファイルの最終更新時間を取得するメモ


		// 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)では、よくわからない。
使いどころも、どう使うのかすらわからない。

ただ意味はなんとなくわかるし、
使ってみたい場面はあるので、いろいろ試行錯誤しながら使ってみたいと思ふ。

何かわかったことがあればここにメモする。

コントローラーでリンク元を取得

コントローラで

$this->referer()

でOK