Frage

Zur Zeit meine Funktion in einer Klasse I platzieren und eine Instanz dieser Klasse in Vorlage passieren und ruf meine gewünschte Funktion als Klassenmethode.

{{ unneededclass.blah() }}

ich tun muss wie unter

{{ blah() }}

Ist es möglich?

War es hilfreich?

Lösung

Update 2015.05.14

Commen weisen darauf hin, dass ich meistens falsch bin. Wenn Sie wirklich eine Funktion und kein Filter oder Makro benötigen, können Sie es als in den Zweig docs vorgeschlagen :

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

Und Verwendung wie

{{ blah() }}

Kurz gesagt, nein, das ist nicht möglich.

Allerdings ist die Hoffnung nicht verloren!

Filter

Wenn diese Funktion blah() von Ihnen gemeint ist, eine vorhandene Variable zu ändern, dann ist es ein Filter .

Ein Beispiel:

//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') }}

(Das erste Argument ist die Variable Sie filtern, wird das zweite mit normalen Mitteln geliefert)

Makros

Wenn, wie Sie oben angegeben haben, Ihre Funktion einfach Ausgänge HTML, dann ist es ein guter Kandidat für ein Makro .

Ein Beispiel:

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

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

oder mit den Parametern:

{% 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') }}

Warum?

Das ist daran zu erinnern ist, dass Zweig-Vorlagen stellen eine Ansicht in Bezug auf MVC. Das heißt, sie in ihrer Umgebung isoliert sind, und nur darstellen kann der Kontext Sie sie über das Datenfeld übergeben Sie in der $template->render()-Methode übergeben.

Dies ist eine gute Sache, wie es Ihre Präsentation von Logik und Daten abkoppelt. Wenn Sie beliebig Funktionen aufrufen können, dann erhöhen Sie plötzlich, dass die Kupplung, die eine schlecht Sache.

Der andere Grund dafür ist die Art und Weise Rückrufe PHP Griffe. Überlegen Sie, wie Sie haben, um diese Funktion in Ihre Vorlage passieren würde ... wahrscheinlich so etwas wie folgt aus:

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

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

in Ihrer Vorlage die Kontextvariable blah ist jetzt nur ein String mit 'blah'.

In Vanille PHP, wenn Sie variable Funktionen wie folgt verwenden (versuchen, eine String-Variable wie eine Funktion zu verwenden), es (mehr oder weniger) führt eine Suche für diese Funktion, ruft er dann. Sie sind nicht , um die Funktion zu übergeben, nur seinen Namen.

Die Sache ist, können Sie nicht möglicherweise eine Funktion in eine Vorlage übergeben, weil PHP einziger Mechanismus, dies zu tun, indem Name-String ist, und einmal in einer Vorlage, dieser Name ist nicht mehr ein Funktionsname und nur ein String.

Ein wenig langatmig, aber ich hoffe, das hilft!

Wenn Sie mehr Dokumentation wollen, sind die offiziellen Dokumente hier .

Andere Tipps

war ich so verloren, wie Sie waren, mein Freund, aber nachdem die Bahn für eine Antwort und fand keine Suche, entschied ich mich, um zu sehen, ob ich es selbst tun könnte. Deshalb wollte ich meine Lösung hier posten (auch wenn ich weiß, dass das Post alt ist), weil dies der erste Treffer auf Google, wenn Sie für dieses Problem suchen.

Hier geht es, es ist ganz einfach eigentlich:

Ich habe eine Klasse, die meine Funktionen und Variablen enthält, zum Beispiel:

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

So, jetzt haben wir $ Werte als Array, die diese Aufgabe mit einer Funktion "getRandomNumber ()" enthält.

Wenn Sie die Vorlagendatei Rendering, umfassen diese Klasse als Wert:

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

Auf diese Weise innerhalb der Template-Datei, können Sie einfach diese Methode aufrufen, um die Funktion aufzurufen und Ihr Ergebnis:

{{ functions.getRandomNumber }}

Sie können zwar nicht PHP aufrufbar direkt, ist Zweig erweiterbar. Sie können einen abrufbaren Filter hinzufügen, so dass Sie PHP-Funktionen Template übergeben anwenden können.

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);
    }

}

Nun, wenn Sie Variable my_func auf Vorlage übergeben, können Sie my_func|call(arg1, arg2) tun. Sie können auch Funktionen höherer Ordnung tun "array_filter"|call(my_array, my_func) und Sie können immer mehr Dinge im Filter tun Array als Parameter wie die Annahme und so weiter.

Vollständige Antwort: http://twig.sensiolabs.org/doc/advanced.html#id2

Ich ziehe Zweig Erweiterung wie folgt zu verwenden:

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';
    }
}

Vorlage:

{{ sidebar_menu('some text') }}

Using Anonymous class

Create anonymous class in manager/controller/service ..

     $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' => ...]);
    }
};

Paste parameter into view

$params=[
            'functions' => $functions

        ];



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

Use function in view

 {% set rowUrl = functions.rowUrl(entity) %}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top