Domanda

Al momento ho posto la mia funzione in una classe e passare un'istanza di questa classe in modello e chiamare il mio funzione richiesta come metodo di classe.

{{ unneededclass.blah() }}

Ho bisogno di fare come qui di seguito

{{ blah() }}

E 'possibile?

È stato utile?

Soluzione

Aggiornamento 2015/05/14

commentatori sottolineano che sono per lo più sbagliato. Se davvero bisogno di una funzione, e non un filtro o una macro, si può fare come suggerito nella documentazione Twig :

$twig = new Twig_Environment($loader);
$function = new Twig_SimpleFunction('blah', function () {
   // ...
});
$twig->addFunction($function);

E l'uso come

{{ blah() }}

In breve, no, questo non è possibile.

Tuttavia, la speranza non è perduta!

Filtri

Se questa funzione blah() tua intende modificare una variabile esistente, allora è una Filtro .

Un esempio:

//in your PHP
function format_date($date_string,$format_string) {
    return date($format_string,strtotime($date_string));
}
$twig_env->addFilter('format_date',new Twig_Filter_Function('format_date'));

{# in your template #}
{{ some_date|format_date('n/j/Y') }}

(Il primo parametro è la variabile si filtra il secondo viene alimentato tramite normali)

Macro

Se, come si è già detto, la funzione semplicemente uscite HTML, allora è un buon candidato per un macro .

Un esempio:

{# in your template #}
{% macro say_hello() %}
<p>Oh! Hello, world!</p>
{% endmacro %}

{# ... later on ... #}
{{ _self.say_hello() }}

oppure con i parametri:

{% macro input(name,value,type) %}
<input type="{{ type|default('text') }}" name="{{ name }}" value="{{ value }}">
{% endmacro %}

{{ _self.input('phone_number','867-5309') }}
{{ _self.input('subscribe','yes','checkbox') }}

Perché?

La cosa da ricordare è che i template Twig rappresentano una Visualizza , in termini di MVC. Questo significa che sono isolati in termini di ambiente, e possono rappresentare solo il di contesto si passarli tramite la matrice di dati si passa nel metodo $template->render().

Questa è una buona cosa, in quanto disaccoppia la presentazione dalla logica e dati. Se si può arbitrariamente funzioni di chiamata, allora si aumenta improvvisamente che l'accoppiamento, che è un male cosa.

L'altra ragione di questo è il modo in cui maniglie PHP callback. Pensate a come si dovrebbe passare quella funzione nel tuo modello ... Probabilmente qualcosa di simile:

function blah() {
    return "<p>Oh! Hello, world!</p>";
}

$template = $twig_env->loadTemplate('template.html');
echo $template->render(array('blah'=>'blah'));

Nel modello, l'blah variabile di contesto è ormai solo una contenente 'blah' stringa.

In vaniglia PHP, quando si utilizzano le funzioni di variabili come questo (cercare di utilizzare una variabile stringa come una funzione), è (più o meno) esegui una ricerca per quella funzione, allora lo chiama. Sei non che passa la funzione, basta il suo nome.

Il fatto è che non si può assolutamente passare una funzione in un modello, perché solo il meccanismo di PHP per fare questo è per nome-string, e una volta all'interno di un modello, che il nome non è più un nome di funzione e solo una stringa.

Un po 'lungo senza fiato, ma spero che aiuta!

Se si desidera più di documentazione, la documentazione ufficiale sono qui .

Altri suggerimenti

I era perso come eri, il mio amico, ma dopo la ricerca sul Web per una risposta e ha trovato nessuno, ho deciso di vedere se potevo farlo io. Pertanto, ho voluto pubblicare la mia soluzione qui (anche se so che questo post è vecchio), perché questo è il primo colpo su google se si cerca per questo problema.

Qui andare, è abbastanza semplice in realtà:

Ho fatto una classe che contiene le mie funzioni e variabili, per esempio:

class functionContainer{
        function getRandomNumber()
        {
                return rand();
        }
}
$values = array(
'functions'=> new functionContainer()
);

Così ora abbiamo $ valori come un array, che contiene l'oggetto con una funzione di "getRandomNumber ()".

Quando il rendering del file modello, includere questa classe come un valore:

$twig->render('random.html', $values);

In questo modo, all'interno del file di modello, si può chiamare questo metodo per chiamare la funzione e ottenere il risultato:

{{ functions.getRandomNumber }}

Anche se è possibile non callable PHP direttamente, ramoscello è estensibile. È possibile aggiungere un filtro callable, in modo da poter applicare alle funzioni PHP passati al template.

namespace My\Twig\Extension;

class LambdaFilter extends \Twig_Extension {

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

    public function getFilters() {
        return array(
            new \Twig_SimpleFilter('call', array($this, 'doCall'))
        );
    }

    public function doCall() {
        $arguments = func_get_args();
        $callable = array_shift($arguments);
        if(!is_callable($callable)) {
            throw new InvalidArgumentException();
        }
        return call_user_func_array($callable, $arguments);
    }

}

Ora, se si passa my_func variabile modello, si può fare my_func|call(arg1, arg2). Si può anche fare funzioni di ordine superiore "array_filter"|call(my_array, my_func) e si può sempre fare più cose nel filtro come accettare array come parametri e così via.

risposta completa: http://twig.sensiolabs.org/doc/advanced.html#id2

Io preferisco usare Twig estensione in questo modo:

namespace Some\Twig\Extensions;

class MenuExtensions extends \Twig_Extension
{
    public function getFunctions()
    {
        return array(
            new \Twig_SimpleFunction('sidebar_menu', [$this, 'generate_sidebar_menu']),
        );
    }

    public function generate_sidebar_menu($menu){
        return $menu;
    }

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

In template:

{{ sidebar_menu('some text') }}

Anonymous

Create classe anonima in Gestione / controllo / servizio ..

     $functions = new class($router)
    {
        public function __construct($router)
        {
            $this->router = $router;
        }

    public function getRowUrl(FileManager $fileManager)
    {
        if ($fileManager->isNode()) {
            return $this->router->generate('...', ['parent' => ...]);
        }
        return $this->router->generate('...', ['entity' => ...]);
    }
};

Incolla parametro in vista

$params=[
            'functions' => $functions

        ];



    return new Response($this->twig->render('...:index.html.twig', $params));

funzione Use in vista

 {% set rowUrl = functions.rowUrl(entity) %}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top