Шаблоны ExpressionEngine: передать вывод плагина / модуля в качестве параметра другому плагину / модулю - PullRequest
3 голосов
/ 02 декабря 2010

Вот в основном то, чего я хочу достичь:

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

Я пробовал несколько различных подходов.

Подход 1:

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

Результат: Plugin1->method arg значение параметра - это строка {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}.Я думаю, что я мог бы обернуть этот первый вызов в плагин замены регулярных выражений, чтобы подавить вывод, но что он сначала запустит разбор плагина 2.

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

Результат: Plugin1->methodЗначение параметра arg является временным хеш-заполнителем для вывода Plugin2->method (я полагаю, MD5), что класс Template зарезервирован на более поздний срок.

Ответы [ 2 ]

2 голосов
/ 17 марта 2011

Интересный подход. Тем не менее, это может быть достигнуто более просто, как это:

{exp:plugin1:method arg="{exp:plugin2:method}" parse="inward"}
0 голосов
/ 03 декабря 2010

У меня есть обходной путь, но я подожду некоторое время, чтобы посмотреть, найдется ли лучшее решение, прежде чем я приму свой собственный ответ. Обходной путь - обернуть plugin1 в plugin2 и заменить теги шаблона, ссылаясь на его методы в 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. Конечно, вы можете поддерживать список ожидаемых методов вручную.
...