2015-05-31 3 views
1

Я пытаюсь добавить собственное расширение на Twig. Основное использование работает, но я хочу, чтобы я мог вызывать свои функции с префиксом поставщика.Использование префикса поставщика для Twig Extension

Пример: LinkViewHelper:

class LinkViewHelper extends \Twig_Extension { 

    public function getFunctions() 
    { 
     return array(
      'link' => new \Twig_Filter_Method(
       $this, 
       'link', 
       array('is_safe' => array('html')) 
      ) 
     ); 
    } 

    public function link($text, $uri, array $additionalParams = array(), array $aTagParams = array(), $external=false) 
     { 
      $uri = $this->uri($uri, $additionalParams, $external); 
      // Some additional parsing 
      return $url; // will be somehting like <a href="http://www.google.de" target="_blank">Go to Google now!</a> 
     } 

    public function uri($uri, array $additionalParams = array(), $external = false) 
    { 
      // Some parsing goes here 
      return $uri; // will be something like http://www.google.com/ 
    } 

    /** 
    * Returns the name of the extension. 
    * 
    * @return string The extension name 
    */ 
    public function getName() 
    { 
     return 'url'; 
    } 
} 

Загрузка в моей начальной загрузки:

$this->environment->addExtension(new LinkViewHelper()); 

Теперь я могу вызвать функцию с {{ link }}, но то, что я хочу, чтобы назвать это как {{ url.link }}. Как я могу это достичь?

С уважением, cefuroX

Edit: Серьезно, вниз голосование вопрос, потому что вы не понимаете, вопрос не полезно вообще :)

+0

Почему бы не добавить фильтр вместо функции, так что вы можете сделать '{URL | ссылка } '? Если вы хотите сделать '{{url.link}}, ссылка функции должна быть функцией URL-адреса объекта. – Med

+0

Потому что «url» - это не строка, а имя ViewHelper. И это логически не фильтр. Я не хочу фильтровать URL-адрес, который я хочу создать. Фильтр не является полезным вариантом здесь. –

+1

Вы пытались зарегистрировать свой объект как глобальный, как описано [здесь] (http://twig.sensiolabs.org/doc/advanced.html#globals)? – Matteo

ответ

0

Хорошо, как я думал, и упомянул в своем ответе к моему сообщению: Если вы установили расширение как глобальное, вы можете использовать его с префиксом поставщика. Но он всегда будет избежать вашего возвращения, так что если вам нужна HTML вещь, как мне нужно ECHO вашего возвращения вместо того, чтобы вернуться:

public function link($text, $uri, array $additionalParams = array(), array $aTagParams = array(), $external=false) 
    { 
     $uri = $this->uri($uri, $additionalParams, $external); 
     // Some additional parsing 
     echo $url; // will be somehting like <a href="http://www.google.de" target="_blank">Go to Google now!</a> 
    } 

В моем случае это то, что мне нужно, но это не элегантно на все ... Я отпущу этот вопрос и не буду отмечать это как правильный ответ, потому что я думаю, что для этого должен быть более элегантный способ.

Thnx в @Matteo с приведением меня обратно в глобальное решение :)

С уважением,

Sebastian

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