web-dev-qa-db-fra.com

filtre la variable booléenne dans un modèle twig

J'ai une variable booléenne (0, 1) dans ma base de données et je veux la filtrer en un mot 0 pour "NON" et 1 pour "Oui". comment puis-je faire cela dans un modèle twig

Je veux quelque chose comme {{ bool_var | '??' }} où le '??' est le filtre

28
anyavacy

Le moyen rapide d'y parvenir est d'utiliser l'opérateur ternaire:

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

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

Vous pouvez également créer un filtre personnalisé qui ferait cela. En savoir plus sur les extensions personnalisées TWIG - http://symfony.com/doc/current/cookbook/templating/twig_extension.html

70
dmnptr

Pour construire sur ce que @dmnptr a dit dans son dernier paragraphe, dans votre bundle d'application, créez un dossier /Twig Et créez une classe AppExtension à l'intérieur.

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

Ensuite, dans le dossier Resources/config/ De votre ensemble, ajoutez ce qui suit à votre services.yml Où classe est la classe de la nouvelle classe:

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

Le filtre sera disponible en Twig en ajoutant simplement un |boolean À n'importe quelle variable.

3
bassplayer7

Ou encore mieux, vous pouvez créer un transformateur booléen en chaîne et l'ajouter à votre formulaire.

Il pourrait s'agir de "plus" de code, mais l'avantage est la réutilisabilité. Vous n'auriez pas à salir vos modèles avec la logique et vous pourriez les réutiliser dans tous les formulaires que vous voulez :)

Avantages:

  • Pas lié au composant de formulaire, vous pouvez donc toujours l'utiliser.
  • Utilisez-le n'importe où, plus de fonctionnalités qu'une extension twig.
  • Pas besoin de jouer avec twig ou configuration symfony.
  • Peut l'utiliser dans les formulaires eux-mêmes.

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

Exemple de: Problème Symfony2 Forms BooleanToStringTransformer

<?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;
    }
}
1
Tek