include_metas()が正しくエンコードを処理できない問題
metaタグに関連するデータを出力する関数include_metas()はUTF-8以外のエンコードでは正しく処理されない不具合があるようだ。たとえば、Shift-JISでは以下のように変換されてしまう。
将来→・cent;来
株式→株・reg;
開発→開・shy;
EUC-JPでもこの問題は確認していて、不具合の理由を調べてみたいと思う。
PHPフレームワークの1つSymfonyの話題について。割と新しいフレームワークであり、Ruby on Railsに似ているといわれる。現在のリリースは0.63。
metaタグに関連するデータを出力する関数include_metas()はUTF-8以外のエンコードでは正しく処理されない不具合があるようだ。たとえば、Shift-JISでは以下のように変換されてしまう。
将来→・cent;来
株式→株・reg;
開発→開・shy;
テンプレートの属性を制御するview.ymlは(init-appで指定した名前)/config/view.ymlとmodules/(module_name)/config/view.ymlが存在しており、後者のview.ymlは前者のview.ymlを継承しているので、変更される箇所だけを指定すればよい。
view.yml内のスペースの数はview.yml内の親子の関係を示しているので、スペースの数は非常に重要となる。
たとえば、has_layoutとmetasは兄弟関係にあるので、
default:は正しくレイアウトが適用されるが
metas:
title: タイトルhas_layout: on
layout: layout_hogehoge
default:はhas_layout, layoutがmetasのこの関係になってしまうので、正しく動作しない。僕はこれで一度ハマったので、注意していただきたい。
metas:
title: タイトル
has_layout: on
layout: layout_hogehoge
Analyticsによるアクセス解析をしていたら意外に「symfony テンプレート コメント」というキーワードで来てもらっている人が多いことに気づく。そこで、Symfonyのテンプレートにコメントする方法について考える。
SymfonyのテンプレートはPHPそのものなので、方法としては、
<?phpが使えると思う。ただ、Smartyのコメントのように{* *}が利用できないことは、テンプレートを実際に変更すると思われるデザイナーの人にコメントを見せられないということが問題になってくるかもしれない。(つまりテンプレートファイルをDreamWeaverなどのオーサリングソフトで処理してしまうと「?」マークになってしまってコメントが出ないからだ)
/*****
ここにコメントするとか
*****/
//こうやってコメントするとか
?>
このエラーが出た場合には、デバッグ用のプログラムを起動させて詳細エラーを出力したほうが良いだろう。デフォルトの場合、front_dev.phpになっているので、(symfonyプロジェクトURL)/index.php/(module)/(action)/を、(symfonyプロジェクトURL)/front_dev.php/(module)/(action)/とすればよい。初歩的なエラーとしては、
・cacheディレクトリに書き込み権限がない(init-projectコマンドで実行した場合にはchmodによって適切な権限が設定されるがWindows環境では動作しないのでこの問題が起こる)
などが考えられる。
http://www.symfony-project.com/weblog/2006/04/25/admin-generator-cheat-sheet.htmlこれを理解できるまでには後どれくらいかかるのだろうか??
Symfonyにて意図的にテンプレートを変更する方法はあるのだろうか?Mojavi+Smartyと同じようにreturnで変更できることがわかったのでいかのとおり示してみる。
class yesnoActions extends sfActions
{
public function executeQuestion()
{
//ここで呼ばれるテンプレートはQuestionSuccess.phpだがreturnすることで変更できる
return 'Result'; //こうすることでQuestionResult.phpを呼ぶことができる。
}//バリデーションからエラーが発生した場合でもSuccessテンプレートを呼ぶ
public function handleErrorConfirm()
{
//テンプレートを共通化する
return sfView::SUCCESS;
}
}
hogehogeプロジェクトをfrontendアプリケーションとして生成する場合。生成したいディレクトリ内で以下を実行します。
symfony init-project hogehoge
symfony init-app frontend
actions/actions.class.php
templates/indexSuccess.php
設定項目
apps/frontend/config/view.yml タイトル類
apps/frontend/config/settings.yml
IISだと.htaccessによるrewriteが利かないので、以下の設定を行う。
prod:
.settings:
no_script_name: on
prod:にする。
.settings:
no_script_name: off
Congratulations!
If you see this page, it means that the creation of your symfony project on this system was successful.You can now create your model and customize default templates.
Symfonyではvalidateディレクトリ内にあるconfirm.ymlに定義されたルールが存在しないか、ルールに合致していれば、templateディレクトリ内の(アクション名)Success.phpが呼び出されるが、ルールに合致しない場合には(アクション名)Error.phpが呼び出される。
入力内容のエラー処理は多くの場合入力前のテンプレートにエラーを付けて表示したりするケースが多いので、これでは同じ内容のテンプレートを2つ書かなければならず問題がある。
そこでactionsディレクトリ内にあるaction.class.phpのhandleError(アクション名)関数をオーバーライドして戻り値を設定してあげるとテンプレートを共通化できる。
※Confirmアクションの例(ここではregistアクションからconfirmアクションに遷移するケースを考える)
public function handleErrorConfirm()
{
//通常テンプレートを返す
return sfView::SUCCESS;
}
echo form_error('nickname');
Symfonyの有用なドキュメント一覧
Symfony API
Symfony開発日記
Symfonyチュートリアルの和訳(第5日目~第7日目)
Symfonyに関する解説本が出版される見込みです。まだ日本語版なんて遠い先ですが、Symfonyは少しずつ定着しつつあるフレームワークのひとつになりそうな予感があります。
今後のWebプログラミングにおいては、フレームワークに対する理解もまた重要なスキルのひとつになることは間違いなさそうです。(クライアントアプリケーションプログラミングにおいては、フレームワーク(ロジックとビューを分離して、コントローラーで制御する)はRADにおいて当たり前のように使われているわけで、ようやくWebプログラムもそれに追いついたのかもしれない)
PHPのフレームワーク Symfony を試してみました。
おかげさまでWindowsで検証された方がいたので、助かりました。
http://papipookoo3.com/wp/?p=4ただ、最後まで読まずにすごいところで躓きました。
実行するとつねにInternal Server Errrorが出る(それもエラーのテンプレートが)のです。
詳細なエラーが何も出ていなかったので、原因を調べるためにフレームワーク内をステップ実行するハメに。結局のところ例外出力をしているところにたどり着いて、結果的にはエラーのテンプレート(error500.html)をリネームすれば例外メッセージが出ることに気づきました。
その結果、、、
magic_quotes_gpc = Off でなかったことが原因でした。
ちゃんとHPに書いてあるのに読まなかったことが最大の時間の無駄になってしまいました。