2015-10-02 2 views
3

Есть ли способ использовать что-то вроде этого?Твиг-тег или функция внутри PHP String

$foo = "{{ object|filter }}";

Потому что я пытаюсь написать динамический преобразователь изображения, который должен выводить что-то вроде примера, но когда в моей веточке я использую {{ foo }}, он просто выводит необработанную строку {{ object|filter }} вместо executhing фильтра на объект по назначению.

Я пытался использовать {{ foo | raw }}, но такой же результат.

То, что я пытаюсь сделать именно

CONTROLLER

$image = $em->getRepository('AcmeDemo:Media')->find($id); 
$image_src = sprintf("{{ %s | imagine_filter('%s') }}", $image->getWebPath(), 'front_small'); 
return $this->render('image.html.twig', array(
    'image_src' => $image_src 
)); 

TWIG

<img src="{{ image_src }}"/> 

Итак, у меня есть функция прут внутри переменной PHP $image_src, что Функция Twig может быть, после форматирования sprintf{{ '/uploads/foo.jpg' | imagine_filter('front_small') }}.

То есть строка на данный момент, потому что внутри переменной PHP $image_src, что переменная передается в шаблон Twig с именем image_src так, сейчас это строка, как я уже говорил, если я

My variable contains "{{ image_src }}" Он будет выводить строка, которая говорит:

My variable contains "{{ '/uploads/foo.jpg' | imagine_filter('front_small') }}"

Потому что, как я уже говорил, image_src это просто строка, но я хочу, чтобы acutally выполнить в моей Twig, строку, содержит image_src, потому что да, это строка (для глаз компилятора), но мы все это знаем или она притворяется функцией Twig (из-за синтаксиса).

Итак, почему | rawне будет работа ?, потому что она inteded для использования с строки, содержащие HTML код, если бы HTML синтаксис это будет работать, но это Twig синтаксис, так что он не работает.

Возобновление, должна существовать функция twig | compile, которая выполняет код Twig внутри переменной, такой как | raw, с HTML, но, поскольку эта функция не существует, мне интересно, есть ли способ ее достижения ...

Как @joshua сказал, это похоже на Javascript eval.

Надеюсь, я хорошо объяснил, в чем проблема и что мне нужно.

EDIT

Я использовал свое собственное расширение прутого Compile для того, чтобы достичь того, что мне было нужно.

class CompileExtension extends \Twig_Extension 
{ 
    public function getFilters() 
    { 
     return array(
      'compile' => new \Twig_Filter_Method($this, 'compile', array(
       'needs_environment' => true, 
       'needs_context'  => true, 
       'is_safe' => array('compile' => true) 
      )), 
     ); 
    } 

    public function compile(\Twig_Environment $environment, $context, $string) 
    { 
     $loader = $environment->getLoader(); 

     $compiled = $this->compileString($environment, $context, $string); 

     $environment->setLoader($loader); 
     return $compiled; 
    } 

    public function compileString(\Twig_Environment $environment, $context, $string) 
    { 
     $environment->setLoader(new \Twig_Loader_String()); 
     return $environment->render($string, $context); 
    } 

    public function getName() 
    { 
     return 'compile'; 
    } 
} 

UPDATE Принимая @Benjamin Paap ответ, потому что это именно то, что я хотел в этом случае с лучшим кодом, но мой заказ Twig класс работает для любой ситуации.

+0

Вы пытаетесь использовать прутый фильтр в PHP или хотите вывод HTML из ваш пользовательский фильтр? Любой код? – Rooneyl

+0

вы должны это прочитать, и '{{foo | raw}}' должен работать: http://twig.sensiolabs.org/doc/filters/raw.html –

+0

вы хотите что-то вроде 'eval' javascript, не так ли? ? Я не думаю, что ребята из твинов добавили функцию, которая, возможно, опасна как «eval» в их проекте. – Joshua

ответ

1

То, что вы хотите сделать, невозможно в веточке без TwigExtension, которая отображает вашу строку отдельно.

Но, глядя на ваш код, вы пытаетесь использовать LiipImagineBundle неправильно. Представляется заманчивым использовать его таким образом, но правильный путь для создания URL для ваших миниатюр будут такими:

class MyController extends Controller 
{ 
    public function indexAction() 
    { 
     // RedirectResponse object 
     $imagemanagerResponse = $this->container 
      ->get('liip_imagine.controller') 
      ->filterAction(
       $this->request,   // http request 
       'uploads/foo.jpg',  // original image you want to apply a filter to 
       'my_thumb'    // filter defined in config.yml 
      ); 

     // string to put directly in the "src" of the tag <img> 
     $cacheManager = $this->container->get('liip_imagine.cache.manager'); 
      $srcPath = $cacheManager->getBrowserPath('uploads/foo.jpg', 'my_thumb'); 

     // .. 
    } 
} 

https://github.com/liip/LiipImagineBundle#using-the-controller-as-a-service

+0

Я думаю, что ваш метод лучше, чем тот, который я сделал (я сделал расширение twig, чтобы скомпилировать функции с помощью Twig_Loader_String, поэтому я попробую его :) –

+0

Работаю как шарм! :) Спасибо! –

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