在一个twig for call循环中调用一个函数

时间:2015-12-22 14:37:57

标签: php symfony twig

如何调用twig for循环中的函数。 我有一个数据库的数组输出,我在这样的树枝内调用它:

<tbody>
{% for O in Orders %}
<tr>
<td>{{ O.DomainName~'.'~O.Extension }}</td>
<td>{{ O.Package }}</td>
<td>{{ O.StoreDate }}</td>
<td>{{ O.ExecuteDate }}</td>
<td>{{ O.Email }}</td>
<td>{{ O.UserIP }}</td>
<td></td>
</tr>
{% endfor %}
</tbody>

UserIP将返回IP地址。 我想要完成的是为每个用户调用下面的函数并将其添加到表中。

    public function ip_country($userIP)
{
    $ip = $userIP;
    $details = json_decode(file_get_contents("http://freegeoip.net/json/{$ip}"));

    return $details->country_code; // -> "US"
}

现在我知道我不能直接从树枝上调用一个函数。 我是否需要将其添加为twig_simplefunction的枝条扩展名?

2 个答案:

答案 0 :(得分:2)

创建一个twig扩展并将代码包装在其中。您的代码将变得更加干净,不会污染视图和控制器。

首先创建一个过滤器

namespace AppBundle\Twig;
class MyIpExtension extends \Twig_Extension {
  public function getFilters()
  {
    return array(
        new \Twig_SimpleFilter('ipcountry', array($this, 'country')),
    );
  }

  public function ip_country($userIP) {
    $ip = $userIP;
    $details = json_decode(file_get_contents("http://freegeoip.net/json/{$ip}"));

    return $details->country_code; // -> "US"
 }


  public function getName()
  {
     return 'app_extension';
  }
}

然后注册为symfony容器服务

# app/config/services.yml
services:
   app.twig_extension:
      class: AppBundle\Twig\MyIpExtension
      public: false
      tags:
        - { name: twig.extension }

然后在树枝视图中使用扩展程序

{{ O.UserIP | ipcountry }}

密切关注类名和命名空间。做好适应环境的准备。

答案 1 :(得分:-1)

您可以使用模板中所需的功能创建一个简单的php类。在控制器操作中,您可以将初始化的类添加到模板渲染参数:

public function anyAction(Request $request) {
    $yourClass = new Class();

    $params = array(
        'functionsClass'   => $yourClass,   
    );

    $this->render('@yourBundle/Default/anyTemplate.html.twig', $params);
}

在模板中,您可以调用该类的所有公共函数。

但枝条延伸应该是更好的方式......