在树枝模板中过滤布尔变量

时间:2014-07-11 20:50:55

标签: symfony twig

我的数据库中有一个布尔变量(0,1),我希望将其过滤为单词0表示“否”'和1表示“是”'。我怎么能在树枝模板中做到这一点

我想要{{ bool_var | '??' }}之类的内容,其中包括''是过滤器

3 个答案:

答案 0 :(得分:68)

实现这一目标的快速方法是使用三元运算符:

{{ bool_var ? 'Yes':'No' }}

http://twig.sensiolabs.org/doc/templates.html#other-operators

您还可以创建一个自定义过滤器来执行此操作。了解自定义TWIG扩展程序 - http://symfony.com/doc/current/cookbook/templating/twig_extension.html

答案 1 :(得分:2)

要构建@dmnptr在其最后一段中所说的内容,请在您的应用包中创建一个/Twig文件夹并在其中创建一个AppExtension类。

class AppExtension extends \Twig_Extension
{
    public function getFilters()
    {
        return array(
            new \Twig_SimpleFilter('boolean', array($this, 'booleanFilter')),
        );
    }

    public function booleanFilter($value)
    {
        if ($value) {
            return "Yes";
        } else {
            return "No";
        }
    }

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

然后,在您的包的Resources/config/文件夹中,将以下内容添加到services.yml,其中class是新类的类:

app.twig_extension:
    class: [YourAppBundleNamespace]\Twig\AppExtension
    public: false
    tags:
        - { name: twig.extension }

只需将|boolean附加到任何变量即可在Twig中使用过滤器。

答案 2 :(得分:1)

或者甚至更好的是你可以将一个布尔值设置为字符串变换器并将其添加到表单中。

可能会更多'代码,但优点是可重用性。您不必使用逻辑使模板变脏,您可以将其重复用于所需的所有表单:)

优点:

  • 不依赖于表单组件,因此您仍然可以使用它。
  • 在任何地方使用它,比枝条扩展更多功能。
  • 无需弄乱树枝或symfony配置。
  • 可以在表单中使用它。

文档: http://symfony.com/doc/current/cookbook/form/data_transformers.html

示例来自: Symfony2 Forms BooleanToStringTransformer Issue

<?php

use Symfony\Component\Form\DataTransformerInterface;
use Symfony\Component\Form\Exception\TransformationFailedException;

class BooleanToStringTransformer implements DataTransformerInterface
{
    private $trueValue;
    private $falseValue;

    public function __construct($trueValue, $falseValue)
    {
        $this->trueValue = $trueValue;
        $this->falseValue = $falseValue;
    }

    public function transform($value)
    {
        if (null === $value) {
             return null;
        }

        if (!is_bool($value)) {
            throw new TransformationFailedException('Expected a Boolean.');
        }

        return true === $value ? $this->trueValue : $this->falseValue;
    }

    public function reverseTransform($value)
    {
        if (null === $value) {
            return null;
        }

        if (!is_string($value)) {
            throw new TransformationFailedException('Expected a string.');
        }

        return $this->trueValue === $value;
    }
}