cutmail's blog

write the code

CakePHPでjsファイルの読み込みをする

viewなどで、jsファイルを使用したい場合、javascriptヘルパーなどを使わずにfull pathで書くこともできますが、
これはpathを間違えたりしやすいので、javascriptヘルパーを使う方が簡単でよいです。

まず、top.jsというファイルを読み込ませたい場合、
app/webroot/js/ディレクトリに格納します。

そしてControllerとViewに下記のように記述します。

Controller

<?php
class HogesController extends AppController {
    var $helpers = array('Javascript');
}

View

<?php echo $javascript->link('top'); ?>

これで、jsファイルの読み込みができます。

強制的にデバッグモードを変更する

CakePHPでは、デバッグモードをconfig/core.phpの中で設定しますが、コントローラーやビューから動的にデバッグモードを変更したい場合は、以下をコントローラーやビューに記述します。

<?php
// デバッグモードを変更
Configure::write('debug', 0);
?>

※ただし、この設定より前のデバッグは出力されてしまうので、順番に注意が必要です。

cakephpでINSERTするつもりがUPDATEになる場合の対処法

今日悩んだことを調べ、あとで思い出すときのためにメモるシリーズ。

コントローラーの中で配列の中身を一つずつINSERTするときは、
こんな風に書きますが、

<?php
foreach ($hoges as $key => $value) {  
    if($value){
        $this->data['Hoge']['test'] = $value;  
        $this->Hoge->save($this->data);  
    }  
}  
?>

これだと、2週目以降が全てUPDATEになってしまいます。

primaryKeyをその都度nullにするっていう方法もありますが、
こんなの↓

<?php
foreach ($hoges as $key => $value) {  
    if($value){
    $this->data['Hoge']['id'] = null;
        $this->data['Hoge']['test'] = $value;  
        $this->Hoge->save($this->data);  
    }  
}  
?>

あまりスマートではないので、
そういう場合は、

<?php
foreach ($hoges as $key => $value) {  
    if($value){
    $this->Hoge->create();
    $this->data['Hoge']['id'] = null;
        $this->data['Hoge']['test'] = $value;  
        $this->Hoge->save($this->data);  
    }  
}  
?>

としてやると、できます。
つまり初期化してるんですね。

for文でINSERTしてるとページロードが重い。。。

[cakephp]コンポーネントから他のコンポーネントを呼び出す

カスタムコンポーネントを作って、他のコンポーネント経由でモデルを呼びたくて
わからなかったので調べてみた。

<?php

class HogeComponent extends Object {

   var $name = 'MasterHoge';

   var $Controller;

   //呼びたいコンポーネントをここに書く
   var $components = array('MasterTest') 

   function index(){

     //実際に他のモデルの情報を取得
   $data = $this->Controller->MasterTest->find();

   }

}
?>

のように書くとできました。

コンポーネントを使うのは複雑な用件の場合のみにしたほうがいいらしいです。

cakephpの内部関数

配列のトレースとかをするときに今までは、

<?php

$hoge = array(1,2,3,4);

print_r($hoge);

?>

とかやっていたけど、

なんかcakephpだと

<?php

$hoge = array(1,2,3,4);

pr($hoge);

?>

で同じことをやってくれるらしい。

便利だね。ショートコーディングにもなるし。