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.

Nom : modele01.png
Affichages : 119
Taille : 115,9 Ko

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.
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',
 ...
);
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
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);
 }
D'abord, un petit test bidon, pour voir si j'ai autant d'accolades ouvrantes que fermantes.
ensuite, avec preg_replace_callback
  1. j'appelle une fonction sur chaque clef entre accolades,
  2. lui enlève ses accolades, avec une autre regex
  3. 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
Nom : modele02.png
Affichages : 115
Taille : 106,5 Ko

Merci pour votre réponse.
Christian.