我的控制器中有一个函数返回实体数组,所以在我的twig模板中我这样做迭代元素:
{% 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 %}
在我的控制器中,我也有这个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);
}
}
}
我可以这样称呼它:
for ($i = 0; $i < count($arr); $i++) {
$this->DetailCombination($arr, $i + 1, $result);
}
// TEST
foreach ($result as $arr) {
echo join(" ", $arr) . '<br>';
}
可以从Twig模板访问PHP函数,以获得实体中所有可能的元素组合吗?怎么样?
**更新**
这是返回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;
}
答案 0 :(得分:20)
无法直接访问Twig中的任何PHP函数。
你可以做的是写一个Twig扩展。一个常见的结构是,用一些实用功能编写服务, 编写一个Twig扩展作为桥接来从twig访问服务。 Twig扩展将使用该服务和 您的控制器也可以使用该服务。
看看:http://symfony.com/doc/current/cookbook/templating/twig_extension.html
干杯。
答案 1 :(得分:9)
已经有一个Twig扩展,允许您从Twig模板调用PHP函数,如:
Hi, I am unique: {{ uniqid() }}.
And {{ floor(7.7) }} is floor of 7.7.
答案 2 :(得分:3)
您可以通过
检查所有已定义的功能$arr = get_defined_functions();
print_r($arr);
这将为您提供所有函数的数组,如果您的函数存在于其中,您可以使用它:
{{ user.myfunction({{parameter}}) }}
答案 3 :(得分:2)
我很惊讶代码答案还没有发布,这是一个单行。
你可以{{ categeory_id | getVariations }}
这是一个单行:
$twig->addFilter('getVariations', new Twig_Filter_Function('getVariations'));
答案 4 :(得分:1)
虽然我同意有关从控制器传入变量的注释,但您也可以在设置树枝环境时注册未定义的函数
$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;
});
Haven未尝试在原始问题上调用对象上的函数
答案 5 :(得分:0)
我知道这是一个老线程。但是使用symfony 3.3,我做到了这一点:
{{ render(controller(
'AppBundle\\Controller\\yourController::yourAction'
)) }}
答案 6 :(得分:0)
这对我有用(使用 Slim Twig-View):
$twig->getEnvironment()->addFilter(
new \Twig_Filter('md5', function($arg){ return md5($arg); })
);
这将创建一个名为 md5
的新过滤器,它返回参数的 MD5 checksum。
答案 7 :(得分:-1)
如果你真的知道你做了什么,而且你不介意邪恶的方式,这是你需要的唯一额外的Twig扩展:
function evilEvalPhp($eval, $args = null)
{
$result = null;
eval($eval);
return $result;
}