Bonjour,

Je me suis appuyé sur le cookbook pour tester les extentions Twig et ajouter une fonction filter mais le service ne fonctionne pas sur Twig alors que le service qui fait le filter fonctionne bien au niveau du PHP.

J'ai crée un bundle CoPaquetBundle, ensuite le code de COPricefilter.php qui contient la fonction priceFilter qui permet à partir d'un nombre d'ajouter un symbole pour les décimal et un séparateur pour les milliers:

src/Co/PaquetBundle/Pricefilter/COPricefilter.php

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
 
<?php
 
namespace Co\PaquetBundle\Pricefilter;
 
class COPricefilter
{
    public function __construct()
    {
    }
 
    public function priceFilter($number, $decimals = 0, $decPoint = '.', $thousandsSep = ',')
    {
        $price = number_format($number, $decimals, $decPoint, $thousandsSep);
 
        $price = '$'.$price;
 
        return $price;
    }
}
Et voilà, le code de mon service intermédiaire qui contiendra notamment le tag twig.extension

src/Co/PaquetBundle/Twig/PricefilterExtension.php:

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
 
<?php
 
namespace Co\PaquetBundle\Twig;
 
use Co\PaquetBundle\Pricefilter\COPricefilter;
 
class PricefilterExtension extends \Twig_Extension
{
    /**
     * @var COPricefilter
     */
    private $coPricefilter;
 
    public function __construct(COPricefilter $coPricefilter)
    {
        $this->coPricefilter = $coPricefilter;
    }
 
    public function getFilters()
    {
        return array(
            new \Twig_SimpleFilter('unfiltre', array($this, 'checkPriceFilter')),
        );
    }
 
    public function checkPriceFilter($number, $decimals = 0, $decPoint = '.', $thousandsSep = ',')
    {
        $this->coPricefilter->priceFilter($number, $decimals, $decPoint, $thousandsSep);
    }
 
    public function getName()
    {
        return 'COPricefilter';
    }
}
Le fichier de configuration

src/Co/PaquetBundle/Resources/config/service.yml:

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
 
services:
    co_paquet.pricefilter:
        class: Co\PaquetBundle\Pricefilter\COPricefilter
 
    co_paquet.pricefilter_extension:
        class: Co\PaquetBundle\Twig\PricefilterExtension
        arguments:
            - "@co_paquet.pricefilter"
        tags:
            - { name: twig.extension }
Et voilà mon code pour tester sur une vue twig
src/Co/PaquetBundle/Resources/view/Manage/test.html.twig:

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
 
{% extends "CoPaquetBundle::layout.html.twig" %}
 
{% block title %}{{ parent() }} Ajout d'un complément{% endblock %}
 
{% block body %}
<br>
Nouveau projet pour tester les services!<br>
Réponse Spam: {{retour}}
 
<br>
On vérifie la fonction twig:
{{ checkIfSpam('le message') }}
<br>
{{'5600'|unfiltre}}
<br>
 
{{priceafficher}}
 
{% endblock %}
src/Co/PaquetBundle/Resources/views/layout.html.twig

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
 
{% extends "::layout.html.twig" %}
 
{% block paquet_title %}
 
{% endblock %}
 
{% block paquet_block_body %}
    Bienvenue sur cette application permettant de tester les services Symfony sur la version 3.4.
{% endblock %}
src/Co/PaquetBundle/Resources/config/routing.yml:

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
 
co_paquet_homepage:
    path:     /
    defaults: { _controller: CoPaquetBundle:Default:index }
 
co_paquet_accueil:
    path: /accueil
    defaults: { _controller: CoPaquetBundle:Manage:accueil }
Merci de m'aider à faire fonctionner le filter qui retourne ce qu'il faut au niveau du service PHP (puisque j'avais vérifié en écrivant le résultat dans un fichier) mais qui renvoit avec twig, l'erreur suivante:

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
 
An exception has been thrown during the rendering of a template ("Catchable Fatal Error: Object of class Co\PaquetBundle\Pricefilter\COPricefilter could not be converted to string").
 
Symfony\Component\Debug\Exception\ ContextErrorException
Catchable Fatal Error: Object of class Co\PaquetBundle\Pricefilter\COPricefilter could not be converted to string
Merci par avance