8721 sujets

Développement web côté serveur, CMS

Bonjour,
j'ai une balise [cat=1] dans un $texte
qui ensuite coté client affiche les articles de la catégorie 1 grâce à une fonction shortcode($texte).

j'arrive à afficher tous mes articles, par contre je suis obligé de faire la mise en page des articles dans la fonction shortcode().

je cherche une solution pour pouvoir faire la mise en page des articles dans un autre fichier plus facilement modifiable et de l'inclure dans ma fonction exactement à l'endroit où il y a la balise [cat=1] :

code php :

$texte='bonjour,<br>[cat=1]<br>c'est la fin';

echo shortcode($texte);

function shortcode{
$truc=$texte;
//ce que je veux remplacer [cat=1] par un include('cats.php') pour éviter de faire la mise en page directement dans la fonction :
$truc=preg_replace('[cat=1]',include('cats.php'),$truc);

//ce que j'ai actuellement et que je veux enlever :
$truc=<div>.art('titre').</div>
<div>.art('titre').</div>;
}

return $truc;


code cats.php :

<div><?php echo art('titre')?></div>
<div><?php echo art('titre')?></div>


le code est simplifié au max bien-sûr...

sinon j'avais bien le include directement dans la fonction mais dans ces cas-là, il est mis soit au début soit à la fin mais pas à la place de [cat=1]

j'ai bien essayé eval() mais sans succès, même quand je n'ai que du texte sans balise php et sans variable...

quelqu'un aurait une solution ?
Modérateur
Bonjour,

le problème est que include ne retourne pas la sortie du fichier cats.php, mais envoie ces lignes au navigateur et retourne 1

Il est possible de retourner une valeur dans un include mais ce n'est pas une très bonne pratique.

// ob_start() crée un buffer qui va stocker toutes les sorties de php 
// comme echo print ou du code hors balises <?php ?>
ob_start();
// On inclut le fichier (on peut rajouter du file_exists ou remplacer par un require)
include( $file );
// ob_get_clean() stoppe le buffer, le vide et renvoie son contenu
$file_contents = ob_get_clean();


après, pour être plus clean, on package le tout dans une fonction qui va bien:


// $variables est un tableau associatif qui contient les variables qui seront accessible dans le template
// sous la forme nomVariable => contenu. Cela est effectué automatiquement grâce à extract
function get_template($file, $variables) {
  extract($variables);

  ob_start();
  include( $file );
  return ob_get_clean();
}