3

基本的に私が達成したいことは次のとおりです。

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

私はいくつかの異なるアプローチを試しました。

アプローチ1:

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

結果: Plugin1->methodargパラメータ値は文字列、、で{exp:plugin2:method}あり、解析されることはありません。

アプローチ2:

解析順序についての私の理解は、これが異なる結果をもたらす可能性があることを示唆していますが、明らかにそうではありません。

{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->methodargパラメータ値はPlugin2->method、テンプレートクラスが後で予約する出力(MD5だと思います)の一時的なハッシュプレースホルダーです。

4

2 に答える 2

2

興味深いアプローチ。ただし、これは次のように簡単に実現できます。

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

回避策はありますが、自分の答えを受け入れる前に、より良い解決策が見つかるかどうかを確認するためにしばらく待ちます. 回避策は、 内のメソッドを参照するテンプレート タグでラップplugin1plugin2て置き換えることtagdataです。これには、呼び出しの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();
}

警告:

  • これにより、複雑なテンプレートが作成される可能性があります。
  • パブリック メソッドのリストを維持するには、明らかReflectionに PHP 4 では使用できないメソッドが必要です。もちろん、期待されるメソッドのリストを手動で維持することもできます。
于 2010-12-03T20:06:38.230 に答える