it-swarm.dev

Chiamata PHP funzione dal modello Twig

Ho una funzione nel mio controller che restituisce array di entità, quindi nel mio modello di ramoscello lo faccio per iterare sugli elementi:

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

Nel mio controller ho anche questa funzione 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);
        }
    }
}

Posso chiamarlo in questo modo:

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

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

È possibile accedere alla funzione PHP dal modello Twig per ottenere tutte le possibili combinazioni di elementi nell'entità? Come?

** AGGIORNARE **

Questa è la funzione che restituisce le entità elaborate dopo da 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

Non è possibile accedere direttamente a nessuna funzione PHP all'interno di Twig. 

Quello che puoi fare è scrivere un'estensione Twig. Una struttura comune è, scrivendo un servizio con alcune funzioni di utilità, Scrivere un'estensione Twig come bridge per accedere al servizio da twig. L'estensione Twig utilizzerà il servizio e .__ anche il controller può utilizzare il servizio.

Dai un'occhiata: http://symfony.com/doc/current/cookbook/templating/twig_extension.html

Saluti.

19
createproblem

Esiste già un'estensione Twig che consente di chiamare le funzioni PHP dai tuoi modelli Twig come:

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

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

Vedi repository extension ufficiale .

9
umpirsky

Puoi controllare la tua funzione definita da 

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

questo ti darà una matrice di tutte le funzioni in se la tua funzione esiste in essa puoi usarla come: 

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

Sono sorpreso che la risposta al codice non sia già stata pubblicata, è una sola. 

Potresti solo {{ categeory_id | getVariations }}

È un one-liner: 

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

Mentre sono d'accordo con i commenti sul passaggio di variabili dal controller, è anche possibile registrare funzioni non definite quando si imposta l'ambiente di ramoscello

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

Questo è dal/ Ricetta Twig

Non ho provato a chiamare una funzione su un oggetto come la domanda originale richiesta 

1

So che questo è un vecchio thread. Ma con symfony 3.3 ho fatto questo:

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

Symfony docs

0
Refilon