RadPHP XEでTemplateEngineにSmartyTemplateを指定すると、PageのOnLoadイベントとOnUnloadイベントが呼ばれない問題をEmbarcadero Discussion Forumsで質問しました。
TemplateEngineを使用しない場合は、OnLoadイベントとOnUnloadイベントはbodyタグに記述されます。
<body style=" margin-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; " onload="return Unit1JSLoad(event)" >
一方、SmartyTemplateを使用する場合は、bodyタグは自分でテンプレートファイルに記述することになります。
そうすると、bodyタグにonLoadやonUnloadの記述がないため、OnLoadイベントやOnUnloadイベントが呼ばれません。
<html><body>
{%$HeaderCode%}
{%$StartForm%}
{%$EndForm%}
</body></html>
もちろん、テンプレートファイルに直接onLoadやunUnloadを記述すれば、イベントを呼ぶことができます。
<body onLoad="xxxx(...)" onUnload="yyy(...)">
ですが、今回はテンプレートファイルを複数のページで利用しているため、特定のページ向けの変更はしたくありませんでした。
それに、RPCLの不具合のような気もしますし。
そこで、bodyタグにonLoadやonUnloadを記述するのではなくて、JavaScriptでイベントを登録する方法を検討しました。
window.onload = Unit1JSLoad;
この方法を実現するには、以下の変更を行うと良さそうです。
forms.inc.phpの1575行目に次のコードを追加する
if ($this->_jsonload!=null || $this->_jsonunload!=null) {
$sp.="<script type=\"text/javascript\">";
$sp.="if (window.addEventListener) {"; //for W3C DOM
if ($this->_jsonload!=null) $sp.="window.addEventListener(\"load\", $this->_jsonload, false);";
if ($this->_jsonunload!=null) $sp.="window.addEventListener(\"unload\", $this->_jsonunload, false);";
$sp.="} else if (window.attachEvent) {"; //for IE
if ($this->_jsonload!=null) $sp.="window.attachEvent(\"onload\", $this->_jsonload);";
if ($this->_jsonunload!=null) $sp.="window.attachEvent(\"unload\", $this->_jsonunload);";
$sp.="} else {";
if ($this->_jsonload!=null) $sp.="$this->_jsonload";
if ($this->_jsonload!=null) $sp.="$this->_jsonunload";
$sp.="}";
$sp.="</script>";
}
上のコードは、addEventListenerやaddEventListenerを使って、onLoadイベントとonUnloadイベントに追加しています。
参考:イベントに処理を追加する
forms.inc.phpの1740~1741行目をコメントアウト
//if ($this->_jsonload!=null) $attr.=" onload=\"return $this->_jsonload(event)\" ";
//if ($this->_jsonunload!=null) $attr.=" onunload=\"return $this->_jsonunload(event)\" ";
このコードは、bodyタグのイベント登録処理をやめています。
これでTemplateEngineが無指定とSmartyTemplateのどちらでも問題なく動作しているようです。
他に次のイベントも呼ばれないようです。
- OnAfterShowFooter
- OnBeforeShowHeader
- OnStartBody
修正するのはちょっと大変そう。