before,after系のフックメソッドの動きを再確認
11 月 17, 2008
なんとなくコントローラのbeforeFilter, afterFilter, beforeRender、ヘルパーのafterLayoutあたりの順番が気になったので試してみた。
コントローラ。お分かりの通り、焼いたものにメソッド書いて、ヘルパー追加しただけです。
class UsersController extends AppController { var $name = 'Users'; var $helpers = array('Html', 'Form', 'Second', 'First') ; function beforeFilter(){ echo "beforeFilter<br>"; } function afterFilter() { echo "afterFilter<br>"; } function beforeRender() { echo "beforeRender<br>"; } /** afterRenderなんて存在しないよ\(^o^)/ function afterRender() { echo "afterRender<br>"; } */ function index() { echo "main<br>"; $this->User->recursive = 0; $this->set('users', $this->paginate()); } }
firstHelper。名前は確認用のため適当。そして中身も適当。
class firstHelper extends AppHelper { function afterLayout() { echo "first afterLayout<br>"; } }
secondHelper。↑と同じ。
class secondHelper extends AppHelper { function afterLayout() { echo "second afterLayout<br>"; } }
結果
ふむふむ・・・。
ちなみに、helperの順番を [first],[second]の順にしてみたら、その順番通りだったよ。
色々書いてある場合は、順番に気にしないとーって感じかな。
あと、afterLayoutのあとに、afterFilterが動いてるとはおもわなんだ。
っつーことは、携帯とかの小文字処理とか、エンコード変換とかapp_controllerのafterFilterでやったほうがいいのかな?
afterLayoutのときは、こんな感じで取れたんだけどー
function afterLayout() { $view =& ClassRegistry::getObject('view'); $buffer = $view->output; // $bufferの処理。文字コードとか。 $view->output = $buffer; // 戻す。 }
Controllerの場合は、$this->outputで、表示する内容が取得できる。
試しに、mb_convert_kana($this->output, “R”)かけてみたら、全部全角になった!(echoしてる部分は除きます)
っつーことで、これからはafterFilterでやるようにしよう。
Cakephpで同じアクションである条件のもとでテンプレートを変える。
11 月 9, 2008
携帯サイトの開発とかの場合、旧機種(3G以外)と、新機種(3G)とかで分けることもあるかと思います。
(最近はドコモ、au、Softbank以外にも、e-mobileやらiPhoneやらWindowsモバイルやら色々ありますけど)
で、同じアクションだけど、テンプレートの中にif文で場合わけしても見づらいんで、テンプレート分けたいよねってときようです。
Cakephpはアクション名=テンプレート名となります。
じゃ、「レンダリングする前に、アクション名変えちゃえばいいんじゃね?」ってことが予想つくと思います。
ってことでこんな感じでいかがでせう。
前回のコード使いまわしwサーセンw
class UserInfomationController extends AppController { var $name = 'UserInfomation'; var $uses = array("UserInformation"); function beforeRender() { // 例えば$_SERVER['HTTP_USER_AGENT']を見てテンプレートを変えるような処理などを追加。 $this->action = $this->action . "_html"; } function index() { $result = $this->UserInformation->findAll(); } }
ってな感じで、beforeRenderを使ってアクション名を変更してやれば全て解決。
(この場合は、適切な場合わけ処理を入れてないので、全部のテンプレートに_htmlをつけたファイルが必要。indexのアクションならindex_html.ctpがテンプレートとなる。)
まぁあとは携帯の場合ヘッダとかもxhtml用とかになってることも多いだろうから、$this->layoutなどでlayoutも変えたほうがよいかな。
あと、全部2種類テンプレート作るのめんどくさい!っていう場合はファイルの存在file_exists等で確認して、なかったらデフォルトのファイルを使うようにしてあげたようが吉。
CakePHPで規約に沿わないDBを使う
11 月 6, 2008
Cakeのmodelは基本的に、テーブル名は複数形、primary keyはidを色々な規約がありますが、
それに沿わないアプリケーションの場合どうやって使うのかなーなんて思ってソース読みながら、試行錯誤したら以外とあっさりできたのでメモ。
ちなみに、cakeはcake_1.2.0.7692-rc3で試してます。
テーブル
create table user_information ( info_id INT(11) unsigned NOT NULL, name VARCHAR(255) NOT NULL default "", PRIMARY KEY (info_id) ); INSERT INTO user_information (info_id, name) VALUES (1,"test"),(2,"test2");
user_informationというテーブルを作るが、複数形でもないし、idも持っていない。
user_information.phpというmodelを作る。
class UserInformation extends AppModel { var $name = 'UserInformation'; function __construct() { $id = array("id"=>false, "table"=>"user_information", ); parent::__construct($id); } }
何も難しいところはなし!Cakeの本体ソース読めばわかると思うけど、コンストラクタで、nameやらaliasやらtable名を変更できる。ので、上書きしているだけ。っつーかidはいらねーな。ちなみにidはUPDATE用だと思う。詳しく調べてないので、デフォルトの
falseを指定しておきます。
あとは、いつも通りにコントローラで使うだけ。
class UserInfomationController extends AppController { var $name = 'UserInfomation'; var $uses = array("UserInformation"); function index() { $result = $this->UserInformation->findAll(); } }
これで$resultは最初にインサートした、2つのデータ全部取得できます。簡単ですね。
しかし、このmodelだと保存(save)ができないので、modelを一部修正する。
class UserInformation extends AppModel { var $name = 'UserInformation'; function __construct() { $id = array("id"=>false, "table"=>"user_information", ); parent::__construct($id); $this->primaryKey = "info_id"; // 追加 } }
primaryKeyを、そのテーブルのprimaryKey名で指定する。
これは、コンストラクタで上書きできないようになってるので、この方法しかなさげ。(ちなみにデフォルトでidになるようになっている)
で、あとはいつもの通りのsave!!・・・というわけにもいかず。
controller内ではちょっと違った指定の仕方をします。
function hozon() { $save_data["UserInformation"] = array("info_id"=>3,"name"=>"test3"); //ここ注意 $this->UserInformation->create(); $this->UserInformation->save($save_data); die(); }
基本の型は同じなのですが、注意はarray(”info_id”=>3,”name”=>”test3″);この部分。
カラム名=>値の配列で渡してあげないとsaveしてくれませんので、注意。
とりあえず基本のfindとsaveができるようになりましたね。
以外と簡単に置き換えられたので、既存のアプリの移動も簡単そうかも。
ほかの関数は必要になったら調べますー。
Editor history
10 月 28, 2008
最近もっぱらviな私ですが、大学のときにプログラム書き始めて色々(さほど色々使ってないけど)使ったなぁということで、適当に書いてみる。
- 大学時代
研究室に配属されて、初めてプログラミングをする。あー正確には初めてじゃないな。初めては授業でやった「MATLAB」という言語。配列に強い。多分知ってる人はこれて何科かわかるはずw
研究室では、Javaをやっていました。
ので、もちろん使うは「メモ帳」。とコマンドプロンプト。
毎回書いては $ javac ~~~ なんてことやってた。そんなのを2,3ヶ月。
- 大学~大学院時代
研究室の先輩から、「Eclipseがいいよ!」といわれ導入する。無料だったし。バージョンは多分1.2くらいだったような気がする。2.1?あれ?忘れた。
リアルタイムで文法チェックしてくれる!保存しただけでクラスファイルが生成される!ということで文句なしでした。
スペックがかなりよかった(あのころにしては。。。という意味で)から使えたんだなーと思う。
- 社会人初期
今ではまったく書けないperlをやってた。で、基本サーバ内コーディングだったので、emacsを使ってました。
もともとタイピングが嫌いじゃなかったので、なんでもかんでもキーボードでできてすげー!とか思ってた。
保存しようとして、Ctrl+s押してよく検索にしてたのはよい思い出。今はもう使えなくなったなー。
あ、このころ大学のときにちょっと使ってたxyzzyというエディタがemacs風だったってことを知った。
- 社会人中期
ペチパーに転向。
ちなみに初めて触ったコードはquick_form_controller。レアすぎるだろ!ECサイト作ってた。
そのころフリーのエディターで何使ってよいかわからなかったので、先輩から教えてもらったphp editor+WinSCPでした。
でもこの環境が地味に楽で、2年くらいはこれでやってました。あまり環境に依存もしないし、重くって落ちるってこともなかったしね。
- ちょっと前
新しい会社に入り、vmwareを自分のPCに入れて、samba立ち上げて、さてエディタはどうしようか・・・ってことで、会社の人がeclipse使ってたので初心に戻って使ってみることにした。
しかし、よくわかんないけどsambaとの相性が悪くてぼこぼこ落ちてた。sambaのフォルダimportしてもうまくできなかったり、vmwareとeclipse立ち上げてるとなんか重いし(多分原因はスレイプニルにありそうな気もするけど)ってことでやめ。
それにeclipseに慣れてしまうと、eclipseが動かなくなったときに仕事ができなくなるという問題もあった。
- 現在
で、やっぱemacsかviかなーとか思ってたんだけど、なんとなくviにした。
emacsは使ったことあるし、それにviとかならhttpd.confだったり編集するときに使うし便利かなーと思って。
使ってみたら、これはいいわー!ですよ!
まぁ素人なんで「なんか俺エンジニアっぽい」みたいなこと考えてニヤニヤ。エディタ分割などの操作法もちょくちょく覚えたら普通に開発できるようになった。
いまはもう少し発展して、phpの辞書入れてみたり、vi内で文法チェックするとか入れてみてもっとニヤニヤしてます。
当分はvi使うだろうな。どれにも入ってるし。.vimrcだけメモしておけばすぐ設定反映できるしね。
ってことでもう少しがんばってviの勉強する!
vmware serverのbridgeネットワーク設定
10 月 23, 2008
かなり個人的なメモ。
vmware serverおすすめよ!と言われたので、vmware serverをインストールしてちょこちょこ設定してみた。
会社だとplayer使ってるんだけど、serverって前の会社で使ってたな。イメージもらって使ってたから何も設定してなかったけど(´A`)ハハハ
で、apacheやらphpやらインストールして、apacheを立ち上げて!いざ!とアクセスしてみたらNot found。。。
どんな状況だったか。
- vmwareはbridge接続。
- IPはDHCPで。
- windowsからゲストOS(vmware)にpingは通る
- ゲストOS(vmware)からwindowsにpingは通らない
- ゲストOS(vmware)からgatewayにpingは通る
- ゲストOS(vmware)からyahoo.co.jpとかにpingは通る
という、windows←→ゲストOS間での接続がうまくいかなくて、うーんうーん言っておりました。
まぁ結論からいうとfirewallに引っかかてたぽい。
- # setup
- → Firewall configuration
- →→ Disabled
- setup終了
- # /etc/init.d/netword restart
で表示されたけど、本当は切らないほうがよいんだろうなぁーとか思ったんだけど、プライベートのネットワークだし、ルータの通してるしいいのかなー
時間があったら調べる。とりあえず開発ができるからよし。
