Bonjour,
J'ai une chaîne de caractères, qui contient des variables, que je dois remplacer par leur valeur.
Quand je parle de variables, ce sont des expressions que j'ai inventé, pour permettre à des avocats de composer des courriers dynamiques.
Exemple : Je m'appelle {avoNom}, mon prénom est {avoPrenom}, j'habite {avoAdresse}, dans la ville de {avoVille}, dont le code postal est {avoPostal}
Les avocats composent leurs modèles, y insèrent des variables, qui afficheront leur nom, celui du client, de l'adversaire, etc ...
Tout ceci fonctionne.
Maintenant, je voudrais remplacer lesdites {variables} entre accolades par la valeur de la méthode.
J'ai un objet avocat = new Avocat(id);
avocat->getNom() rend son nom de famille
avocat->getPrenom() rend son prénom
etc ...
J'ai construit un tableau associatif, qui rend la méthode à appeler, sur base de la variable, qui en est la clef.
Ensuite, je passe la chaîne à une fonction, qui extrait, par une regex, les champs, et appelle le tableau associatif.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9 public static $champs = array ( 'avoNom' => 'lAvocat->getNom', 'avoPrenom' => 'lAvocat->getPrenom', 'avoTel' => 'lAvocat->getTel', 'avoFax' => 'lAvocat->getFax', ... );
D'abord, un petit test bidon, pour voir si j'ai autant d'accolades ouvrantes que fermantes.
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 public static function champsValeurs($pChaine, $lAvocat) { if(substr_count($pChaine, '{') == substr_count($pChaine, '}')) { $pChaine = preg_replace_callback ( '/\{[a-zA-Z]*\}/', function($matches) { $clef = preg_replace('/\{|\}/', '', $matches[0]); $valeur = self::$champs[$clef](); return($valeur); }, $pChaine ); } return($pChaine); }
ensuite, avec preg_replace_callback
- j'appelle une fonction sur chaque clef entre accolades,
- lui enlève ses accolades, avec une autre regex
- et la passe au tableau associatif, qui me rend le nom de la méthode à appeler, que j'appelle dynamiquement en lui accolant deux parenthèses ()
Et là, c'est le drame. mon paramètre $lAvocat n'est pas reconnu de la callback appelée par preg_replace_callback.
Par contre, quand j'enlève les deux parenthèses () après le nom de la fonction, je le vois bien en sortie.
Je m'appelle lAvocat->getNom, mon prénom est lAvocat->getPrenom, j'habite lAvocat->getAdresse, dans la ville de lAvocat->getVille, dont le code postal est lAvocat->getPostal
Il a bien remplacé mes {variables} par les noms des méthodes à appeler. J'y suis presque :-)
Mais comment retrouver mon objet $lAvocat dans la callback de preg_replace_callback, pour y obtenir la valeur effectivement retournée par les getters, plutôt que le nom desdits getters ?
Voici ce que ça donne, sans les parenthèses
Merci pour votre réponse.
Christian.
Partager