RadPHP XEでTemplateEngineにSmartyTemplateを指定すると、PageのOnLoadイベントとOnUnloadイベントが呼ばれない問題の対策

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

修正するのはちょっと大変そう。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です