ファンクションタグと連携(BlockTest03)

構成

$MT_DIR/
|__ plugins/
|  |__ BlockTest03/
|     |__ config.yaml
|     |__ lib/
|     |  |__ BlockTest03
|     |      |__ Tag.pm
|     |__ php/
|     |  |__ block.mtblocktest03.php
|     |  |__ function.mtfunctiontest03.php
 
 

ソース

config.yaml

# 詳細情報
id: BlockTest03
key: BlockTest03
name: BlockTest03
version: 1.0
description: ブロックタグテスト
author_name: プラグイン作者
author_link: http://www.example.com/about/
doc_link: http://www.example.com/docs/
 
# タグ
tags:
    # ブロック
    block:
        BlockTest03: $BlockTest03::BlockTest03::Tag::hdlr_func03
    # ファンクション
    function:
        FunctionTest03: $BlockTest03::BlockTest03::Tag::hdlr_func03a
 
 

lib/BlockTest03/Tag.pm

package BlockTest03::Tag;
 
use strict;
 
sub hdlr_func03{
 
    # 引数を取得
    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;
}
 
sub hdlr_func03a{
 
    # 引数を取得
    my ($ctx, $args) = @_;
 
    my $count = $ctx->stash('myplugin::count');
 
    # $count変数が取得できていない場合はエラー
    return $ctx->error ('MTMyLoopCount must be used in MTMyLoop') if !defined $count;
 
    # 取得した$count変数を返却
    return $count;
 
}
 
1;
 
 

php/block.mtblocktest03.php

<?php
function smarty_block_mtblocktest03($args, $content, &$ctx, &$repeat){
 
    // ローカル変数エリア
    $localvars = array('mt_blocktest03_counter', 'mt_blocktest03_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_blocktest03_counter');
        $count = $ctx->stash('mt_blocktest03_count');
 
    }
 
    // 終端チェック
    if($count < $counter){
 
        // 変数設定
        $ctx->stash('mt_blocktest03_counter', $counter);
        $ctx->stash('mt_blocktest03_count', $count + 1);
 
        // 繰り返しON
        $repeat = true;
 
    }else{
        // ローカル変数開放
        $ctx->restore($localvars);
 
        // 繰り返しOFF
        $repeat = false;
 
    }
 
    // 返却
    return $content;
}
?>
 

php/function.mtfunctiontest03.php

<?php
function smarty_function_mtfunctiontest03($args, &$ctx){
 
    // 初期化
    $count = $ctx->stash('mt_blocktest03_count');
 
    $funcData = "";
 
    // 引数をチェック
    if($count == ""){
        $funcData = "";
    }else{
        $funcData = "FunctionTest03 Dynamic={$count}";
    }
 
    // 返却
    return $funcData;
}
?>
 



最終更新:2012年03月10日 12:15