Life is Really Short, Have Your Life!!

ござ先輩の主に技術的なメモ

CakePHP

CakePHP2.xのContainableの仕組みはよくわからない・・

Deepなアソシエーションを組もうとするとバインドされないことが多くて困ってる。 注文明細は商品にBelong、商品は仕入先とカテゴリBelongしてるとする。 contain(array('商品'=>array('仕入先','カテゴリ')); 商品までは取れるのだが、仕入先とカテゴリが全…

CakePHPのqueryのキャッシュについて

こーゆー単体テストを書いていた。 明細行を集計 集計結果SQLを発行して確認 集計されない結果を返すようupdate 集計結果SQLを発行して確認 2と4で発行されるSQLは同じ。で、3で発行したsqlの結果はfindすると反映されているのに、4でSQLを実行すると更新前…

CakePHP2でSessionのcore.phpの設定が上書きされない

CakePHP2.2.3での話。おかしいこんなことは許されない・・・・ CakePHPのセッションの設定はcore.phpでこんな感じで設定することでデフォルトの設定をオーバーライドできると書いてある。 'database', 'cookie' => 'my_app', 'timeout' => 4320 //3 days ))…

AuthComponentのUserModelを使い分けしたい

CakePHP->Version = '2.2.3'; 利用者(弊社)、顧客、仕入先が各々弊社システムにログインできるようにしたいです、と言われた。以下のようなモデルになっている。 User(利用者) Customer(顧客) Maker(仕入先) Userテーブルに顧客や仕入先をコピーしてぶち込む…

さくらインターネットのレンタルサーバでCakePHP1.x系のシェルが動かない

特定の取引先だけに利用しているしょーもないシステムがあって、CakePHPのシェルで注文内容をメール報告しているのですが、 /home/<USER_NAME>/www/<APP_DIR>cake/console/cake: /bin/bash: bad interpreter: No such file or directory cakeのシェルスクリプトが見つからないと</app_dir></user_name>…

Cake2のFixtureでtruncateするのを辞めさせる

CakephpのModelのテストで皆さんFixtureをお使いかと思います。importしている場合は、testメソッドが始まる前にcreate table&データ読み込みを行い、testメソッドが終わるとtruncate&drop tableするあの機能。 マスタメンテ用の簡単なCRUDテストコードを書…

CakePHP2.0でSQLのログを吐き出す方法

ホンマはApp/Model/DataSourceに置くべきなんだけど、とりあえず動いたので。MySqlの場合。 1. /lib/Cake/Model/Datasource/DatabaseにMysqlLog.phpを作る。 2.作ったファイルをこんな感じのクラス定義を行う。

Containable Behaviourのちょっと気になる所。

Containableは便利だけど余計なSQLを発行しているのが気になっています。 こういうモデルがあってですね。

formHelperのyearで過去から表示したい

cakephp=>version = '1.3.7'; //名前、開始年、終了年、初期値、オプション year('year',1910,date('Y'),'',array('empty'=>false,'orderYear'=>'asc'))?> orderYearっていうキーがascなら開始年から、descなら終了年から始まります。

パスワード変更とかで自分でhashかけたい

ソース読んだらすぐわかったけど、一応シェア。 Hash a password with the application's salt value (as defined with Configure::write('Security.salt'); 502 Bad Gateway AuthComponentにpasswordっていうメソッドがあって、そいつが独自にhashしてくれ…

1つの画面で複数のpaginateを使う方法

・・・超絶めんどくさいですが、一応可能でした。こんなんでいいのかホント。 とりあえず晒しておきます。 複数利用する以上はページングするViewが複数あるわけなので、ふつーにpaginatorで吐き出すページ送りのリンクをGETで叩いちゃうと更新対象でないVie…

cakephp1.3でPaginationをjqueryでAjax化する簡単な方法

色々やってみたんですが、jquery.loadで対象のdivをupdateする方法が最も簡単だったのでそれで実装しました。 controllerのコード set('result',$this->paginate('User')); if ($this->RequestHandler->isAjax()) { $this->render('/elem…

cakephp1.3でPagination時のContainableの扱い

メモっておく。 User->contain(array*1に相当するコード $this->paginate['User'] = array( 'contain' => array('Profile', 'Account')); $users = $this->paginate('User'); //$this->User->contain()に相当するコード $this->paginate['User'] = array( 'c…

selectで初期値を選択したり空白行を出さなかったりする方法

cakephp->version = "1.3.6" 公式のCookBookに嘘つかれたので、ここにコード書いておきます。 select('sex',array('男'=>'man','女'=>'woman'),'man',array('empty'=>false)); 1.2だと引数5個あるんですが、1.3は最後の引数がなくなって4つになってます。 …

$layoutがNullの場合にsql_dumpは吐き出さない方が良い

versionは1.3.4です。 $layoutをnullにしてしまうと、debugレベルが2の状態でsql_dumpのelementをViewに出力してると、なぜかもう1回叩いたコントローラーのメソッドの処理が走っていました。同じ事2回やってて死ぬかと思いました。なんでnullにしたかと…

case-sensitiveには気をつけようね

( ゚∀゚)アハハ八八ノヽノヽノヽノ \ / \/ \ だいぶ初歩的なところで┣¨┣¨┣¨はまりして死にたくなった。ハマるよりもハメたい。 僕、思い込んでたんだ。ほら、WindowsのMysqlってさ、大文字小文字区別しないじゃない。ホントはその段階で気づけって話なんだけどさ。…

AuthComponentでログインした後のユーザー情報引き回し

ログインに成功したらユーザー情報ってどこに入るんだろうと思って困惑してたが、ソース追いかけたら分かった。

AuthComponentにオリジナルの認証項目を設けたい

useridとpasswordの照合だけでなく、アカウントのロック状態等も踏まえてログインチェックを掛けたい場合のTipsです。AuthComponentにはその為のプロパティが用意されています。$userScopeです。 使い方はこんな感じです。 Auth->fields = array( 'username'…

Formヘルパーのラジオボタンの吐き出しがちょっとおかしい

$cakephp->version = "1.2.6"; フォームヘルパーでラジオボタンをグループで出そうと思いまして、初めはこう書いた。 radio('sample.flg', array('0' => 'なし', '1' => 'あり'), array('legend' => false,'value' => '1'))); ?> そうするとこういうHTMLが吐…

prefix利用時のpaginatorの吐くURLについての駄文

スレ立ててしまった。 ”Prefix利用時のPaginatorHelperが吐くURLが正しく表示されない” フォーラム - CakePHP Users in Japan prefixをroute.phpに設定して携帯用のActionを振り分けるっていうのはみんなやっていると思うのですが、pagintorヘルパーを使うと…

Ajaxの複数DIV更新ができない?!

cakephp->version:1.2.4.8284 prototype.js->version:1.6.0.3 どうやら入れ子になっているDIVじゃないと、複数DIVを一気に更新するのはダメみたいだなーと思った。 ajaxヘルパーで複数のdivを更新(update)するには - プログラム開発 作業メモ link(’Link’, ‘…

Group Byしている時にpaginator-&gt;number()が表示されない件

cakephp->version:1.2.3.8166 CakePHP Bakerのある意味腕の見せ所でもあるPaginateとPaginatorヘルパーですが、なかなか使い込まないと味が見えてこないヤツでもあります。 今回はPaginateの際GroupByした条件を渡すと、paginator->number()が全く表示されな…

サブディレクトリごとに違うCakephpアプリを入れたい

要はこういう場合 http://hogehoge.com/ http://hogehoge.com/hogeA 「hoge」と「hogeA」が別アプリケーションだけど、同じドメインの中に入れておきたいよね的な感じの場合。こういうのは意外と単純で、要はルートがどこなのかってだけCakeに指定してあげたらい…

Validateの切り替え

良い子のみんなは同じモデルにおいて「この局面に限り、このバリデーションを外したい」なんてことがあると思います。そのあたり、the Bakeryでも抑えてくれているわけです。 Simple Way to Unbind Validation & Set Remaining Rules to Required :: The Baker…

フレームワークを採用する理由

id:hrkt0115311こと、どんジレさんのつぶやきに答えてみる。 hrkt0115311 PHPの場合、テンプレートエンジンのSmartyを使って、ロジックとデザインを分離される意義は分かった。でも、フレームワーク(Zend FrameworkとかCake PHPとか)を使う理由って何だろ…

Ktai-libraryでログアウトするときのTips

cakephp1.2.3.8166 / Ktai-Library:0.1.1 Ktai-Libraryはapp_controllerでredirectをオーバーライドしており、その中でDocomoのセッション対応の一環でSessionIDを付与してくれています。 が、ログアウト後のRedirectに限りセッションIDを付与されるのはツラ…

フォームでPOSTされた入力値(全角文字)が消える?

cakephp:1.2.3.8166 DBとソースの文字コードはUTF-8で、画面だけSJISに変換している場合のお話。携帯アプリでよくある話。 で、僕がハマッたのはこういう問題。 data); $this->set("hoge",$this->data); } //View ってやると、pr($this->data)にしっかりと…

Ktai-LibraryをComponentで使う時にSessionがスタートしないことがある

どうもそういう動きをしているようなので・・・。 cakephp:1.2.3.8166&Ktai-Library:0.1.1で確認しました。 僕はコレで解決できた。 true, 'input_encoding' => 'UTF-8', 'o…

Cookieを使えないサイトの場合、session.auto_startは0推奨

これで相当ハマった。 WinXP + Xampp1.6.7の環境で、firemobileSimulatorを使って3キャリア対応の携帯サイトを作っているのですが、Docomoの携帯だけセッションIDを付与してもセッションが持続されない(毎回別IDがふられる)という問題にぶちあたりました。K…

Session.startをfalseにするとSessionHelper-&gt;checkで常にfalseになる

cakephp_version:1.2.3.8166 Session.startをfalseにして明示的にセッション開始する場合は、app_controller#beforefillterでこんなことをします。 Session->activate("your session cookie path"); } で、こうするとこんな感じでCallされていきます。 cake/…

modelをsetSourceした時はaliasにも気をつけよう

Cakephp1.2の話。 modelで参照するTableを動的に変更するために、cakephpのmodelにはsetSourceというメソッドがあります。 そいつを実行すると確かに$this->find()ってやるとテーブルが変更されているが、戻ってくる配列のKeyが変更されていないことに気づい…

cakephp1.2でqueryした時のエラーをキャッチしたい

cakephp->version:1.2.2.8120 cakephpのofficialではonError()なるコールバックメソッドがあると書いてあるが、こいつが呼び出されるのはfind,read,saveといったアソシエーション上で利用できるメソッドのみだった。libs/model/datasources/dbo_source.phpを…

cakephp1.2でpaginateで複数のModelを使いたい

cakephp_version:1.2.2.8120 ちょっとハマった。bindmodel()/unbindModel()を使って一時的にアソシエートしている時に注意。 paginate = array( 'A' => array( 'conditions' => array(), 'limit' => 20, 'order' => array('A.id' => 'desc'), 'joins' => arr…

Hiddenで配列を渡してゲットしたい

ま、そんなこともあるよね、人間だもの。良くわかんないけどこんなんでいいんジャマイカ。 hiddenで配列を作るためには、こんな感じにしなくてはならぬ。 <input type="hidden" name="hoge" value="1"/> <input type="hidden" name="hoge" value="2"/> <input type="hidden" name="hoge" value="3"/> とりあえずこうやってみた。 hidden("hoge",array("value"=>1))?> hidd…

cakephp1.2で明示的にJOINさせるやり方

cakephpのversion:1.2.2.8120 今回JOINしたかったのは、A、B、Cという3つのテーブル。 JOINの条件としては、「A.id = B.A_id」と「B.id=C.B_id」というもの。A→BがhasManyでB→CがBelongToと言えば分かりやすいと思う。 こーゆー時はアソシエーションで頑張って…

cakephp雑感とかtips~その1~

適当に思ったことを書く。 controllerはできる限りスリムにする。 controllerで$this->[MODEL_NAME]->findXXXとかサンプルやチュートリアルで書かれているもんだから、僕も多分にもれずそう書いてきたんだけど、これって良く考えたらビジネスロジックじゃん…

cakephp1.2で、検索条件を絞り込んだ場合のページング

多分コレでいいんジャマイカ。 検索条件をPOSTで送って絞り込んでいる場合(僕の場合は日付のFromTo)、ページングで次へ次へとクリックしても検索条件が引き継がれなかった。色々考えたが、手っ取り早くSessionに入れて引き回せばいいやという考えに落ち着い…

cakephp1.2でラジオボタンを初期選択させる方法

ぐぐっても情報が古いんで、自分でソース読んで調べた。簡単だった。ソースはcake/libs/view/helpers/form.phpね。大体890行目近辺。 value($fieldName); } $out = array(); foreach ($options as $optValue => $optTitle) { $optionsHere = array('value' =>…

CakeMailでWebrootがUndefined Propertyになる件

cakephpのコンポーネントでCakeMailというのがあるのですが、今それを使わせて頂いてHTMLメール作ってます。 CakePHPでメールを送信する - Webプログラマー+WebデザイナーなZARU日記 で、コメント欄でも困っているヒトがいたのですが、CakeMailをそのまま使…