3

这基本上是我想要完成的事情:

{exp:plugin1:method arg="{exp:plugin2:method}"}

我尝试了许多不同的方法。

方法一:

{exp:plugin1:method arg="{exp:plugin2:method}"}

结果: Plugin1->methodarg参数值是字符串{exp:plugin2:method},并且它从未被解析过。

方法二:

我对解析顺序的理解表明这可能会产生不同的结果,但显然没有。

{preload_replace:replaced="{exp:plugin2:method}"}
{exp:plugin1:method arg="{replaced}"}

结果:参数arg值与方法 1 相同。

方法3:

首先我定义一个片段 ( snip),其内容是:

{exp:plugin2:method}

然后在模板中:

{exp:plugin1:method arg="{snip}"}

结果:与方法 1 和 2 相同。

方法4:

注意到插件是按照它们出现的顺序处理的,我什至测试过在调用{exp:plugin2:method}之前放置一个实例。{exp:plugin1:method}我的想法是我可以将第一个调用包装在一个正则表达式替换插件中以抑制输出,但它会首先触发 Plugin2 的解析。

{exp:plugin2:method}
{exp:plugin1:method arg="{exp:plugin2:method}"}

结果: Plugin1->method '参数值是Template 类保留到以后的 ' 输出(我相信是 MD5)arg的临时哈希占位符。Plugin2->method

4

2 回答 2

2

有趣的方法。但是,这可以更简单地实现,如下所示:

{exp:plugin1:method arg="{exp:plugin2:method}" parse="inward"}
于 2011-03-17T12:05:06.857 回答
0

我有一个解决方法,但在接受我自己的答案之前,我会等待一段时间看看是否有更好的解决方案出现。解决方法plugin1plugin2tagdata. 请注意,这需要调用parse="inward"参数plugin2

在模板中:

{exp:plugin2 parse="inward"}
    {exp:plugin1:method arg="{someplugin2method}"}
{/exp:plugin2}

在插件类中:

static $public_methods;

function __construct() {
    // Actual construction code omitted...

    if(($tagdata = $this->EE->TMPL->tagdata) !== false && trim($tagdata) !== '') {
        if(!isset(self::$public_methods)) {
            self::$public_methods = array();
            $methods = get_class_methods($this);
            foreach($methods as $method) {
                if($method == get_class($this) || $method == '__construct') {
                    continue;
                }
                $reflection = new ReflectionMethod(get_class($this), $method);
                if($reflection->isPublic()) {
                    self::$public_methods[] = $method;
                }
            }

            self::$public_methods = implode('|', self::$public_methods);
        }

        $tagdata = preg_replace_callback('/\{(' . self::$public_methods . ')\}/',
            array($this, 'tagdata_callback'), $tagdata);
        $this->return_data = $tagdata;
    }
}

private function tagdata_callback($matches) {
    $method = $matches[1];
    return $this->$method();
}

注意事项:

  • 这会使模板更加混乱。
  • 维护公共方法列表显然需要ReflectionPHP 4 中不可用的方法。当然,您可以手动维护预期方法列表。
于 2010-12-03T20:06:38.230 回答