原因
- データベースのテーブルに新たにフィールドを追加した。
- データベースのテーブルのフィールド名を変更した。
- 文字コードが異なる。
などのDBの変更。
対処
- キャッシュを削除
app/tmp/cache/models
の中のファイルを削除する。 - 1.に同じ
- 文字コードを変更する。
携帯サイトとPCサイトをprefixで分けて作っている場合は、携帯から送られてくるデータはShift-JISなので環境に合わせる。
普通の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を使っている場合です。
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(); } }。。。
var $test = array( 'driver' => 'mysql', 'persistent' => false, 'host' => 'localhost', 'login' => 'root', 'password' => '', 'database' => 'test_db', 'encoding' => 'utf8', 'prefix' => '', );
http://localhost/CakePHPのフォルダ/test.php