2011-12-13 2 views
2

Я хотел бы использовать Smarty в сочетании с Zend Framework, особенно некоторые из них - Help Helers. Теперь я понял, где я реализовал Zend_View, который использует Smarty для отображения шаблонов. Я могу назначать значения как обычно. Все идет нормально.Есть ли способ сказать Smarty не печатать выражение?

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

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

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

Catchable фатальная ошибка: Объект класса Zend_Layout не может быть преобразован в строку в /path/to/templates_c/089c3d67082722c7cabc028fa92a077f8d8b4af5.file.default.tpl.cache.php на линии 27

Это для меня ясно, поэтому я пошел в ядро ​​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), которое может добавить новые помощники.

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

+0

Вы не думаете, что вы делаете вещи излишне сложные для себя? Что не так с использованием php для шаблонов? – vascowhite

+0

Вы видели [это] (http://devzone.zend.com/406/integrating-smarty-with-the-zend-framework/)? – vascowhite

+0

Или [это] (http://gediminasm.org/article/smarty-3-extension-for-zend-framework)? – vascowhite

ответ

0

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

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

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

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

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

+0

Я попробую модификатор (2), как только я доберусь до него. 1) очевидно, но я не хочу менять любые классы Zend. 3) на самом деле невозможно, так как представление должно быть очень общим. – Timo

Смежные вопросы