2011-07-27 11 views
15

¿Hay alguna manera de llamar a una función estática o usar una variable estática en twig?motor de plantillas twig, usando una función estática o variable

Tengo una clase de funciones estáticas de ayuda y quiero usar una o dos en una plantilla.

+0

¿Qué desea lograr? ¿Solo pasa variables u ofrece una función propia para usar en plantillas? – hakre

+0

Tengo una clase de funciones auxiliares estáticas así que esperaba poder llamarlas de alguna manera sin la necesidad de agregarlas usando addFunction. – Alex

+1

Creo que, además, esta es una respuesta interesante también para usted: [función twig-pass en plantilla] (http://stackoverflow.com/questions/3595727/twig-pass-function-into-template/3595941#3595941) – hakre

Respuesta

23

Maneras de pareja en las que terminé haciéndolo.

La primera es una función que puede llamar a una función estática.

$twig = new Twig_Environment($loader); 
$twig->addFunction('staticCall', new Twig_Function_Function('staticCall')); 

function staticCall($class, $function, $args = array()) 
{ 
    if (class_exists($class) && method_exists($class, $function)) 
     return call_user_func_array(array($class, $function), $args); 
    return null; 
} 

puede entonces ser utilizado como,

{{ staticCall('myClass', 'mymethod', [optional params]) }} 

La otra es utilizar un método mágico.

Añadir a la clase que el contexto $ rendir

$data['TwigRef'] = new TheClass(); 

class TheClass 
{ 
    public function __call($name, $arguments) { 
     return call_user_func_array(array('TheClass', $name), $arguments); 
    } 

    ... 
} 

puede entonces ser utilizado como,

{{ TwigRef.myMethod(optional params) }} 

Probablemente la mejor manera de añadir algunos controles extra para funciones sólo aprobados, llame al ser llamados.

+3

He visto esto antes. Aún no he visto una ubicación para ello. Por favor, en un proyecto de SF2, ¿dónde se supone que debe ir este código? ¿Dónde se define $ loader? –

+0

¿Cómo hacer que esta primera solución funcione cuando pasa el nombre completo de clase con su espacio de nombres? – slob

+0

Bueno uno. Supongo que esto no debe estar en un proyecto de Symphony 2 –

1

Puede agregar dinámicamente funciones a sus plantillas de rama registrándolas. Ya sea que ya son exigibles o alias de su función estática por un nombre que es propia:

$twig = new Twig_Environment($loader); 
$twig->addFunction('functionName', new Twig_Function_Function('someFunction')); 

Véase el Functions section in Extending Twig.

+0

Creo que tendré que hacer mi propia función para poder usar las estáticas. algo así como static ('clase', 'función', [params]) – Alex

+0

Probablemente no, intente registrar ''clase :: función'' como el parámetro'' someFunction'' anterior y hágame saber si funciona o no. – hakre

+0

Ese es mi problema, eso podría funcionar, pero luego tendría que hacerlo para cada función que pueda necesitar. – Alex

Cuestiones relacionadas