人気記事

広告

記事検索

MOVION.netについて

WEB技術に関することや、気になるWEBサイトなどについて個人的なメモを残すためのブログです。

その他運営サイト

かかわっているサイト

2008年03月24日(月)

ZendFramework1.5にしてみたら

URLからアクション名、テンプレートファイルへのマッピングが変わってるっぽく(デフォルトでは)、「アクションが見つかりません」エラーが多発。そもそも、複数単語のアクション名をアンダースコアでつないでたのが悪いのですが、そこをハイフンになおさなきゃいけなそう。

1.0.xでは、
URL: /game/detail_map
の場合、
Controller: Game
Action:detailMap
Template:detail_map.html
でいけてたが、

1.5では、アンダースコアでつなぐと単純にアンダースコアが削除された文字列がアクション名になるので、
1.5では、
URL: /game/detail_map
の場合、
Controller: Game
Action:detailmap
Template:detailmap.html
となってしまう。

そんなわけで、ハイフンでつなぐ記法に修正することにしました。
そうすれば、以下のようになるはず。

URL: /game/detail-map
の場合、
Controller: Game
Action:detailMap
Template:detail-map.html

2008年03月5日(水)

Zend_MailのsetSubjectが僕をいじめる

Zend_MailとSmartyを組み合わせた、メール送信のクラスを作ってみたのですが、
どうも長いタイトルのメールを送ると、タイトルの途中に「?」が入るからソースを見てみたら。

  1.    public function setSubject($subject)
  2.     {
  3.         if ($this->_subject === null) {
  4.             $subject = strtr($subject,"\r\n\t",‘???’);
  5.             $this->_subject = $this->_encodeHeader($subject);
  6.             $this->_storeHeader(‘Subject’, $this->_subject);
  7.         } else {
  8.             throw new Zend_Mail_Exception(‘Subject set twice’);
  9.         }
  10.         return $this;
  11.     }

って、おい。

そりゃ「?」になるよ。
ググったら、ふらっとさんのページやいしなお!さんのページに同じことが書かれてました。

_encodeHeaderメソッドとかを見るとやりたいことはわからないではないが、
いずれにしても日本語(に限らないようだけど)送るときに困っちゃいます。

RFCでいうとこの辺か。

RFC 2822 (Internet Message Format)

RFC 2047 (MIME Part Three:Message Header Extensions for Non-ASCII Text)

とりあえず、RFC 2822の「SHOULD be no more than 78 characters」この辺の、”・・べき”は、
見なかったことにして、かつ長すぎる(符号化後の半角換算998文字)タイトルは考慮しないってことで、
いしなお!さんのとこのように、改行は削除する仕様にしちゃいました。

2008年02月29日(金)

PHPのフレームワーク

PHPのフレームワークを自分用メモ。 以下、主なPHPのフレームワーク。

  • Symfony
    • http://www.symfony-project.org/
    • PHP5
    • The MIT License (他にも含まれてるけど・・・)
    • ベースはmojaviで、Railsっぽくなっている。
    • 今のところ、一番完成度が高い気がする。
    • 一人で作るようなWEBアプリにはあまり使う気がしない。
  • Zend Framework
    • http://framework.zend.com/
    • PHP5
    • New BSD License
    • まんま、Zendさんがつくってる。
    • 今のところ、自動生成系の機能はなさげ。
    • ライブラリ的要素の方が多い気が。
  • CakePHP
    • http://cakephp.org/
    • PHP4 / 5  (5対応というより、5でもエラーが出ないという感じで、プログラム自体が5でかかれている訳ではない。)
    • The MIT License
    • ケーキ(Cake)を焼けたり(bake)、名前の付け方がちょっとおもしろい。
    • ちょっとしたWEBアプリを作るにはよさげ。
  • Ethna
  • Piece Framework
    • 調査中

以下、現在はたぶん開発が停止している。

  • Maple (和製。DIコンテナとか)
  • Mojavi (一時期流行った。ダミーのホームページが復活してるみたい・・リンク押せないけど http://www.mojavi.org/
  • Agavi (Mojaviの派生。Railsとは違った方向に進んでたが)
2008年02月11日(月)

assign時にデフォルトでhtmlspecialcharsを行うようにする

個人的にお遊びサイトを開発中(ポンティ)なのですが、
ふとタグを入れて投稿したらhtmlエスケープされてない・・・。
駄目駄目じゃないっすか。

普段、標準でエスケープされるフレームワークを使ってて、
久しぶりにSmartyを使ったもんだから、
Smartyってデフォルトでエスケープされなかったっけ?
と思ってしまいました。

Smartyにdefault_modifiersってのがあるようなので、
それでもできそうですが、なんかめんどくさそうだったので(http://blog.asial.co.jp/309)、
assignの時にエスケープするようにしてみました。

フレームワークはZend Frameworkを使ってて、Smarty用Viewの具象クラスはもちろん作ってたので、
そこに手を加えてみました。
Zend FrameworkでSmartyを使う方法などはZendのドキュメントなどを参照のこと。

  1. require_once ‘Zend/View/Interface.php’;
  2. require_once ‘Smarty.class.php’;
  3.  
  4. class Pontiy_View_Smarty implements Zend_View_Interface
  5. {
  6.         protected $_smarty;
  7.  
  8. // 大部分省略してます
  9.         public function assign($spec, $value = null)
  10.         {
  11.                 if (is_array($spec)) {
  12.                         $spec = $this->h($spec);
  13.                         $this->_smarty->assign($spec);
  14.                         return;
  15.                 }
  16.                 $value = $this->h($value);
  17.                 $this->_smarty->assign($spec, $value);
  18.         }
  19.  
  20.         public function assignNoEscape($spec, $value = null)
  21.         {
  22.                 if (is_array($spec)) {
  23.                         $this->_smarty->assign($spec);
  24.                         return;
  25.                 }
  26.                 $this->_smarty->assign($spec, $value);
  27.         }
  28.  
  29.         private function h($string){
  30.             if(is_array($string)){
  31.                 return array_map(array($this,‘h’),$string);
  32.             }else{
  33.                 return htmlspecialchars($string,ENT_QUOTES);
  34.             }
  35.         }
  36.  
  37. }

hメソッドは関数でよいのだけど、基本関数群を置く場所を考えてなかったので、
とりあえずクラスの中につっこんでしまいました・・・。