32

我的控制器中有一个函数,它返回实体数组,所以在我的树枝模板中,我这样做是为了迭代元素:

{% 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 模板处理后的实体的函数:

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

8 回答 8

27

无法直接访问 Twig 中的任何 PHP 函数。

你可以做的是编写一个 Twig 扩展。一个常见的结构是,编写一个具有一些实用功能的服务,编写一个 Twig 扩展作为从 twig 访问服务的桥梁。Twig 扩展将使用该服务,您的控制器也可以使用该服务。

看看:http ://symfony.com/doc/current/cookbook/template/twig_extension.html

干杯。

于 2013-09-06T23:18:56.543 回答
14

已经有一个 Twig 扩展,可让您从 Twig 模板调用 PHP 函数,例如:

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

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

请参阅官方扩展存储库

于 2014-12-10T20:13:12.507 回答
6

我很惊讶代码答案还没有发布,它是单行的。

你可以{{ categeory_id | getVariations }}

这是一个单行:
Twig2:

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

树枝 3:

$this->twig->addFilter(new \Twig\TwigFilter('getVariations','getVariations'));

Twig 3 但作为函数而不是过滤器:

$this->twig->addFunction(new \Twig\TwigFunction('getVariantsFunc', 'getVariations'));
于 2017-09-20T02:28:35.143 回答
4

您可以通过以下方式检查所有定义的功能

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

如果您的函数存在于其中,这将为您提供所有函数的数组,您可以像这样使用它:

 {{ user.myfunction({{parameter}}) }}
于 2015-01-30T08:49:37.127 回答
2

我知道这是一个旧线程。但是使用 symfony 3.3 我这样做了:

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

Symfony 文档

于 2017-12-08T23:22:59.607 回答
1

虽然我同意关于从控制器传递变量的评论,但您也可以在设置 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;
    });

这是来自Twig 食谱页面

没有尝试按照原始问题的要求在对象上调用函数

于 2015-10-28T10:51:06.660 回答
0

这对我有用(使用Slim Twig-View):

$twig->getEnvironment()->addFilter(
   new \Twig_Filter('md5', function($arg){ return md5($arg); })
);

这将创建一个名为md5返回参数的MD5 校验和的新过滤器。

于 2020-12-26T15:41:29.103 回答
-6

如果您真的知道自己在做什么并且不介意邪恶的方式,那么这是您需要的唯一额外的 Twig 扩展:

function evilEvalPhp($eval, $args = null)
{
    $result = null;
    eval($eval);
    return $result;
}
于 2017-07-24T20:20:48.593 回答