December 2009
1 post
拡張子に応じてビューを変える
年末進行やべーな。 年末年始の休みを生かして仕事を進めるという前向きの姿勢で取り組んでおります。 Router::connect( '/:controller/:action.:extension' ); と言うような場合に extension の内容に応じてビューファイルを切り替えて欲しいようなケースありますよね。 そういう場合はコンポーネントの beforeRender() とかに拡張子判別の処理を加えておくと簡単です。 class PdfComponent extends Component { var $__extension = 'pdf'; function beforeRender( &$Controller ){ if( isset( $Controller->params['extension'] ) &&...
Dec 27th
November 2009
9 posts
2 tags
ページングのURL構造を維持してリンク作成
ページングで一覧するコントローラに絞込み機能などを追加しようと考えた場合、ソートなどページングに関連する URL の状態を崩したく無いのでベースとなる URL をとりあえず維持しておく。 $baseUrl = array_merge( array( 'controller' => $this->params['controller'], 'action' => $this->params['action'] ), $this->params['named'] ); リンク作る場合はこんな感じ e( $html->link( 'Anchor text', array_merge( $baseUrl, array( 'refine' => 'name:hoge' ) ) ) ); コントローラでこう解釈すればいい $column = $value...
Nov 22nd
2 tags
直接クエリ投げる
いつも忘れるからメモ。 CakePHP の O/R マッパー使わないで直接クエリ投げる方法。 $db =& ConnectionManager::getDataSource( $this->useDbConfig ); if( !$stmt = mysql_query( "QUERY", $db->connection ) ) die( mysql_error() ); PDO化しちゃうのが一番だけどまとめてる時間ない。
Nov 22nd
1 tag
Go をインストール
CakePHP 関係ないけど Debian lenny にインストール。 $ sudo aptitude install bison gcc libc6-dev ed make mercurial $ export GOROOT=$HOME/go $ export GOARCH=386 $ export GOOS=linux $ export GOBIN=$GOROOT/bin $ mkdir $GOROOT/bin $ hg clone -r release https://go.googlecode.com/hg/ $GOROOT $ cd $GOROOT/src $ ./all.bash $ export PATH=$PATH:$GOROOT/bin $ mkdir ../my && cd ../my $ cat >hello.go <<EOF...
Nov 13th
3 tags
cake schema generate と AppModel
コンソールで cake schema generate すると AppModel までが呼び出されて「AppModel のテーブル app_models がありません」などといわれてしまう。 僕の設計の仕方がおかしいのかなんなのかわからないが、ともかく Configure::listObjects(‘model’) が呼び出されて models ディレクトリの・・・・美雪、犯人がわかった!全員をロビーに集めてくれ!! app_model.php を app/models から app ディレクトリに移動して解決した。
Nov 13th
1 tag
説明力
三流は専門用語と略語をバンバン使った説明をする。 例えば Twitter というサービスの存在を知識として共有している前提で話を進めるため、客はスタート地点からついてこれない。客を煙に巻いて契約を取るのではなく、説明する本人が理解していないから普遍的な言葉で伝えられていないだけ。 二流は専門用語や略語を一切使わずに客が理解するまで懇切丁寧に説明する。 ...
Nov 12th
4 tags
エンティティ的なDB設計を実装する
CakePHP の O/R マッパーはいささか大仰なものであり、多少なりとも SQL 言語を理解している向きにとっては大味に映る。それはともかく CakePHP でエンティティ的な DB 設計を実装する方法を考えてみた。 まず、entities というテーブルがあり、モデル名は Entity とする。これが全てのテーブルの全てのレコードの実体となるデータを格納するテーブルだ。 CREATE TABLE `entities` ( `updated_id` int(20) NOT NULL auto_increment, `foreign_uuid` char(36) NOT NULL, `modified` timestamp NOT NULL default CURRENT_TIMESTAMP, `type` varchar(255) NOT NULL, `body`...
Nov 12th
2 tags
翻訳言語がわからない場合の対処方法
環境変数 HTTP_ACCEPT_LANGUAGE を取得できない場合、例えば FeedHelper で生成したフィードをフィードリーダーなどで読むようなケースにおいてはフィードリーダーのクライアントプログラムでリクエストするため、HTTP_ACCEPT_LANGUAGE を取得できる可能性は低い。 このようなケースでなるべく適切な言語を選択させるためには環境変数 REMOTE_ADDR を元に国を特定して翻訳言語を見つける方法が考えられる。 例えば、カントリーコードに対するロケールを決めうちで作っておいて http://www.hostip.info/use.html の API を利用してカントリーコードを取得し、作っておいた対応表に照らし合わせてロケールを指定する。と言うような実装はどうだろうか。 ...
Nov 9th
3 tags
フォームヘルパーでブラックホール行きまくる場合に気をつけるべき点
セキュリティコンポーネントを利用しつつフォームヘルパーでフォームを生成すると、セキュリティ評価用のトークンが hidden 要素で同時に生成される。 セキュリティ評価用と言ってもセッションに保存されるデータと、フォームの hidden 要素に渡されるデータは全く同じものなので、セッションハイジャック的な攻撃に対しては無防備だと思ったので考えてみた。 セキュリティコンポーネント+フォームヘルパータッグでの働き セキュリティコンポーネントはリクエストの度にセキュリティ評価用のデータ(トークン)を生成する。 生成したトークンはセッションに保存。(作成日時など、有効期限の評価に関連するデータも合わせて保存してある) コントローラーのパラメーターにセキュリティトークンを渡す。 ここまではセキュリティトークンの働き。 フォームヘルパーでは、FormHelper::create()...
Nov 7th
4 tags
Validation::url() が URL の ~ に反応する件への
http://code.cakephp.org/source/cake/libs/validation.php - $validChars = '([' . preg_quote('!"$&\'()*+,-.@_:;=') . '\/0-9a-z]|(%[0-9a-f]{2}))'; + $validChars = '([' . preg_quote('~!"$&\'()*+,-.@_:;=') . '\/0-9a-z]|(%[0-9a-f]{2}))'; URL の仕様から見て natinal と定義されてる記号は受け付けないようになってるので、valid と評価されるグループにチルダを追記。 この挙動は仕様っぽい?
Nov 7th