web-dev-qa-db-fra.com

Appel PHP fonction du modèle Twig

J'ai une fonction dans mon contrôleur qui renvoie un tableau d'entités, donc dans mon modèle de brindille, je fais ceci pour itérer sur des éléments:

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

J'ai aussi dans mon contrôleur cette fonction PHP:

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

Je peux l'appeler de cette façon:

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

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

Est-il possible d'accéder à la fonction PHP à partir du modèle Twig afin d'obtenir toutes les combinaisons possibles d'éléments dans une entité? Comment?

** METTRE À JOUR **

C'est la fonction qui retourne les entités traitées après par Twig Template:

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

Il n'est pas possible d'accéder directement à une fonction PHP dans Twig. 

Ce que vous pouvez faire, c'est écrire une extension Twig. Une structure commune consiste à écrire un service avec certaines fonctions d’utilité, Écrire une extension Twig en tant que pont pour accéder au service à partir de twig. L'extension Twig utilisera le service et Votre contrôleur pourra également utiliser le service.

Jetez un oeil: http://symfony.com/doc/current/cookbook/templating/twig_extension.html

À votre santé.

19
createproblem

Il existe déjà une extension Twig qui vous permet d’appeler des fonctions PHP à partir de vos modèles Twig comme:

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

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

Voir le répertoire officiel extension .

9
umpirsky

Vous pouvez vérifier votre fonction tout défini par 

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

cela vous donnera un tableau de toutes les fonctions en si votre fonction existe en elle, vous pouvez l'utiliser comme: 

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

Je suis surpris que la réponse au code ne soit pas déjà affichée, c'est un one-line. 

Vous pourriez juste {{ categeory_id | getVariations }}

C'est un one-liner: 

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

Bien que je sois d’accord avec les commentaires sur la transmission de variables de votre contrôleur, vous pouvez également enregistrer des fonctions non définies lors de la configuration de l’environnement twig.

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

Ceci est tiré de la page de recette Twig

N'a pas essayé d'appeler une fonction sur un objet comme demandé à la question initiale 

1
Disobedient Media

Je sais que c'est un vieux fil. Mais avec symfony 3.3, j’ai fait ceci:

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

Documents Symfony

0
Refilon