CakePHP2.x

【CakePHP 2.x】Controller内でトランザクションをかける

CakePHPの公式サイトを確認すると、 モデル内で以下のようにかけるらしい。 begin(); if (/*すべて成功*/) { $dataSource->commit(); } else { $dataSource->rollback(); } でも今回はコントローラーでかけたい。 ということで、トランザクション管理用のモ…

【CakePHP 2.x】CakePHP 2.x の高速化Tips

フレームワークは便利なんだけど、動作が遅い。 もちろん CakePHP も例外ではない・・・。ということで、高速化Tipsをまとめてみた。1.PHP-APCで中間コードをキャッシュ これはCakePHPに限らずだけど、 結構パフォーマンスに差が出るのでやっておく。2.Form…

【CakePHP 2.x】Sanitize では % がエスケープされない

ちょっとしたプログラムで・・・・ find('all', array('conditions'=>array('Customer.name LIKE '=>'%'.$customer_name.'%'))); 上記の $customer_name をエスケープしようとして、 Sanitize::clean() を使ったけど、 % がエスケープされなかった。% を入力…

【CakePHP 2.x】モデルで生成されているSQLを確認する

単なるメモです。 VIewに以下を書けばいいだけ。 element('sql_dump'); ?> ただ、使ってみると表示されるクエリ数に制限がある気がするのは気のせいか・・・。

【CakePHP 2.x】favicon.ico を変更する

忘れるのでメモ。favicon.ico を webroot 直下において、 以下をheaderタグ内に設置する。 html->meta('icon');

【CakePHP 2.x】モデルのsave()で OR を使う

単なるメモ。 find( 'all', array( 'conditions'=>array( 'UntouchableList.product_id'=>$_product_id, 'OR'=>array('UntouchableList.item'=>$_lists) //このようにORの条件配列を入れる ) ) );

【CakePHP 2.x】Nginx + CakePHP で CakePHP をサブディレクトリとして設置する

default.confに以下を追記する。 location /cakephp { alias /usr/share/nginx/html/cakephp/app/webroot; index index.php; if (!-e $request_filename) { rewrite ^(.+)$ /cakephp/index.php?q=$1 last; } } location ~ ^/cakephp/(.+\.php) { alias /usr/…

【CakePHP 2.x】違うControllerのActionを呼び出す

以下でOK。1.Controllerをインポートする。 App::uses('TestsController', 'Controller');2.newして使う。 $tests_controller = new TestsController(); $tests_controller->test($this->data, 'Test');まあ、コンポーネントでまとめてもいいんだけど・・・。…

【CakePHP 2.x】Mysql.php で PHP Fatal error: Allowed memory size

CakePHPで大量のデータを扱っていたら、 以下のエラーが出た。PHP Fatal error: Allowed memory size of 268435456 bytes exhausted (tried to allocate 32 bytes) in /var/www/html/cake_dir/lib/Cake/Model/Datasource/Database/Mysql.php on line 247これ…

【CakePHP 2.x】【saveの種類】Model の saveMany(), saveAssociated(), saveAll() を比較する

今まで、CakePHP の データ保存では save() しか使っていなかった。 理由は save() だけ使えば何とかなるので、 View とか Controller の機能を勉強することが多かったから。 ただ、前から saveMany() とか色々と便利なのがあるのは知っていたので、 調べて…

【CakePHP 2.x】getLastInsertId() を検証してみた

getLastInsertId() という便利メソッドがある。 これは Model で保存したデータの最新主キーを返してくれる。ただ、いまいち挙動が信用できない。 具体的に言うと、 getLastInsertId() は 該当モデル(テーブル)の最新主キーを返すのか、 保存したデータに…

【CakePHP 2.x】Controler で URL を生成する

CakePHP の View で URL を生成する場合は、 $this->html->url(array('controller'=>'', 'action'=>'')); を使う。ただ、これは Controller では使えない。 Controller では Routerクラスを使って、 以下のように生成する。 '', 'action'=>'')) 公式サイトを…

【CakePHP 2.x】Viewを使いまわす

エラーページなど、他のControllerで共通で使うページがある場合の使い回しについて 今更ながら気づいた。同一ActionでViewを切り替えるときには $this->render() を使う。 今までは $this->render('error'); のように指定していた。 こうすると、Controller…

【CakePHP 2.x】beforeFilter() では変数がセットできないので、beforeRender() を使う。

Authコンポーネントで認証したユーザー情報(名前とかユーザーID)を 画面のヘッダーに表示させたい。 全Viewで $this->set(); するのは面倒なので、 AppControllerでセットする。この場合は beforeFilter() ではセットできない。 CakePHP 1.3 の時は before…

【CakePHP 2.x】複数モデルでAuthコンポーネントを使う

Authコンポーネントを使うと、認証機能が簡単に実装できるが、 モデルを運営者モデルと利用者モデルで分けたいことがある。これを実現するには、AdminRouting を利用する。運営者モデルをOwnerとして、全ActionをAdminRoutingで実装する。 利用者モデルをUse…

【CakePHP 2.x】入力フォームでエラー時の入力値を保持する

CakePHPで入力フォームを作成する場合、 フォームをFormヘルパーで作成すると、 エラー時などに入力値を保持してくれる。例えば、ユーザー登録画面を作成する場合、 ユーザーのメールアドレスをユニークチェックすることがある。 同じメールアドレスが存在す…

【CakePHP 2.x】ルートディレクトリをリネームしたら404エラー

ルートディレクトリをリネームしてアクセスしたら、 404エラーが発生した。原因はCakePHPのキャッシュでした。 /app/tmp/cache/ 以下の全ファイルを削除すると正常に動作します。

【CakePHP 2.x】Association で連結されるモデル(Model)に order を設定する。

StoreモデルにNewsモデルが紐づく時、 Newsモデルのデータを新着順で取得したい。以下のように find() しても上手くいかない。 $this->Store->find('first', array('conditions'=>array('Store.id'=>$id), 'order'=>array('News.creation_date'=>'DESC'))); …

【CakePHP 2.x】各ControllerでbeforeFilter() を実装したら AppController の beforeFilter() が呼ばれない。

CakePHPでは AppController の beforeFilter() に共通処理を実装することが多い。 ただ、各Controller で beforeFilter() をオーバライドしてしまうと、 AppController の beforeFilter() が呼ばれないので、 共通処理が実行されない。なので、各Controller …

【CakePHP 2.x】$this->html->url() を AdminRouting にする

CakePHPでURLを指定するときは $this->html->url() を使うことが多い。 で、AdminRouting の時はどうするのかなと・・・ 以下のように admin を true にすればOK。 $this->html->url(array('controller'=>'tests', 'action'=>'test', 'admin'=>true)); Admin…

【CakePHP 2.x】ログインIDに外部キー命名規則が適用されてログインできない

CakePHPでのログイン処理は Authコンポーネント を使う。 その場合、usersテーブルの「name」と「password」で認証する。ただ、usersテーブルに「名前」「ログインID」「パスワード」を持たせて、 それぞれ「name」「login_id」「password」にすると、ログイ…

【CakePHP2.x】Admin Routing で管理者用のアクションを作る

管理者モードをONにすると管理者用URLが使える。 具体的には Controller/Action の前に admin が入る。【一般ユーザーのURL】 /cake_dir/Controller/action【管理者ユーザーのURL】 /cake_dir/admin/Controller/action ControllerクラスのActionには admin_ …

【CakePHP2.x】SplFileInfo::openFile(): failed to open stream: Permission denied in /.../public_html/lib/Cake/Cache/Engine/FileEngine.php on line 313

SplFileInfo::openFile(): failed to open stream: Permission denied in /.../public_html/lib/Cake/Cache/Engine/FileEngine.php on line 313というエラーが出た。 これはキャッシュへのアクセス権限がないために発生するエラー。一度、キャッシュを削除し…

【CakePHP2.x】render()でViewを使いまわす。

システムで登録画面と編集画面など、 レイアウトが似ている画面を使いまわす時は コントローラーで $this->render() を使うと、 Viewを指定できる。以下のようにすると、add.ctp を edit でも使用可能になる。 public function edit{ $this->render('add'); …

【CakePHP2.x】App::uses() と App::import() の違い

外部ライブラリは /app/Vendor/ に放り込んで、 App::uses() or App::import() を使いインポートするが、 ライブラリによってインポート方法が違う。ライブラリがクラスの場合は App::uses() を使う。 ライブラリがクラスではない場合は App::import() を使…

【CakePHP2.x】データ削除には postLink() を使うと便利

CakePHPにはデータ削除時のリンク用に postLInk() というFormHelperが用意されている。 postLink()を使うと、POSTで削除用アクションにアクセスできて、 削除確認用のアラートも出してくれる。 とても便利。 リンクではなく、ボタンが出力される postButton(…

【CakePHP 2.x】シェルクラスを使った非同期処理

過去の内容が分かりづらかったので、大幅に修正しました。 過去の内容は一番最後に残しています。 シェルクラスを使うメリットとしては、 Modelが使えるところだと思う。 既存処理を使いまわせるのは便利。 ということで、CakePHPでシェルクラスを使った非同…

ログイン状態の共有を避ける

ちょっとした仕様変更で、 Cakeで作ったシステムをコピーする機能が必要になった。コピー自体は問題なくできたが、 オリジナルとコピーでログイン情報を共有してしまう問題が発生した。 オリジナルでログインすると、コピーでもログインできてしまう・・・。…

プルダウンのFormヘルパー

1.3と少し変わっていたので、メモ。 echo $form->select( 'テーブル名.列名', array('値' => '表示される項目', …), array('empty'=>false, 'value'=>'値') ); 第2引数の連想配列はoptionタグのnameとvalueになる。 これには $this->Model->find('list') で…

HTMLエスケープに htmlentities() を使う

CakePHPには h() があって、HTMLをエスケープしてくれる。 便利だけど、実体は htmlspecialchars() なので、 htmlentities() に変更する。関数は /lib/Cake/basic.php にある。 最後の return で htmlspecialchars() を使っているので、 htmlentities() に変…