cakephp3

CakePHP3:friendsofcakeプラグインでラジオボタンを横並びにする

めっちゃ簡単で、inline=trueを指定するだけです: echo $this->Form->control('priority_id', ['options' => $priorities, 'type' => 'radio', 'inline' => true]);

CakePHP3:3.5移行の際のポイント

マイナーチェンジのようで、結構大きな変更があるので以下にまとめています(随時更新) インストール 3.4の場合は、 composer create-project --prefer-dist cakephp/app:3.4.* app と指定したところ、3.4.2が入りました。 3.5の場合は、 composer create-p…

CakePHP3/Bootstrap3:フォームのラベルを左寄せする

Friendsofcakeのbootstrapプラグインを導入すると、 echo $this->Form->control('title'); といった記述をするだけで次のマークアップを吐いてくれます: <div class="form-group text required"> <label class="control-label text-left col-sm-2 col-md-2" for="title">Title</label> <div class="col-sm-6 col-md-6"> </div></div>

CakePHP3:findで特定の行の特定のカラムの値を取得する

$firstname = $this->Users->find()->where(['id' => $user_id])->first()->firstname; もっと美しいやり方をご存知でしたら教えてください〜 関連エントリ: thebaker.hatenablog.com

CakePHP3:複数単語のprefixを使う

これまでprefixルーティングではadminくらいしか使ったことなかったのですが、ふと、 adminFeaturesとか複数の単語を使った場合はどうなるんだろう?と思っていました。 結論から書くと、こうします: URL: /admin-features/コントローラ/アクション routes.…

CakePHP3:Bootstrap3、jQuery、sb-admin-2の導入

friendsofcakeのbootstrapプラグインを導入してみました。が、美しく無い… プラグインはいくつか有りますが、bake用のテンプレートが欲しかったのでfriendsofcakeにしました。 以下、CakePHPが/var/www/html/appにインストールされている前提です。 bootstra…

CakePHP3:特定のコントローラをBasic認証の対象外にする

とある開発においてSMSの送信をすることがあり、SMSの事業者からコールバックを受ける必要がでてきました。 開発環境でBASIC認証をかけているので、コールバックを受けるURLだけを開放したい。 だけどCakePHPでは.htaccessによってURLをrewriteしているので…

CakePHP3:findですべての行の特定カラムの値を抜き出す

いつももやもやするので、備忘録として。仮にこんなデータがあるとします: id name 1 New York 2 Tokyo 3 London そして次のデータを抜き出したいとします: ['New York', 'Tokyo', 'London'] 実行するのはこいつです: $this->loadModel("Cities"); $citie…

CakePHP3:PagesのURLをルーティングする

Pagesはページをどんどん作れて便利ですがURLが長いですよね/Pages/display/ページ名。 そこでルーティングを使ってこれを短縮します。 書くまでも無いかもしれませんが…routes.phpに次を追加します: $routes->connect('/ページ名', ['controller' => 'Page…

CakePHP3:URLのマッピング(ルーティング)

仮に、こちらのURLを: /Japan/Posts/view/10 PostsControllerのviewアクションにマッピングしたいとします。 (つまりJapanってのはURLに入っているけど捨てることになります) この場合、routes.phpに次を追加します: $routes->connect('/:country/Posts/…

CakePHP3:モバイル端末を検出する

サーバ側でモバイル端末を識別するニーズがあり、MobileDetectというのを導入してみました: mobiledetect.net 導入方法ですが、composerを使うと簡単です: composer require mobiledetect/mobiledetectlib Cakeの中のプログラムから利用するには、useを使…

CakePHP3:ブラウザにファイルをダウンロードさせる

mp3のようなファイルを配信する場合、次のように書きます: $this->autoRender = false; $download_file = $file_dir . DS . $file_id . ".mp3"; $response = $this->response->withFile($download_file); return $response; このままでは、mp3がその場で再…

CakePHP3:Cannot describe テーブル名. It has 0 columns.

こちらのエラーですが、発生するケースを2つ見つけました。 belongsToの記述が間違っている $this->belongsTo('Owners', [ 'class' => 'Users', // 正しくはclassName 'foreignKey' => 'owners_id', 'joinType' => 'INNER' ]); データベースやテーブルにアク…

CakePHP3:テンプレートから現在のページを取得する

「今表示しているページは何ページ目か?」といった情報を取得したい場合は、こちらを使います: $this->Paginator->param('パラメータ名'); パラメータ名に指定できるのは以下の通り: パラメータ名 意味 count 件数の合計 current 現在のページに表示して…

CakePHP3:現在のパスワードを確認する方法

パスワードの変更画面において「現在のパスワードを入力させ、正しいか確認する」ケースがあります。 実施するのに注意点が2つあります: hashの同一を確認するにはDefaultPasswordHasherのhashではなくcheckを用いる こんな感じでモデルに記述します: $val…

CakePHP3:アップロードのプログレスバー

PHP5.4からは、ファイルアップロード時の進捗を知ることができるようになりました。 CakePHP3でハマったポイントがありましたのでここに列挙します: セッション管理の方法 app.phpでは、セッション管理の方法を以下の様に指定できます: 'Session' => [ 'de…

CakePHP3:saveもしくはpatchEntityの際のエラーを見る

いつも忘れてしまうので… if ($this->Articles->save($article)) { }else{ $this->log(print_r($article->errors(),true),LOG_DEBUG); }

CakePHP3:composer install時にディレクトリを作成する

Composerを使ってCakePHPをインストールすると、logとかtmpディレクトリを適宜作って、かつ、パーミッションを設定してくれます。 これまでは、アプリケーション独自のディレクトリを作る場合に手動でスクリプトを叩いていたのですが、面倒かつ、抜けがでる…

CakePHP3:カラム追加が反映されない

CakePHP3.5で、カラム追加したにも関わらずそのカラムのデータがINSERT/UPDATEされない現象に出くわしました。 tmp以下をクリアしても解消しない… 対策ですが、Entityの編集が必要でした: protected $_accessible = [ 'id' => false, <中略> '新しいカラ…

CakePHP3:テーブルとかフォームでログを使いたい(Call to undefined method ::log() )

コントローラ、コンポーネント、ビュー、ヘルパーでは、次の記述でログを書き出せます: $this->log("ほげほげ",LOG_DEBUG); では、テーブルやフォームで同様のことを行うにはどうすればいいでしょうか? 選択肢は2つあります: 一回だけ使いたい場合: \Cak…

CakePHP3:3.5で増えた正規表現のバリデータ

CakePHP3.5から、バリデータが増えて正規表現を使いやすくなりました: protected function _buildValidator(Validator $validator) { return $validator->add('name', 'length', [ 'rule' => ['minLength', 10], 'message' => '10文字以上で入力してくださ…

CakePHP3:条件付きでallowEmptyにしたい場合

パスワードの入力欄と確認欄は「パスワードを変更しない場合は空欄でよい」というケースがあると思います。 これはallowEmptyにコールバック関数を指定することで実現可能です: $validator ->allowEmpty('confirm_password', function ($context) { return …

CakePHP3:認証失敗のエラーメッセージを動的に変更する

Authコンポーネントを設定するときに、認証失敗時のエラーを次のように定義します: $this->loadComponent('Auth', [ 'authorize' => [ 'Controller'], 'authenticate' => [ 'Form' => [ 'fields' => ['username' => 'email', 'password' => 'password' ] ] …

CakePHP3:コンポーネントでFlashメッセージを設定する

このようにします: class HogeComponent extends Component { public $components = ['Flash']; public function getHoge() { $this->Flash->success(__('Succeeded getting hoge!')); }

CakePHP3: アソシエーションしているテーブルのデータを`extract`や`select`したい場合

こんな需要があるのかどうかわからないのですが、実験していて出来たので共有です 前提条件 データ 得たい結果 動くケース matchingとextractを使う場合 matchingとselectを使う場合 leftJoinWithとselectを使う場合 動かないケース containでextractもしく…