CakePHP2.x 複数テーブル保存とアソシエーションをもう一度再確認

cake2-9-5-2

再確認というか、あまり理解せずにbakeされるがままに使っていた。
しかし、複数テーブルの一括保存を行うsaveAllを使うときに困ったことが起こった。

AテーブルとBテーブルの内容両方を一括登録する処理で、コントローラはAを使っている時にA.ctpにFromヘルパーでBテーブルの情報を書き込めるようにセットしたが、DBにうまく保存されない現象が起こった。
原因はModelのアソシエーションだったので否が応でも理解が必要になった。

とはいえ、こんがらがるので今回は3つだけ。本当は4つ・・。

hasAndBelongsToMany

これ、長いし複雑なのでペンディング。

まず、bakeすると必ずといっていいほどよく出る2つ。
belongsTo

hasMany

belongsToは自分のテーブルに相手テーブルのidがある場合。
例えばusersテーブルに職業をセットするためのwork_idがあり、マスタはworksテーブルでセットされているなどの連携に使う場合。

次にhasMany。
belongToの逆。
例えばユーザーのこれまで育ってきた都道府県全てなどを登録する場合にprefsテーブルにuser_idをセットしている時などの連携に使う場合。

最後にhasOne。
これは純粋に1対1。
もっと明確に言うと、Aテーブルにb_idがあり、Bテーブルにa_idがあるとき。

では、saveAllで複数テーブルに情報を保存するときは、このアソシエーションの考え方がくるっているとうまく値をセットできない。
今回はAテーブルにもBテーブルにもそれぞれ外部キーのあるhasOneの関係だったけど、bakeするとbelongToとhasManyを書いていた。
hasOneに書き換えると問題なく両テーブルに保存完了。

ちなみにhasManyの関係の場合、複数テーブル、複数レコードという保存になるため、しっかり配列を渡してあげないと保存できない。

こんな感じにFromヘルパーに書いてあげる。

以上

24 2月 2017

 

CakePHP2.x AppControllerでModelを呼び出しfind関数を使う方法

cake2-9-5-2

使用理由としては、app/View/Elements/header.ctpを用意しており、ヘッダー情報内にログインしたユーザー名、画像を表示するようにセット。
はじめは$this->Auth->user()を利用していたが、これではユーザー情報を編集したときにログアウトしないと情報が更新されないため、直接DBから情報を取得する流れに変えた。

これまではページ数が少なかったので、各コントローラに以下の記述を行っていた。

ChatsController.php

header.ctp

$user2にログインユーザーのidをセットし、find関数でユーザーIDを検索キーに情報を取得し$user_infoにセット。
ctpで表示という流れ。

ページ数が増えると、各コントローラにこの変数定義をそれぞれ行うのは非常に効率が悪いのでAppController.phpのbeforeFilterにセットすることに。

普通に同じように記述してもfindしたけどnullじゃね~!と言われ、var_dumpしても情報なし。
AppController.phpではModelとの接続をしていないらしく、以下の設定が必要とのこと。

今回はusersテーブルを見に行くので以下のように記述。

後は、AppController.php用に記述を少し変更

以上。

22 2月 2017

 

フォームオブジェクトをフォーカスしたときの色について

html

フォームオブジェクトをフォーカスしたときにボーダーなどで色を設定する疑似クラスの:focusだが、chromeとFirefoxでは色が明らかに違った。
始めに書いていたCSSは以下の通り、単純にピンクの線を表示するようにしていただけ。

しかし、これだけではchromeでは以下のように青い線が表示される。

chrome

ちなみにFirefoxでは正常に表示される。

firefox

ちょっと内側に影なんかつけてみたら変わるかもという淡い期待。

chromeでは外側の青罫線の内側にbox-shadowで設定したピンクの影が見える。キモイ!

chrome2

Firefoxは想定通りの表示。

firefox2

調べてみるとフォームオブジェクトにはoutline(輪郭)というプロパティが存在していて、chromeではその初期値で青くなっていたよう。
確かにGoogleで検索しようとすると、青い線がでる。
スタイルはborderプロパティと同じようなので:focus時にはborderで色を付けずにoutlineで設定したほうがいいのか!

と思っていると大間違いで、outlineはborderのさらに外側の輪郭になるので、outlineのみの設定だと今度はFirefoxでの表示が以下のようにおかしくなる

firefox3

結局、outlineはnoneで非表示化し、borderを設定するのが一番まともに見えた。

こういう細かい部分でのブラウザ非互換って、結構しんどい。。

22 2月 2017

 

inputタグのfileやsubmitを画像にする方法

htmlcss_2

HTMLは、画像化したinputタグをlabelタグで囲み、labelタグのforをinputのid
に渡してあげる。

CSSは画像にマウスカーソルを持って行ったときに指印になるようにし、inputを消す。

画像ではなく、テキストで装飾することも可能。

CSSのlabel>.uploadを適宜装飾すれば完了。

jQueryやJavascriptとの併用の記事は多かったのですが、面倒臭いのでHTMLとCSSだけで解決する方法でした。

17 2月 2017

 

CakePHP Formヘルパーで別のコントローラのアクションへ処理を飛ばす方法

cake2-9-5-2
CakePHPは通常現ページのアクションを実行する。
/*****/users/index
を閲覧している場合、UsersController.phpのfunction index()内の処理を行うことになる。

ページ内の処理としては、ViewファイルにFormヘルパーを使いPOSTやGETをするという処理がはしる。
今回の場合は
app/View/Users/index.ctp
を編集することになり、通常Fromヘルパーを使う場合は

という記述になる。

これが実際のタグでは

という記述になる。

同一ページ内に別のアクションや別のコントローラの処理を行う場合は、fromタグのactionで処理をさせるコントローラに情報を渡す必要がある。
その場合の記述は

というように、配列でurlを渡してあげる必要がある。
この’url’はCakePHP2.8より前では’action’という記述だったよう。
今は禁止になっているので’action’で記述するとエラーになるので要注意。

17 2月 2017