* ------------------------------------------------------------- */ /* ***** php側 ***** ** 手動でプラグイン登録 include_once 'function.hetima_tab.php'; HTSmartyPluginTabview::register($smarty [,$customName]); //$customNameは省略可 //プラグイン呼び出し名を変えたい場合$customNameで //array( 'hetima_tab'=>'new_name' ); //と指定する。 ** Ethnaの場合 function.hetima_tab.phpをinclude_onceして、Controller の $smarty_function_plugin に 'smarty_function_hetima_tab'を追加してください。 ** Smarty/plugins に入れる場合 入れるだけでOKだと思います。 //アサイン $options=array( //タブ定義 必須。'タブのid'=>'表示ラベル' のarray 'tabs'=>array('tab_a'=>'tab_a_label', 'tab_b'=>'tab_b_label',...), //以下は省略可 'selected'=>'tab_a', //最初から表示されているタブ(省略するとtabsの最初の項目がselected) 'selected_tab_class'=>'tab_selected', //表示されているタブラベルのclass 'not_selected_tab_class'=>'tab_not_selected', //隠れているタブラベルのclass 'tab_div_class'=>'tab_items', //タブラベルを囲うdivのclass 'tab_content_div_class'=>'tab_content', //タブ内容のdivのclass 'tab_id_suffix'=>'_tab', //タブラベルのidに付け足す文字列 'tab_content_id_suffix'=>'_view', //タブ内容のdivのidに付け足す文字列 'script_prefix'=>'ht_', //JavaScript全般をユニークにするための接頭辞 'return_code'=>"\n", //JavaScript内の改行コード(stylesheet部分も設定できるべきなのだけど、、) 'dummy_href'=>'javascript:void(0);' ); $smarty->assign('myTabview', $options); **** smarty側 ***** {hetima_tab} タブスイッチャー、その他タブ制御に必要なHTMLを出力する。 option 必須。タブの定義array。上記参照。 output ここで何を出力するか 'stylesheet' or 'ss' = タブスイッチャーを装飾するスタイルシートを出力 'script' or 'js' = タブの切り替えを制御するJavaScriptを出力 'tab' = タブスイッチャーを出力 'start' = タブの内容の開始タグを出力。idも必須 'end' = タブの内容の終了タグを出力。単純にを出力。idは省略可だが、付けていると分かりやすい。 output は , で区切って複数の項目を同時に出力できる。 start と end は output を使わず start='tab_id' end='tab_id' と書くこともできる 例: {* ヘッダに stylesheetとscriptを出力 *} {hetima_tab option=$myTabview output="stylesheet,script"} {*タブスイッチャーを出力 *} {hetima_tab option=$myTabview output="tab"} {* タブコンテントを出力:通常型 *} {hetima_tab option=$myTabview id='tab_a' output='start'}content{hetima_tab output='end'} {* タブコンテントを出力:省略型 *} {hetima_tab option=$myTabview start='tab_a'}content{hetima_tab end='tab_a'} stylesheet を変更したい場合 {hetima_tab output='stylesheet'}は使わず、デフォルトの出力を参考に別個で書いてくださいませ。 */ // {{{ HTSmartyPluginTabview /** * classにしたのは名前空間の役割 * * @author hetima * @access public * @package HTSmartyPluginTabview */ class HTSmartyPluginTabview { /** * smarty にプラグインを登録する * * @access public * @param array $smarty Smartyオブジェクト * @param array $customName 省略可。別の名前で登録したい場合は array(name=>customName); * @return null */ function register(&$smarty, $customName=null){ $funcs=HTSmartyPluginTabview::allowedFunctions(); foreach($funcs as $name => $func){ if(isset($customName[$name])){ $name=$customName[$name]; } if($name!='' && $func!=''){ $smarty->register_function($name, $func); } } /* $blocks=HTSmartyPluginTabview::allowedBlocks(); foreach($blocks as $name => $block){ if(isset($customName[$name])){ $name=$customName[$name]; } if($name!='' && $block!=''){ $smarty->register_block($name, $block); } }*/ } /** * コマンドの入り口 smarty function * * @access public * @param array $params オプション * @param array $smarty Smartyオブジェクト * @return string 出力するHTML */ function tabFunction($params, &$smarty) { HTSmartyPluginTabview::_checkParams($params); $buf=''; if(isset($params['output'])){ foreach($params['output'] as $output){ switch ($output) { case 'stylesheet': case 'ss': $buf.=HTSmartyPluginTabview::outputStylesheet($params, $smarty); break; case 'script': case 'js': $buf.=HTSmartyPluginTabview::outputScript($params, $smarty); break; case 'tab': $buf.=HTSmartyPluginTabview::outputTab($params, $smarty); break; case 'start': $buf.=HTSmartyPluginTabview::tabContentStartFunction($params, $smarty); break; case 'end': $buf.=HTSmartyPluginTabview::tabContentEndFunction($params, $smarty); break; default: break; } } } return $buf; } /** * タブの内容の開始タグを出力 * * @access private * @param array $params オプション * @param array $smarty Smartyオブジェクト * @return string 出力するHTML */ function tabContentStartFunction($params, &$smarty) { HTSmartyPluginTabview::_checkParams($params); $id=$params['id']; if(!array_key_exists($id, $params['option']['tabs']))return '';//invalid id $buf=HTSmartyPluginTabview::_contentStartTag($params); return $buf; } /** * タブの内容の終了タグを出力 * * @access private * @param array $params オプション * @param array $smarty Smartyオブジェクト * @return string 出力するHTML */ function tabContentEndFunction($params, &$smarty) { $buf=''; return $buf; } /** * タブスイッチャーを出力 * * @access private * @param array $params オプション * @param array $smarty Smartyオブジェクト * @return string 出力するHTML */ function outputTab($params, &$smarty) { $px=$params['option']['script_prefix']; $buf='
'; return $buf; } /** * タブスイッチャーを装飾するスタイルシートを出力 * * @access private * @param array $params オプション * @param array $smarty Smartyオブジェクト * @return string 出力するHTML */ function outputStylesheet($params, &$smarty) { //optional $tab_class=$params['option']['tab_div_class']; $selected_tab_class=$params['option']['selected_tab_class']; $not_selected_tab_class=$params['option']['not_selected_tab_class']; $buf =<< EOSS; return $buf; } /** * タブの切り替えを制御するJavaScriptを出力 * * @access private * @param array $params オプション * @param array $smarty Smartyオブジェクト * @return string 出力するHTML */ function outputScript($params, &$smarty) { $rc=$params['option']['return_code']; $px=$params['option']['script_prefix']; $gebi='document.getElementById'; if(isset($params['option']['use_prototype_js'])){ $gebi='$'; } $buf=''.$rc; return $buf; } //smarty block function tabBlock($params, $content, &$smarty, &$repeat) { if (isset($content)) { HTSmartyPluginTabview::_checkParams($params); $id=$params['id']; if(!array_key_exists($id, $params['option']['tabs']))return '';//or return $content ?; $s=HTSmartyPluginTabview::_contentStartTag($params); $e=''; return $s.$content.$e; } } /** * タブの内容の開始タグを出力 * * @access private * @param array $params オプション * @return string 出力するHTML */ function _contentStartTag(&$params){ if($params['option']['selected'] == $params['id']){ //selected $style=''; }else{ //not selected $style=' style="display:none;"'; } $buf='
'; return $buf; } /** * 登録するコマンド一覧 * * @access private * @return array name=>func, のarray */ function allowedFunctions(){ //name=>func return array( 'hetima_tab'=>'smarty_function_hetima_tab', //'hetima_tab_content_start'=>'smarty_function_hetima_tab_content_start', //'hetima_tab_content_end'=>'smarty_function_hetima_tab_content_end', ); } /** * 登録するブロックコマンド一覧 未使用 * * @access private * @return array name=>func, のarray */ function allowedBlocks(){ //name=>func return array('hetima_tab_content'=>'smarty_block_hetima_tab_content'); return array(); } /** * オプションをチェック。outputを配列にする。未設定の項目にデフォルト値を入れる。 * * @access private * @param array $params オプション 参照渡し * @return null */ function _checkParams(&$params){ if(isset($params['output'])){ $params['output'] = HTSmartyPluginTabview::_as_array($params['output']); // start='tab_id', end='tab_id' }else if(isset($params['start'])){ $params['output'] = array('start'); $params['id'] = $params['start']; }else if(isset($params['end'])){ $params['output'] = array('end'); $params['id'] = $params['end']; } if(!isset($params['option']['selected_tab_class'])) $params['option']['selected_tab_class']='tab_selected'; if(!isset($params['option']['not_selected_tab_class'])) $params['option']['not_selected_tab_class']='tab_not_selected'; if(!isset($params['option']['tab_div_class'])) $params['option']['tab_div_class']='tab_items'; if(!isset($params['option']['tab_content_div_class'])) $params['option']['tab_content_div_class']='tab_content'; if(!isset($params['option']['tab_id_suffix'])) $params['option']['tab_id_suffix']='_tab'; if(!isset($params['option']['tab_content_id_suffix'])) $params['option']['tab_content_id_suffix']='_view'; if(!isset($params['option']['script_prefix'])) $params['option']['script_prefix']='ht_'; if(!isset($params['option']['return_code'])) $params['option']['return_code']="\n"; if(!isset($params['option']['dummy_href'])) $params['option']['dummy_href']='javascript:void(0);'; if(!isset($params['option']['selected']) && is_array($params['option']['tabs'])){ //最初のタブを選択状態に $tab_ids=array_keys($params['option']['tabs']); $params['option']['selected']=$tab_ids[0]; } } /** * ,区切りの文字列を配列にする * * @access private * @param mixed $params ,区切りの文字列 * @return array */ function _as_array($param){ if(is_string($param)){ $param=trim(str_replace(' ', '', $param), ','); if(strlen($param) > 0){ $param=explode(',', $param); } } return $param; } } // }}} /* コンパイルはphpを生成するだけだから HTSmartyPluginTabview::tabFunction() みたいにできるんじゃないかと思っていたら コンパイル中に function_exists() で調べてた。 仕方がないので普通の関数で登録することにした。 */ /* コマンドは1個で済ませた方がすっきりすると思い直した function smarty_function_hetima_tab_content_start($params, &$smarty) { return HTSmartyPluginTabview::tabContentStartFunction($params, $smarty); } function smarty_function_hetima_tab_content_end($params, &$smarty) { return HTSmartyPluginTabview::tabContentEndFunction($params, $smarty); } function smarty_block_hetima_tab_content($params, $content, &$smarty, &$repeat) { return HTSmartyPluginTabview::tabBlock($params, $content, $smarty, $repeat); } */ function smarty_function_hetima_tab($params, &$smarty) { return HTSmartyPluginTabview::tabFunction($params, $smarty); } ?>