CakePHP」カテゴリーアーカイブ

CakePHP save()で保存できない

原因

  1. データベースのテーブルに新たにフィールドを追加した。
  2. データベースのテーブルのフィールド名を変更した。
  3. 文字コードが異なる。

などのDBの変更。

対処

  1. キャッシュを削除
    app/tmp/cache/models
    の中のファイルを削除する。
  2. 1.に同じ
  3. 文字コードを変更する。
    携帯サイトとPCサイトをprefixで分けて作っている場合は、携帯から送られてくるデータはShift-JISなので環境に合わせる。

CakephpのShellでComponentを使う

普通のComponentを使う場合は、「PHPで作る携帯サイト」本とかWEB上にも載っていた。

そのComponentが別のComponentを使用している場合では、実行時にObjectがないって怒られてしまう。

どうしていいのか検討がつかなかったので、masapさんに相談してみたときのメモ。
masapさんに感謝。

通常の場合

App::import('Component', 'コンポーネント名');
class HogeShell extends Shell{
    public $uses = array(モデル);
    function startup{
        $this->コンポーネント名 = new コンポーネント名Component($this);
    }

    function main(){
        // メインの処理
    }
}

通常であればのこれでOK。

Componentに依存関係がある場合

具体的には、Componentがさらに別のComponentを使っている場合です。

ContollerをnewしてconstructClasses()、そしてControllerがもっているCompontを使います。

 

constructClasses()は階層も含めてusesとcomponentをつくってくれるそうです。

 

作りながら気づいていたのですが、専用のControllerをつくったほうがよさそうです。。
App::import('Core', 'Controller');
App::import('Controller', 'App');
class HogeShell extends Shell{
    public $uses = array(モデル);
    function startup{
		$this->controller = new AppController();
		$this->controller->components = array('Example');
		$this->controller->constructClasses();
		$this->Example = $this->controller->Example;
    }

    function main(){
        // メインの処理
         $this->Example->hogehoge();
    }
}

以下のようにした方がいいかもしれません。
確認はしていませんが。。

class HogeController extends AppController{
 public $components = array('Example');
}
App::import('Core', 'Controller');
App::import('Controller', 'Hoge');
class HogeShell extends Shell{
    public $uses = array(モデル);
    function startup{
        $this->controller = new HogeController();
        $this->controller->constructClasses();
        $this->Example = $this->controller->Example;
    }

    function main(){
        // メインの処理
        $this->Example->hogehoge();
    }
}

。。。

CakePHP:SimpleTest

SimpleTest

  1. DL
    http://simpletest.sourceforge.net/en/download.html
    からDLし解凍する。
  2. 設置
    /app/venders/
    に解凍したsimpletestフォルダを入れる。
  3. テスト用データベースの準備
    適当な名前のデータベースを作成しておく。
    e.g. test_db

CakePHPの設定

  1. /app/config/database.php
    テスト用のデータベースの設定

     var $test = array(
      'driver' => 'mysql',
      'persistent' => false,
      'host' => 'localhost',
      'login' => 'root',
      'password' => '',
      'database' => 'test_db',
      'encoding' => 'utf8',
      'prefix' => '',
     );
    
  2. /app/config/core.php
    デバッグレベルを1以上に設定

組み込みのテストケースの実行

http://localhost/CakePHPのフォルダ/test.php