wake-up-neo.com

Anruf PHP Funktion aus der Twig-Vorlage

Ich habe eine Funktion in meinem Controller, die ein Array von Entitäten zurückgibt. In meiner Zweigvorlage mache ich dies, um Elemente zu durchlaufen:

{% for groupName, entity in items %}
    <ul>
        <ul>
            {% for element in entity %}
                <li>{{ element.getLabel }}</li>
                <li><input type="text" name="detail[{{ element.getId }}]" id="pd_{{ element.getId }}" /><input type="text" name="price[{{ element.getId }}]" id="pd_price_{{ element.getId }}" /><input type="text" name="stock[{{ element.getId }}]" id="pd_stock_{{ element.getId }}" /></li>
            {% endfor %}
        </ul>
    </ul>
{% endfor %}

In meinem Controller habe ich auch diese PHP Funktion:

private function DetailCombination($arr, $level, &$result, $curr = array()) {
    for ($i = 0; $i < count($arr); $i++) {
        $new = array_merge($curr, array($arr[$i]));
        if ($level == 1) {
            sort($new);
            if (!in_array($new, $result)) {
                $result[] = $new;
            }
        } else {
            combinations($arr, $level - 1, $result, $new);
        }
    }
}

Ich kann es so nennen:

for ($i = 0; $i < count($arr); $i++) {
    $this->DetailCombination($arr, $i + 1, $result);
}

// TEST
foreach ($result as $arr) {
    echo join(" ", $arr) . '<br>';
}

Ist es möglich, auf die Funktion PHP von Twig zuzugreifen, um alle möglichen Kombinationen von Elementen in einer Entität zu erhalten? Wie?

** UPDATE **

Dies ist die Funktion, die Entitäten zurückgibt, die von Twig Template nachverarbeitet wurden:

private function getVariations($category_id) {
    $items = array();

    $em = $this->getDoctrine()->getManager();
    $entityCategory = $em->getRepository('CategoryBundle:Category')->find($category_id);

    foreach ($entityCategory->getProductDetails() as $entity) {
        if ($entity->getToProduct() == 1) {
            foreach ($entity->getDetailGroup() as $group) {
                if (!array_key_exists($group->getName(), $items)) {
                    $items [$group->getName()] = array();
                }

                $items [$group->getName()] [] = $entity;
            }
        } 
    }

    return $items;
} 
22
Reynier

Es ist nicht möglich, direkt auf eine PHP - Funktion in Twig zuzugreifen. 

Was Sie tun können, ist eine Twig-Erweiterung zu schreiben. Eine übliche Struktur ist das Schreiben eines Dienstes mit einigen Hilfsfunktionen..... Eine Twig-Erweiterung als Bridge schreiben, um von twig auf den Dienst zuzugreifen. Die Twig-Erweiterung verwendet den Dienst und Ihr Controller kann den Dienst ebenfalls verwenden.

Schauen Sie doch mal rein: http://symfony.com/doc/current/cookbook/templating/twig_extension.html

Prost.

19
createproblem

Es gibt bereits eine Twig-Erweiterung, mit der Sie PHP -Funktionen aus Ihren Twig-Vorlagen aufrufen können:

Hi, I am unique: {{ uniqid() }}.

And {{ floor(7.7) }} is floor of 7.7.

Siehe offizielles extension repository .

9
umpirsky

Sie können Ihre alle definierten Funktionen mit überprüfen 

$arr = get_defined_functions();
print_r($arr);

dadurch erhalten Sie eine Reihe aller Funktionen, wenn Ihre Funktion darin vorhanden ist. Sie können sie wie folgt verwenden: 

 {{ user.myfunction({{parameter}}) }}
3

Ich bin überrascht, dass die Code-Antwort noch nicht veröffentlicht wurde. 

Sie könnten einfach {{ categeory_id | getVariations }}

Es ist ein Einzeiler: 

$twig->addFilter('getVariations', new Twig_Filter_Function('getVariations'));
2
John

Obwohl ich mit den Kommentaren zur Übergabe von Variablen von Ihrem Controller einverstanden bin, können Sie beim Erstellen der twig-Umgebung auch undefinierte Funktionen registrieren

$twig->registerUndefinedFunctionCallback(function ($name) {
        // security
        $allowed = false;
        switch ($name) {
            // example of calling a wordpress function
            case 'get_admin_page_title':
                $allowed = true;
                break;
        }

        if ($allowed && function_exists($name)) {
            return new Twig_Function_Function($name);
        }

        return false;
    });

Dies ist von der Twig-Rezeptseite

Es wurde nicht versucht, eine Funktion für ein Objekt aufzurufen, wie in der ursprünglichen Frage angegeben 

1

Ich weiß, das ist ein alter Thread. Aber mit Symfony 3.3 habe ich folgendes gemacht:

{{ render(controller(
    'AppBundle\\Controller\\yourController::yourAction'
)) }}

Symfony-Dokumente

0
Refilon