ブロックタグの明細を奇数時出力(BlockCondTest01)
構成
$MT_DIR/
|__ plugins/
| |__ BlockCondTest01/
| |__ config.yaml
| |__ lib/
| | |__ BlockCondTest01
| | |__ Tag.pm
| |__ php/
| | |__ block.mtblockcondiftest01.php
| | |__ block.mtblockcondtest01.php
| | |__ function.mtblockcondfunc01.php
ソース
config.yaml
# 詳細
id: BlockCondTest01
key: BlockCondTest01
name: BlockCondTest01
version: 1.0
description: コンディショナルタグテスト
author_name: プラグイン作者
author_link: http://www.example.com/about/
doc_link: http://www.example.com/docs/
# タグ定義
tags:
# ブロックタグ
block:
# コンディショナルタグ
BlockCondIfTest01?: $BlockCondTest01::BlockCondTest01::Tag::_hdlr_block_cond
# ブロックタグ
BlockCondTest01: $BlockCondTest01::BlockCondTest01::Tag::_hdlr_block
# ファンクションタグ
function:
BlockCondFunc01: $BlockCondTest01::BlockCondTest01::Tag::_hdlr_function
lib/BlockCondTest01/Tag.pm
package BlockCondTest01::Tag;
use strict;
# BlockCondTest01の処理
sub _hdlr_block_cond{
# 引数を取得
my ($ctx, $args, $cond) = @_;
my $count = $ctx->stash('myplugin::count');
# $count変数が取得できていない場合はエラー
return $ctx->error ('BlockCondTest01 must be used in BlockCondTest01Loop') if !defined $count;
my $res;
if($count % 2 == 1){
$res = 1;
}else{
$res = 0;
}
# 返却
return $res;
}
# BlockCondTest01の処理
sub _hdlr_block{
# 引数を取得
my ($ctx, $args, $cond) = @_;
# コンテキストよりbuilderを取得
my $builder = $ctx->stash('builder');
# トークンを取得
my $tokens = $ctx->stash('tokens');
# count="xxx"の引数を取得、存在しない場合は"1"
my $loop = $args->{count} || 1;
# 初期化
my $html = '';
for (my $count = 1; $count <= $loop; $count++) {
# ローカルスコープへ値を一時的に設定
local $ctx->{__stash}{'myplugin::count'} = $count;
# ブロックタグを構築、失敗時はエラー
my $out = $builder->build ($ctx, $tokens, $cond);
return $ctx->error ($builder->errstr) if !defined $out;
# 値連結
$html .= $out;
}
# 値返却
return $html;
}
# BlockCondFunc01の処理
sub _hdlr_function{
# 引数を取得
my ($ctx, $args) = @_;
my $count = $ctx->stash('myplugin::count');
# $count変数が取得できていない場合はエラー
return $ctx->error ('BlockCondTest01 must be used in BlockCondTest01Loop') if !defined $count;
# 取得した$count変数を返却
return $count;
}
1;
php/block.mtblockcondiftest01.php
<?php
function smarty_block_mtblockcondiftest01($args, $content, &$ctx, &$repeat){
// 引数を取得
$count = $ctx->stash('mt_blocktest01_count');
if($count == ""){
$count = intval($count);
}
// チェック
if(!isset($content)){
// 奇数チェック
$res = false;
if(($count % 2) == 1){
$res = true;
}
return $ctx->_hdlr_if($args, $content, $ctx, $repeat, $res);
}else{
return $ctx->_hdlr_if($args, $content, $ctx, $repeat);
}
}
?>
php/block.mtblockcondtest01.php
<?php
function smarty_block_mtblockcondtest01($args, $content, &$ctx, &$repeat){
// ローカル変数エリア
$localvars = array('mt_blocktest01_counter', 'mt_blocktest01_count');
// 初期化チェック
if(!isset($content)){
// ローカル変数初期化
$ctx->localize($localvars);
// 初期化処理
$_maxCount = 1;
if(isset($args['count'])){
$_maxCount = intval($args['count']);
}else{
$_maxCount = 1;
}
$counter = $_maxCount;
$count = 0;
}else{
// 継続データ取得
$counter = $ctx->stash('mt_blocktest01_counter');
$count = $ctx->stash('mt_blocktest01_count');
}
// 終端チェック
if($count < $counter){
// 変数設定
$ctx->stash('mt_blocktest01_counter', $counter);
$ctx->stash('mt_blocktest01_count', $count + 1);
// 繰り返しON
$repeat = true;
}else{
// ローカル変数開放
$ctx->restore($localvars);
// 繰り返しOFF
$repeat = false;
}
// 返却
return $content;
}
?>
php/function.mtblockcondfunc01.php
<?php
function smarty_function_mtblockcondfunc01($args, &$ctx){
// 初期化
$count = $ctx->stash('mt_blocktest01_count');
// 引数をチェック
if($count == ""){
$count = "count={$count}";
}
// 返却
return 'BlockCondFunc01 Dynamic ' . $count;
}
?>
最終更新:2012年03月10日 21:58