for create symfony twig symfony-2.3

symfony - create - Llamar a la función PHP desde la plantilla Twig



twig for php (7)

Me sorprende que el código de respuesta no se haya publicado ya, es de una sola línea.

Usted podría simplemente {{ categeory_id | getVariations }} {{ categeory_id | getVariations }}

Es una sola línea:

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

Tengo una función en mi controlador que devuelve una matriz de entidades, así que en mi plantilla de ramita hago esto para iterar sobre los elementos:

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

En mi controlador también tengo esta función de 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); } } }

Puedo llamarlo de esta manera:

for ($i = 0; $i < count($arr); $i++) { $this->DetailCombination($arr, $i + 1, $result); } // TEST foreach ($result as $arr) { echo join(" ", $arr) . ''<br>''; }

¿Es posible el acceso a la función PHP desde la plantilla de Twig para obtener todas las combinaciones posibles de elementos en la entidad? ¿Cómo?

** ACTUALIZACIÓN **

Esta es la función que devuelve las entidades procesadas después por 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; }


No es posible acceder a ninguna función PHP dentro de Twig directamente.

Lo que puedes hacer es escribir una extensión de Twig. Una estructura común es, al escribir un servicio con algunas funciones de utilidad, escribir una extensión Twig como puente para acceder al servicio desde twig. La extensión Twig usará el servicio y su controlador también puede usar el servicio.

Eche un vistazo: http://symfony.com/doc/current/cookbook/templating/twig_extension.html

Aclamaciones.


Puede comprobar su función definida por

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

esto le dará una variedad de todas las funciones en si su función existe en ella, puede usarla como:

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


Sé que es un viejo tema. Pero con Symfony 3.3 hice esto:

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

Documentos de Symfony


Si bien estoy de acuerdo con los comentarios sobre la transferencia de variables desde su controlador, también puede registrar funciones no definidas al configurar el entorno 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; });

Esto es de la página de recetas de Twig.

No he intentado llamar a una función en un objeto como solicitó la pregunta original


Si realmente sabes lo que haces y no te importan los malos caminos, esta es la única extensión Twig adicional que necesitarás:

function evilEvalPhp($eval, $args = null) { $result = null; eval($eval); return $result; }


Ya existe una extensión de Twig que le permite llamar a funciones de PHP desde sus plantillas de Twig como:

Hi, I am unique: {{ uniqid() }}. And {{ floor(7.7) }} is floor of 7.7.

Ver repositorio oficial de extensiones .