Zend_ViewでSmartyをラップする6

今回は、やりたいことの2つ目、3つ目に入っていた
2.プログラムが必要ない場合は、Actionコントローラーを書きたくない
 (Actionメソッドがなくても、テンプレートが表示されるようにしたい)
3.テンプレートもないURLが指定されたら、トップページなど指定のURLに遷移させたい
を実現する方法です。

Zendは、初期状態で、ErrorHandlerプラグインというプログラムが有効になっています。
これは、プログラム実行中に、エラーが発生した場合、
ErrorActionコントローラーのerrorActionというメソッドをよびだしてくれます。

そこで、コントローラークラスが見つからなかった場合、
アクションメソッドが見つからなかった場合の判別が可能です。
私が作った、ErrorActionクラスから必要な部分を抜き出したのが以下です。

class ErrorController extends Zend_Controller_Action
{
 public function errorAction()
 {
  $errors = $this->_getParam('error_handler');

  switch ($errors->type)
  {
   case Zend_Controller_Plugin_ErrorHandler::EXCEPTION_NO_CONTROLLER:
    if ($this->_getParam('action') == 'index')
    {
     $view = $this->getHelper('viewRenderer');
     $view->setNoController()
         ->setScriptAction($this->_getParam('controller'));
    }

   case Zend_Controller_Plugin_ErrorHandler::EXCEPTION_NO_ACTION:
    if (!isset($view))
    {
     $view = $this->getHelper('viewRenderer');
     $this->getRequest()->setControllerName($this->_getParam('controller'));
     $this->getRequest()->setActionName($this->_getParam('action'));
    }

    $template = $view->getViewBasePathSpec() . $view->getViewScript();
    if (!is_readable($template)) $this->_redirect('/');
    break;

   default:
    break;
  }
 }
}

Zend_ViewでSmartyをラップする5

前回で、Smartyの利用と、ViewRendererヘルパーを利用して、
Smartyを利用した画面の自動描画が有効になる方法を紹介しました。

今回は、やりたいことの1つ目にあげていた
1.テンプレートの配置をURLからイメージしやすいようにしたい
ということを実現する方法です。

この方法を実行するのは、各コントローラーのindexActionのみです。
そこで、このどちらかを記述すればOKです。

$this->getHeler('viewRenderer')
   ->setNoController()
   ->setScriptAction($this->getRequest()->getControllerName());

または

$this->render($this->getRequest()->getControllerName(), null, true);

これはどちらも同じ意味になります。

こうすることで、
http://test.com/aaa/ というURLでアクセスされた場合、
templates/aaa/index.htmlではなく、templates/aaa.htmlを読み込んでくれます。

Zend_ViewでSmartyをラップする4

前回の記事で書いたことを試してみました。
私がsmartyとZendを合わせて使う上で、実現したいのは以下

1.テンプレートの配置をURLからイメージしやすいようにしたい
 http://test.com/aaa/ の場合は、templates/aaa.html
 http://test.com/aaa/bbb/の場合は、templates/aaa/bbb.html

2.プログラムが必要ない場合は、Actionコントローラーを書きたくない
 (Actionメソッドがなくても、テンプレートが表示されるようにしたい)

3.テンプレートもないURLが指定されたら、トップページなど指定のURLに遷移させたい

1.は、renderのnoControllerがtrueのときのテンプレート作成ルールを、
コントローラー名+指定拡張子とすることで解決。
ただし、render呼び出しの際に、
$this->render(コントローラー名, null, true)
とする必要がありますが、この部分を簡略化できないかが今後の課題です。

2.はまだ試せてません。しかし、前々回の記事の方法が応用できそうです。
3.も2.と同様に前々回の記事の方法で実現できそうです。

しかし、前回と同様の方法だと、Zend_Controller_Actionのサブクラスを基底クラスとして
作成することになるので、これはできれば避けたいところです。
会員サイトとかなら、基底クラス作るのはいいのですが、Smarty使いたいだけで、
基底クラスを作るとなると、ログインセッション管理をやろうと思ったときに、
テンプレートエンジンに関わるファイルを修正することになりかねません。

index.phpにつぎたした部分は以下です。

require_once('Zend/Controller/Action/Helper/ViewRenderer.php');
require_once('Custom/View/Smarty.php');

$view = new Zend_View_Smarty(null, $smartyConfig);

$viewHelper = new Zend_Controller_Action_Helper_ViewRenderer($view);
$viewHelper->setViewBasePathSpec($smartyConfig['template_dir'])
      ->setViewSuffix('html');
Zend_Controller_Action_HelperBroker::addHelper($viewHelper);

$smartyConfigは、Smartyの設定値の配列です。
Custom/View/Smarty.phpは、Zend_View_Interfaceに沿って、
Smartyが使えるようにしたViewクラスです。
中身は、ここの最後の方にのっているSmartyラッパークラスと同様です。
ただ、function getScriptPaths()に誤りがあります。

return $this->_smarty->template_dir;
  ↓
return array($this->_smarty->template_dir);

とする必要があります。
getScriptPaths()なので、パスが配列で複数取得されることが想定されて、
Zend_Controller_Action_Helper_ViewRendererが作成されているためです。

これでより少ないソースで、smartyと連携できるようになりました。
より手間を少なくする方法がないか、もうちょっと試してみる予定です。
ViewRendererヘルパーと、ErrorHanderプラグインあたりを組み合わせると、
なんとかなりそうな気がドキュメントを読んでいるとするのですが、どうなんでしょう。
あたりがついたら、試してみます。

MTの記事作成画面を見やすくする

私はブログを書く時、テキストで書いてからコピペするわけではなく、
MTの登録画面で直接書いています。そして、書きながら時々保存します。
家で書いたり、会社の休み時間に書いたりするからというのが理由の1つですが、
単に、この編集画面の方が書こうっていうテンションが上がるってのが一番です。

この画面を見続けていると、家のPCの彩度とかをDVDとか動画を見るために
高めにしているのもあって、目がチカチカしてきます。
そこで、背景を薄めの灰色に、文字も目に優しそうな深緑な感じに、
でも、文字はもうちょっと小さめに変更したんです。

思ったより手間取りました。
スタイルシートで、文字の大きさ、文字色はすぐ変更できたのに、
背景だけがなかなか変わらない。全然変わらない。

ブラウザのソースを見るを見てみると、テンプレートのsytle=””で、
直接白が指定されていました。。。
まさかそんなことしてないだろうっていう先入観で、気づくのに30分くらいかかった。

tmpl/cms/edit_entry.tmpl っていうテンプレートです。(MT4を使ってます)
あー、仕事後にZendいじろうって思っていたら、できなかったです。
週末にでもやってみることにします。

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さんの友達の言葉。
これって最高の褒め言葉だと思う。