TinyDのコンテンツをテーマなどに埋め込むために、tinyDプラグインを使うケースが結構ある、という話をjidaikoboさんから聞きました。
TinyDプラグイン
TinyDを開発終了とするなら、このあたりの手当もしなければならないかな、と、5分くらいでpicoプラグインを作りました。
作ってみてからふと思ったのは、「こんなプラグインをいちいち作らなくても、Tomさんがxoops_blockプラグインを作っていたから、それを使えばいいだけでは?」ということです。
xoops_blockプラグイン
さっそく落としてみて思い出したのは、このプラグインはブロックがテンプレートを使う、という前提で、Smartyの別の変数にアサインをし直してくれるものだったのです。確かに、こっちの方が自由度という点でもはるかに使いやすく、プロ向きの仕様と言えます。
でも、D3モジュールのブロックは、ブロック表示関数内で、自分自身でテンプレート処理してしまうので、返すのはレンダー後の結果のみ。これは使いづらい!
同じpicoでも、コンテンツ内容表示ならそもそも構造を持たないので問題になりませんが、コンテンツ一覧となれば、明らかに構造があります。これをアサインという形で得られないのは痛い。
とりあえず、D3モジュールブロック仕様を変更して、XoopsTplでのレンダリングをするか、アサインしたものをそのまま返すか、処理分けできるようにしたいと思います。
class/smarty/plugins/function.pico.php
<?php
function smarty_function_pico( $params , &$smarty )
{
$dirname = @$params['dir'] . @$params['dirname'] ;
$content_id = @$params['id'] + @$params['content_id'] ;
$template = @$params['template'] ;
if( empty( $dirname ) ) {
echo 'error smarty_function_pico [specify dir]';
return ;
} else if( empty( $content_id ) ) {
echo 'error smarty_function_pico [specify id]';
return ;
}
require_once XOOPS_TRUST_PATH.'/modules/pico/include/common_functions.php' ;
require_once XOOPS_TRUST_PATH.'/modules/pico/blocks/content.php' ;
$block = b_pico_content_show( array( $dirname , $content_id , $template ) ) ;
echo @$block['content'];
}
?>
Tom_G3X wrotes:
こんなマニアックなプラグインを引っ張り出してきていただいて恐縮です(^^ゞ
当時、自分の中では画期的なプラグインだったんですけどね。完全に自己満足ですが。(笑)
ですので、ブロック表示関数内で、自分自身でテンプレート処理する直前までを別に関数化して、
xoops_blockで表示したい時、その関数を引っ張ってくる、
また、通常のブロック処理では、その後、自分自身でテンプレート処理する、
ってのなら、出来るかもですね。
更には、file="" で好きなファイルを指定できます。(爆)
もし、TinyD や pico のようなプラグインを多数作る必要があるのでしたら、
それらの関数を1ファイルにした関数集的なファイルを1つ作っておいて、
xoops_block から、ファイル名、関数名を指定して、Smarty変数にアサインすれば、
もしかしたら楽かもしれませんよ。