Smartyのフィルタ

2008/11/28 | Smarty

携帯サイト等シフトJISでサイトを構築する場合、Smartyを使うことにしている。PHP自体はシフトJISでの記述はNGなのでUTF-8で記述し、テンプレートHTMLをシフトJISで記述して使用している。素でそのまま使ってしまうと文字化けしてしまうので、テンプレートを読み込む際にいったん文字コードをUTF-8に変換し、出力するときに再度シフトJISに変換するような処理をしている。

そのときに便利な機能がSmartyのフィルタだ。フィルタにはプレフィルタ、ポストフィルタ、アウトプットフィルタの3種類があり、用途は以下のとおり。

  • プレフィルタ(prefilter)
    テンプレートをコンパイルする際(コンパイル前)にテンプレートファイルに対して処理が施される。
  • ポストフィルタ(postfilter)
    テンプレートをコンパイルする際(コンパイル後)にテンプレートファイルに対して処理が施される。
  • アウトプットフィルタ(outputfilter)
    コンパイルされたテンプレートに対して出力用の変数がアサイン等され、実際に出力する際に処理が施される。

実は最初勘違いしていた。プレフィルタとポストフィルタだけだと思っていた。テンプレート読み込み時にプレフィルタにかけられ、HTML出力時にポストフィルタにかけられると思っていた。Smartyを使った処理を記述する際に、希望通りの動作をしてくれないのでマニュアルを読み直してみて初めて知った。ちょっと恥ずかしい。

拡張子htmlでphpプログラムを使えるように

2008/11/24 | apache

もう何十回もhtaccessに記述しているのに、必要に迫られ、その都度検索している自分が悲しい。メモしておくことにする。

AddType application/x-httpd-php .html

覚えられないのは老化?。

ウェブサイトを移転したときに

2008/11/10 | その他

ウェブサイトを移転をスマートにおこなう方法。移転といってもいろいろな種類があるけど、今回はサーバのコンテンツはまったくそのままで、別のサーバ(もしくは別のディレクトリ)へ移動させる場合を考えた(基本的に別サーバへの移転として考える)。まず新しいサイトを用意しておくのはいいとして、古いサイトから新しいサイトへの移動のさせ方が問題だ。やり方としては4つ思いつく。

  1. 全ページに「移動しました」と掲載する
    全ページに記述しなくてはいけないので大変。
  2. 全ページにメタタグを書いて移動させる
    1と併用。同じく全ページに記述しなくてはいけないので大変。
  3. .htaccessだけで飛ばす
    Redirect permanent /hoge/ http://example.com/hoge
    結局全ファイルだけ書かなきゃいけないか・・・。
  4. mod_rewriteで飛ばす
    mod_rewriteで、リダイレクトさせる。これお勧め。
    RewriteEngine on
    RewriteRule ^(.*)$ http://example.com/$1 [R=301,L]

4が便利でお勧め。このサイトもコレを使って移転しました。古いURL(php.atseason.com)でブックマークしている方は、新しいURL(php.tekmemo.com)でのブックマークをお願いします。

文字コードで最近感じていること

2008/11/09 | PHPの基本

PHPと文字コードの問題にはいつも悩まされる。マニュアルを見ると、やはりいまだに内部エンコーディングとしてシフトJISは扱えないようだ。Zend Multibyteが有効になっていれば大丈夫、という記述を昔よく見たけど、そういえば最近はあまり見ない。でも、やっぱりシフトJISでPHPを記述するのはダメなんだろう。それでも世の中はシフトJISのPHPプログラムだらけなのだが・・・。

まぁ、自分で記述する際はプログラムはUTF-8で書くことにしている。だから制約がない場合は、基本的にプログラム、データベース、出力の全てをUTF-8で統一している。しかし出力をシフトJISにしないといけない場合がある。携帯対応とか、スキルの低いコーダー(シフトJIS以外はわからない)に対応してあげるときとか、だ。

そんなときは、管理画面のみUTF-8で通すなどといったことはやめたほうがよさそうだ。フロントエンドがシフトJISなら管理画面もシフトJISのほうが無難。でも内部エンコーディングはUTF-8。で、やるべき作業は、mb_convert_encoding。で、今更ながらこの関数はちゃんと理解して使うべきだと思っている。もちろんこの関数のみならずマルチバイト関数そのものを理解して使わないといけない。

マルチバイト関数に関する設定項目にscript_encodingやinternal_encodingがあるがまずはこの意味をしっかりと理解すべき。その上でSJISよりもsjis-win、EUC-JPよりもeucjp-win。スキルが低くてもマニュアルに目を通しておくべきだし、文字コードのことは理解していなくても後者を使うべきだろう(と思っているだけで根拠を言えるほどスキルは高くない自分がいる)。

過去の遺産はそうはなっていない。そのときは問題自体はある程度理解していたんだけれど、それでよし、としていた。どうしようか。

放置だな。


守谷市(まちの情報ポータル) 無料アンケートレンタルjpForm.net