xoops_blockプラグインとD3モジュール内ブロック(2)

Date 2007-03-29 04:25:25 | Category: XOOPS

in englishin japanese
というわけで、D3モジュール仕様のブロックの最後の処理部分をこうすることにしました。

	if( empty( $options['disable_renderer'] ) ) {
		require_once XOOPS_ROOT_PATH.'/class/template.php' ;
		$tpl =& new XoopsTpl() ;
		$tpl->assign( 'block' , $block ) ;
		$ret['content'] = $tpl->fetch( $this_template ) ;
		return $ret ;
	} else {
		return $block ;
	}

この仕様って、どうかな、とは自分でも思うのですが、ブロック表示関数の2番目以降の引数を勝手に使うわけにもいかないし、グローバル変数で渡すのもナニなので、苦肉の策として、数値インデックスである$options配列に、文字列インデックスを混ぜてみました。

これで互換性の問題は基本的にないはずです。

あとは、ブロックからアサインを引き出すプラグイン側で、オプション配列に文字列インデックス'disable_renderer'を追加すれば良いのです。

xoops_blockプラグインという名前のままHackしてしまうと、バッティングしてしまうかもしれないので、xugj_blockという名前でプラグインを作ってみました。

mod指定だとどうしてもクエリが余計に入るので、その機能は削って、file指定のみとしてます。あと、optの区切り文字が,だと、,を含んだオプションを指定出来ないので、|にしてます(それでも|を含んだオプションは指定できませんが、それはXOOPSのオリジナル仕様なので)。互換性のために、opt=1,2 でも、options=1|2 でも指定出来るようにしてます。
さらに、コード中のeval()がどうしても気になったので、そのあたりも変更してます。

最後に、xoops_blockでは、assign指定がなければエラーでしたが、このプラグインでは、可能な限り、そのまま表示します。アサイン変数名指定は、foreach()などとの互換性を考え、assign の代わりに item でも指定可能としてます。
class/smarty/plugins/function.xugj_block.php

<?php

function smarty_function_xugj_block( $params , &$smarty )
{
	$assign_name = @$params['item'] . @$params['assign'] ;

	$block_file = XOOPS_ROOT_PATH . '/' . @$params['file'] ;

	if( file_exists( $block_file ) ) {
		include_once $block_file ;
		if( function_exists( @$params['func'] ) ) {
			$options = empty( $params['opt'] ) ? explode( '|' , @$params['options'] ) : explode( ',' , @$params['opt'] ) ;
			if( empty( $assign_name ) ) {
				$block = call_user_func( $params['func'] , $options ) ;
				if( empty( $block['content'] ) ) {
					var_dump( array_keys( $block ) ) ;
					echo 'missing "item" in <{xugj_block}>' ;
				} else {
					echo $block['content'] ;
				}
				$block['content'] ;
			} else {
				$options['disable_renderer'] = true ;
				$block = call_user_func( $params['func'] , $options ) ;
				$smarty->assign( $assign_name , $block ) ;
			}
		} else {
			echo 'invalid "func" in <{xugj_block}>' ;
			return ;
		}

	} else {
		echo 'invalid "file" in <{xugj_block}>' ;
		return ;
	}
}

?>




You can read more news at PEAK XOOPS.
http://xoops.peak.ne.jp

The URL for this story is:
http://xoops.peak.ne.jp/md/news/index.php?page=article&storyid=416