#navi_header|PHP|
'' 2005年6月前後のHTML_QuickFormについての話となります。アップデートできてなくて御免なさい。 ''
HTML_QuickFormでレンダリングする時、Smartyレンダラを使うとやたらと処理が重くなる現象が2005年6月当時発生していました。1500msほどがSmartyレンダラの処理で費やされていました。
xdebugで追い掛けたところ、HTML_QuickFormのデフォルトのSmartyレンダラは
- setRequiredTemplate
- setErrorTemplate
で指定されたSmartyテンプレートを '' 要素毎に ''
- _renderError()
- _renderRequired()
これら二つのメソッド内部で、 '' ローカルにSmartyコンパイルしている '' というとんでもない事実がありました。だから遅かった訳です。
逆を言えば、そもそもrequiredやerrorの時にSmartyテンプレートを '' 使わなければ '' 、毎度毎度Smartyコンパイルする必要もないわけです。
よって、以下のような派生クラスを用意してこれをレンダラとして使うことにしました。
class FastQuickFormRenderer extends HTML_QuickForm_Renderer_ArraySmarty
{
// _required, _error が定義されていないと、各rendererが呼ばれない。
var $_required = " "; // ダミーで良いので定義しておく。
var $_error = " ";
function HTML_QuickForm_Renderer_ArraySmartyLight
(&$tpl, $staticLabels = false)
{
$this->HTML_QuickForm_Renderer_ArraySmarty($tpl, $staticLabels);
}
function _renderRequired(&$label, &$html, &$required, &$error)
{
if(!empty($error)) {
$label = sprintf('%s', $label);
} else {
if(!empty($required)) {
$label .= '*';
}
}
}
function _renderError(&$label, &$html, &$error)
{
if(!empty($error)) {
$html .= '
'.$error.'';
}
}
}
Smartyコンパイラを起動する関数を、単なる文字列処理に上書きしてしまうわけです。んで、この上書きしたレンダラクラスを使用すればオッケーな訳です。
Smartyを使うほど凝ったレンダリングが必要なわけではなくて、単にエラーとかその辺りをちょっとアプリ側でカスタマイズできれば良かったので、この程度でOKでした。
・・・何で2005年当時はSmartyレンダラ使おうと思ったのかな?単にアプリ側でSmartyを使ってたからかな?思い出せない・・・。
#navi_footer|PHP|