Re: EMLH smarty plugin and smarty default_modifiers
easiestmlをテンプレートの編集プラグインとして呼び出すものを作って試してみました。
これを作った理由は、Nu-nrgさんの希望と同じで
記事の管理に手を抜きたいがためで
easiestmlの編集で
複数の言語タグ en , ja , zh
と指定した場合
[en] [ja]
の記事しか書いてなくても
zh のときに
初期値[en]の記事を表示したいけど
ob_startでの一括処理だと対象の範囲が広くて
判定が難しい
それで、全smartyの変数に対して
個々に、easiestmlの編集させてしまおう
という方式にするために作成しました。
(以前からの使用している自作のプラグインがこういう仕様でしてたので)
コードはこんだけです
すごく手抜きですが、
対象範囲内に指定した言語タグが無い場合、
配列の最初(初期値)の言語タグを指定したことに一時的にしてしまう
これでなぜ、変わるかというと
smartyプラグイン方式にすると
下記のテンプレートの標準値に指定できる
そうすると、テンプレートの変数一つ一つに対して
easiestmlの編集をするので範囲が限定される
それで、タグのあるなし判定が効いてくる
というつもり
html/class/smarty/plugins/modifier.domi_easiestml.php
function smarty_modifier_domi_easiestml($str)
{
//option initialize
if (!isset($str)) {
return $str;
}
if (empty($str) || !is_string($str)) {
return $str;
}
global $easiestml_lang;
if (function_exists('easiestml') && isset($easiestml_lang) && defined( 'EASIESTML_LANGS' )) {
$original_easiestml_lang = $easiestml_lang ;
$easiestml_langs = explode( ',' , EASIESTML_LANGS ) ;
if ($easiestml_lang != $easiestml_langs[0] && !preg_match('/\['.preg_quote($easiestml_lang).'\]/i' , $str)) {
$easiestml_lang = $easiestml_langs[0] ;
}
$str = easiestml($str);
$easiestml_lang = $original_easiestml_lang ;
}
return $str;
}
これだけだと、普通の編集用プラグインですが
このプラグインの編集を
EMLHと同様にテンプレートの改造なしで
標準で適用させるために
html/class/template.php
function XoopsTpl()
のコンストラクタの最後に
smarty標準編集の宣言を追加
追伸:書き忘れた
この標準指定が有効になるのはsmartyのテンプレートコンパイルだけなので
一度 template_c/の中のコンパイルキャシュファイルを削除する必要があります。
(英語での説明は面倒なので書かない)
すでに、smartyブラグイン作成済?でしたか?
本買ったけど、まだあまり読んでない
$this->default_modifiers = array('domi_easiestml');
この方法の欠点は、処理がよけいにかかるので
表示が遅くなる可能性があることなので
html/class/template.php
のob_startは、処理として必要がなくなるので、
ここの行だけコメントする程度の変更は必要かな?
スピードが変わらないなら変更しなくても良いですね
html/class/template.php
// ob_start( 'easiestml' ) ;
なるほど。コンパイラフックですか!
どこでもXOOPSコメントと似ていながら違う方式で、かなり面白い手ですね。
確かにこれなら、デフォルト値の設定が可能ですね。
ただ、私の場合、どうしてもキャッシュを有効に効かせたい、という大前提があります。
私自身、サーバ管理者なので、「重い処理は勘弁して」というのが本音ですから
同じフック処理なら、各HTMLキャッシュの読み出し部分を乗っ取る、なんてのも手としてはアリかもしれませんね。それならキャッシュとしては効いていますし、全体のフィルターよりは副作用も少ないでしょう。
その後、情報として書き残しておきます
現時点でわかったこと
$this->default_modifiers = array('domi_easiestml');
default_modifiers の指定を使う方法場合の別の副作用ありました、
これに引っかかると面倒
症状:
最初は、Xoopsのsmartyデバグがエラーで表示されなかっただけなので後回しでしたが
smaryのdebug.tplを調べた結果
テンプレートの記述のうち
致命的な影響でるものがあることがわかりました
(現時点は、smartyデバグテンプレートしか影響はでてないけど)
テンプレートの記述でissetを使っているところがエラーになります(現在smarty2.6.9)
例
{if isset($_smarty_debug_output) 以下略
のような指定を指定いるところでは
Quote:
Parse error: parse error, unexpected '(', expecting T_VARIABLE or '$' in /home/XXXXXX/xo/templates_c/%%XX^XXX^XXXXXXXXXXXX%%debug.tpl.php on line 10
となります。
回避策としては、issetを使っている箇所に
{if isset($_smarty_debug_output|smarty:nodefaults) 以下略
と |smarty:nodefaults の指定を追加すれば動きます
Xoopsのテンプレートで
マニュアルに無いように思うので
issetを使っているものは、少ないと思いますが
やはり、既存使用しているテンプレートの記述との相性がでるようです
if (isset ( ((is_array($_tmp=$this->_tpl_vars['_smarty_debug_output'])) ? $this->_run_mod_handler('domi_easiestml', true, $_tmp) : smarty_modifier_domi_easiestml($_tmp)) )
影響が出ると思われるのは 、smartyのコンパイルキャシュ
ソースを見ると、smartyテンプレートの記述で
default_modifiers
の関数編集が自動で追加されているけど?
構文として?括弧のつけ方はあっていると思うけど
この場所でこの使い方、出来ないのかな?
んーphp文法エラーかな?smartyのコンパイルが悪いのかな?
ともかく、これが前述のエラーとなってテンプレートが表示できないです
ついでに調べた参考:
smarty security モードでもsmarty関数として、
ifの中で使える初期の関数
'array', 'list','isset', 'empty','count', 'sizeof','in_array', 'is_array',
は、smartyマニュアルに使えるとは書いてないような気がするけど?default_modifiers の指定を使うと全滅する可能性があります