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;
}
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.
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 .
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}}) }}
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'));
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
Ich weiß, das ist ein alter Thread. Aber mit Symfony 3.3 habe ich folgendes gemacht:
{{ render(controller(
'AppBundle\\Controller\\yourController::yourAction'
)) }}