Zend_ViewでSmartyをラップする3

昨日、ActionコントローラのinitViewをオーバーライドが簡単って
書いたばかりですが、こんなドキュメントを見つけました。
別件でヘルパーかプラングインを作ってみようとしてたときです。

ここの【例 7.10. パスの指定方法の変更】の部分です。

テンプレートエンジンをSmartyにするだけなら、これがより簡単です。
見つけたとき、軽く衝撃でした。

Smartyを使いつつ、私がやりたいこと(現在の方法で実現していること)が
この方法を使ったときに実現できて、かつ簡単なら乗り換えようかと。

結果は、またこのブログに書きたいと思います。

Zend_ViewでSmartyをラップする2

ドキュメント読んだり、ソースおったりしているうちに、
Zend_Controller_ActionクラスのinitViewをオーバーライドして、
Front Controllerにて、noViewRendererをtrueに設定して、
各アクションの最後に、$this->render()で、画面表示するのが、
一番楽なんじゃないかという結論に達しました。

重要なのは、initViewの中で、$this->viewに、Zend_View_Interfaceに
沿って作成したSmartyクラスを設定すること。
これがあって初めて、既存の$this->render()などが利用できます。

なぜこの方法にいきついたかの理由は、デフォルトのテンプレートエンジンである
Zend_Viewを利用する際には、ほとんど利用されていないメソッドだからです。
Zend_Viewを利用する場合、Zend_Controller_Action_Helper_ViewRendererという
ヘルパークラスが利用されています。

Frontコントローラーで、noViewRendererが設定されるなどして、
自動でレンダリング(画面描画)する機能がOFFにされていない限り、
上記のヘルパーを介して、Zend_Viewクラスを利用しています。
Zend_Controller_Actionの中の以下のメソッドでは、
上記ヘルパー内の同名のメソッドを呼び出します。

  ・render
  ・renderScript
  ・getViewScript

initViewに関しては、Actionクラスの生成時に同時に生成される
上記ヘルパークラスを、リターンするという内容になっています。

noViewRendererがONになっているときに、これらのメソッドを自分でプログラムに記述し、
Zend_Viewクラスを生成して、画面描画することもできますが、Zend_Viewを使うなら、
自動で行ってくれる処理を、なぜ手動にするか理由が見当たりません。
(自動描画は、必要な時だけOFFにすることもできるのです)

なので、別のテンプレートエンジンを利用するときに、オーバーライドするなら、ここかなと思ったのです。
ヘルパーを作るっていう手段もありますが、オーバーライドした方が簡単そうだったからです。
そのうち、勉強をかねて、ヘルパーを作る方法を試すかもしれません。

Smartyを利用することで、テンプレートの拡張子もデフォルトの”.pthml”でないものを
使いたい方もいるでしょう。その場合は、Actionクラス内のpublic変数である $viewSuffixを
書き換えることで変更可能です。

initViewを再定義した場合、Actionクラスのinit()などで呼び出さないと、
renderするタイミングまでインスタンスが生成されないため、テンプレートに
値を設定することができませんので、お忘れなく。

海南鶏飯食堂

クラブで知り合った友達が、料理長をしている恵比寿の海南鶏飯食堂へ。

食べたことある友達から、あれは一回食べにいった方がいいよと勧められつつも、
ランチの時間に起きれなかったり、場所がよくわからないままだったりで、
今までいけていなかった。ごめんなさい。

ついに食べに行くことができたんだけど、これがとてもおいしい!!
しかも、安い!!!!ごはん、ソースお代わり自由で。1000円きってる。
大盛りでも1200円ちょい。普通盛りでも、私には十分な量の鶏がのってる。
お客としてはすごいうれしいけど、ちょっとサービスしすぎじゃと思うくらい。

ご飯は、長細いもので、鶏とソースによく合う。香りもとてもいい。
ソースは3種類。黒いのと、赤いのと、白っぽいの。
最初は別々に食べていたけど、全部混ぜてしまうのが一番おいしいといのが、
ここを何回も食べに来ている常連さんの意見。たしかにうまい。

そして鶏。私は、鶏の皮が苦手です。
牛スジも、もつ鍋も、あのクニュクニュした歯触りが苦手なんです。
でも、ここの鶏の皮は、すんなり噛み切れて、なんの抵抗もありませんでした。
ソースをつけなくても、鶏だけでも十分おいしい一品です。

あの味は定期的に食べたくなる味です。周りの人達の声に納得がいきました。
デザートにはぜひマンゴープリンを頼んでください。これもうまいです。
2つ食べても、1200円くらいです。これでおなかいっぱい。
土日も営業していますので、ぜひ訪れてみてください。

ららぽーと豊洲

王様のブランチで、よく登場していた「ららぽーと豊洲」

夜の予定まで時間があったので、行ってみた。
これが結構楽しい。
服、家具、雑貨、食べ物、ゲームセンター、映画館。
それに生活に必要な、歯医者とかも。おしゃれっぽいスーパーも。
あれ1つあったら、とりあえず生活はできるなと思うほど。

3時間くらいいたけど、とてもまわりきれない。
セール終盤なこともあって、ソファーが半額になっていたりと、
見ているだけでも、結構楽しめた。家具が半額って、あんまり見ない。

家族づれを想定してるのか、エスカレータの数も充実しているし、
店の中の通路はベビーカーでも十分通れる広さが確保してある。

ソフトクリームがおいしかったですよ。オススメです。

メール送信の注意点(Zend_Mail)

以前の記事で、Zend_Mailを使って、メールサーバにSMTP認証し、
メールを送信する方法を書きましたが、そこの記述で問題がある部分がありました。

Zend_Mailを生成する際に、パラメタとして ‘UTF-8’を設定しています。
これでも、正常に送信できることはできるんですが、件名が日本語で、
かつ、ある一定以上の長さになった場合に、途中で切れてしまう現象が発生しました。

Zend_Mailのソースを追おうかと思いましたが、面倒なのでやめました。

件名、本文を、mb_convert_encodingで、’ISO-2022-JP’にエンコードし、
Zend_Mailを生成する際のパラメタも同じく ‘ISO-2022-JP’にすることで、
件名が途中で切れる問題は回避できました。

結局、エンコードが必要なのかって思ってしまいますが、
大した手間ではないし、いいかなと。

=====

解決と思ったら、今度は送信者名の末尾に文字化けのような文字がついてしまいました。
Zend_Mailのパラメタを’UTF-8’にしていなかったときは、化けていなかたのに。
送信者名は必ずつけたいというわけではないので、
削除してISO-2022-JPで、今回はいくことにします。

解決策をご存じの方は、ぜひコメントください。助かります。

最高の褒め言葉

恵比寿のDJバー、Jar Jamに遊びに行ったときのこと。
私が好きなDJさんのことを、自分でレコードとか持たなくていいから、
あの人がずっと家にいて、好きなときにDJを聞かせてくれたら、
もうそれだけでいいよねって話をしていた。

私が好きなDJさんの友達の言葉。
これって最高の褒め言葉だと思う。

Zend_ViewでSmartyをラップする

これを知るまで、Contorollerで、Smartyクラスを生成して使っていたけど、
Zend_Viewのドキュメントに記載されていた、Smartyをラップする
Zend_Viewクラス(ex Zend_View_Smarty)を作成して、これを利用することで、
Smartyの便利さはそのままに、テンプレートへの値の設定がさらに楽に!!!

簡単に言うと、$key っていう変数に、$valueを設定しようとした場合、
$this->_smarty->assign($key, $value);
と書いていたのが、
$this->_view->$key = $value;
ってかけるようになるんです。
assignの記述で、よくスペルミスしていた私には、重宝する機能です。

smartyの設定(delimiterとか)も、連想配列にして、Zend_View_Smartyクラスの
生成時に、第2パラメタとして渡したら有効になります。
テンプレートへのパスも、setScriptPathではなく、生成時に設定した方が楽です。

すでに、Zendで、Smartyを使っている方でも、変更量は少なくてすみますので、
試す価値有りと思った方は、ぜひおためしくださーい。

この方法を採用していると、テンプレートエンジンを変更しようとおもった際の
ソースの改修もラッパークラスを変更するだけですみます。
テンプレートは大幅な改修になることは、避けられませんが。

DB操作にしても、変数に代入するイメージで、設定できるっていう
Zendの特徴を生かしたSmartyとの連携方法だと思います。

これをやったら、既存のZend_Viewのように、Zend Frameworkが、
Zend_View_Smartyを生成して、テンプレート特定して、画面表示までを
やってくれないかなーという欲がでてきました。
Zend_Controller_Actionを継承して、initViewあたりを再定義したら、
できそうだけど、他にもっと楽な方法がないか探して見ます。

存在しない、URLが指定された場合、action名の方は任意の処理を
入れれる方法がわかっているのですが、controller名が存在しない場合は、
エラーになるだけなので、ここをどうにかしたいところです。

Front Controllerを継承したクラスを作るのはちょっとおっくうなので、他の方法で。

中目黒あきら

月の中旬は、普段とは違うおいしいものを食べに行く時期になっている。
今回は【中目黒あきら】っていう、鶏料理のお店。
オススメは、チキン南蛮。

以前に食べにいった、中目黒の宮崎料理のお店【よだきんぼ】の
チキン南蛮が絶品で、うますぎたから、今回も楽しみにしてお店へ。

ここのチキン南蛮もうまい!!
衣自体に味がついているようで、甘酸っぱい感じがとても好き。
あと、鶏の刺身をわさび醤油で食べたのと、白菜のサラダ??がうまかった。
この3つを食べに行くのを目的にしてもいいと思う。

今回は、最後のご飯に、照り焼き丼を選んだけど、卵ご飯がボリューム的にちょうどよかったかも。
要は、うまかったんで、全体的に食べ過ぎました。

行くときは予約をしてから、行った方がいいですよー。
目黒川沿いなので、桜の季節に窓際に座れたなら、贅沢な時間が過ごせそうです。

Zend_Config_Iniの使い道

Zend_Config_Iniは、設定値や固定のプルダウンメニューリストを定義するのに便利です。

まずは、iniファイルを定義します。

[default] ←ブロック名

database.adaptor         = Pdo_Mysql
database.config.host     = localhost
database.config.username = user
database.config.password = password
database.config.dbname   = test

menu.0        = menu0
menu.1        = menu1
menu.2        = menu2

それをプログラムにて、Zend_Config_Iniクラスを生成する際に読み込みます。

$config = new Zend_Config_Ini(iniファイル名(パス含む), 'default');

$config->database->adaptor

で、”Pdo_Mysql”にアクセスできます。
また、$config->database->config->toArray()とすると、

array(
'host' => localhost,
'username' => user,
'password' => password,
'dbname'   => test
);

が取得できます。

また、menuの例だと、
$cofig->menu->0
とアクセスすると、エラーになります。
数字1文字は変数名として認められないようです。
しかし、$config->menu->toArray()は有効になるので、
添え字が数字の固定配列を定義するのには使えます。
これは、結構便利なんじゃないかと思います。

今は、Zend_Validateクラスを試しています。
自分で入力チェックするのと手間はあんまり変わりませんが、
バリデータチェインは便利ですね。

今回のドキュメントは、こちらです。

Zend_ControllerとRequestクラス

Actionコントローラーの中で、
$this->getRequest()
と書くと、リクエストオブジェクトが取得できる。

$_POST、$_GETの情報も、Controller名、Action名もこの中。

$this->getRequest()->getPost();
$this->getRequest()->getQuery();
$this->getRequest()->getControllerName();
$this->getRequest()->getActionName();

$_GETは、ちょっとメソッド名がイメージしづらいけど、ここは覚えるのみ。
getPost()、getQuery()は、パラメタにキーを渡すと、キーに対応する値を取得してくれる。

それ以外にも、setParam($key, $value)で、リクエストオブジェクトに値を設定可能。
これは、いつでもgetParam($key)で取得可能。
getParam()だと、$_POST、$_GETのパラメタも取得可能ですが、
getUserParam()だと、setParam()で設定した値のみが取得可能。
ここは使い分けた方が、プログラムの可読性が増すかなと思います。

あと、発見だったのが、Zendでは、
http://test.com/controller名/Action名/key/value/ 【1】
というようにパラメタを渡せます。
http://test.com/controller名/Action名/?key=value 【2】
としても渡せます。

この場合、【1】の場合は、keyはsetParamで設定したものと同じように扱われおり、
【2】の場合は、$_GETに設定されています。
パラメタの記述方法で、保存される場所が変わるので、気をつける必要があります。

次回は、便利だなと思った。Zend_Config_Iniについて書こうかなと思います。

今回書いたことは大体、ZendFrameworkのドキュメントに書いてあります。
ドキュメントは、こちらです。