Есть ли способ сказать Smarty не печатать выражение? - PullRequest
2 голосов
/ 14 декабря 2011

Я бы хотел использовать Smarty в сочетании с Zend Framework, особенно некоторые из его помощников View.Теперь я дошел до того, что реализовал Zend_View, который использует Smarty для отображения шаблонов.Я могу назначить значения как обычно.Пока все хорошо.

Теперь я бы очень хотел использовать помощники Zend View в Smarty.Я назначил объект Zend_View как «this» и попробовал это в шаблоне:

{$this->layout()->setLayout('default')}

Так как при этом будет напечатано возвращаемое значение метода setLayout () (который является Zend_Layout), возникает ошибка:

Исправляемая фатальная ошибка: объект класса Zend_Layout не может быть преобразован в строку в /path/to/templates_c/089c3d67082722c7cabc028fa92a077f8d8b4af5.file.default.tpl.cache.php 1010 на строке 27 * 100* Это ясно для меня, поэтому я пошел в ядро ​​Smarty, чтобы исправить это:

Сгенерированный код действительно выглядел так:

<?php 
    echo $_smarty_tpl->tpl_vars['this']
                     ->value->layout()
                     ->setLayout('default');
?>

И теперь он читает:

<?php
    $hack = $_smarty_tpl->tpl_vars['this']
                          ->value
                          ->layout()
                          ->setLayout('default');
    if( is_string($hack) ||
        ( is_object($hack) && method_exists($hack, '__toString') ) )
        echo $hack;
?>

Теперь это, пожалуй, худшее исправление, о котором я могу думать, по нескольким причинам (потеря совместимости Smarty, производительность).К сожалению, это единственный.Есть ли способ остановить Smarty от попытки распечатать вывод выражения?Кроме того, я хочу, чтобы синтаксис оставался максимально интуитивным, и я не хочу писать функции Smarty для всех помощников, потому что я хочу использовать этот код со сторонним приложением (Pimcore), которое может добавлять новых помощников.

Заранее спасибо за любые предложения!

1 Ответ

0 голосов
/ 14 декабря 2011

Некоторые предложения (только идеи, ничего хорошего):

  1. Создайте __toString () в Zend_Layout, который возвращает пустую или пустую строку (большой / уродливый / худший обходной путь).

  2. Создайте модификатор / фильтр переменной, который возвращает пустую или пустую строку, чтобы ваш вызов был примерно таким: {$this->layout()->setLayout('default')|noreturn} (вы можете использовать его и с другими вещами, а noreturn можно вызывать с понятным именем, например definition или define для указания цели инструкции, но также и обходного пути)

  3. Использование для присваивания для создания выражения, которое устанавливает все это в другую переменную (тоже обходной путь).

Может быть, это может дать вам хорошие идеи =)

...