Mise en place d'une extension Twig filter
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:
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:
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:
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:
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:
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:
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:
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