|
Hello tout le monde ;) j'ai commencé à réaliser une class template en PHP5. Je sais qu'il y en a une sur ce site, mais pour une fois je voulais en faire une moi-même ^^ Pour le début je n'ai pas eu de soucis : on peu associer un fichier, créer des variables et afficher le fichier? Mais je n'arrive pas à créer des blocs ! J'ai repris le code utilisé dans la class de ce site et l'ai adapté à la mienne, mais ça ne marche pas plus. Voici le code actuel (il est commenté donc vous devriez bien le comprendre) :
<?php
//
// fichier: class.template.php
// auteur: EmmaBlack
// crée: 16/08/2007
// version: 0.0.1 - 31/08/2007
//
class template {
private $blocs; // liste tous les blocs existants array('nom' => 'contenu')
private $cheminTpl; // chemin vers le dossier tpl correspondant au fichier en cours
private $contenuBloc; // liste le contenu des blocs array('nomBloc' => 'contenu')
private $erreur; // liste les erreurs possibles array('erreur')
private $variablesListe; // liste les variables et leur valeur array('NOM' => 'valeur')
/*
** initialise quelques variables
*/
public function __construct() {
$this->blocs = array('' => '');
$this->contenuBloc = array('' => '');
$this->erreur = array();
$this->variablesListe = array();
}
/*
** associe un fichier tpl à un fichier PHP
** $nomFichier nom du fichier tpl
** $cheminFichier chemin jusqu'au fichier tpl
*/
public function associer_fichier($nomFichier, $cheminFichier) {
global $racine;
$this->cheminFichier = $racine . 'styles/' . $cheminFichier . '/' . $nomFichier;
$this->cheminTpl = $racine. 'styles/' . $cheminFichier . '/';
$this->nomFichier = $nomFichier;
if (file_exists($this->cheminFichier)) {
$this->contenuFichier = file_get_contents($this->cheminFichier);
$this->inclure_fichier();
$this->variablesListe['RACINE_TPL'] = $racine . 'styles/' . $cheminFichier;
}
else {
$this->erreur[] = 'Impossible de trouver le fichier <b>' . $this->cheminFichier . '</b> (ligne ' . __LINE__ . ' du fichier ' . __FILE__ . ')';
}
}
/*
** inclut des fichiers tpl supplémentaires
*/
private function inclure_fichier() {
preg_match_all('#<!-- INCLURE ([a-zA-Z0-9\_\-\+\./]+) -->#', $this->contenuFichier, $matches);
foreach ($matches[1] as $fichier) {
if (file_exists($this->cheminTpl . $fichier)) {
$fichierInclut = @file_get_contents($this->cheminTpl . $fichier);
$this->contenuFichier = preg_replace('#<!-- INCLURE ' . $fichier . ' -->#', $fichierInclut, $this->contenuFichier);
unset($matches);
unset($fichier);
}
else {
$this->erreur[] = 'Le fichier tpl <b>' . $fichier . '</b> n\'existe pas (ligne ' . __LINE__ . ' du fichier ' . __FILE__ . ')';
}
}
if (preg_match('#<!-- INCLURE ([a-zA-Z0-9\_\-\+\./]+) -->#', $this->contenuFichier)) {
$this->inclure_fichier();
}
}
/*
** crée l'array contenant toutes les variables à remplacer dans le fichier tpl
** $variablesAry array de variables array('NOM', 'valeur')
*/
public function variables($variablesAry) {
if (is_array($variablesAry)) {
foreach ($variablesAry as $nom => $valeur) {
$this->variablesListe[$nom] = $valeur;
}
}
else {
$this->erreur[] = __METHOD__ . ' demande un array en entrée (ligne ' . __LINE__ . ' du fichier ' . __FILE__ . ')';
}
}
/*
** remplace les variables crées dans variables() par leur équivalent
*/
private function remplace_variables() {
global $lang;
foreach ($this->variablesListe as $nom => $valeur) {
$this->contenuFichier = str_replace('{' . $nom . '}', $valeur, $this->contenuFichier);
}
preg_match_all('#{L_([a-zA-Z0-9\_\-\+\./]+)}#', $this->contenuFichier, $cle);
foreach ($cle[1] as $cleLang) {
$this->contenuFichier = preg_replace('#{L_' . $cleLang . '}#', $lang[$cleLang], $this->contenuFichier);
}
}
/*
** crée l'array contenant toutes les variables à remplacer dans le bloc du fichier tpl
** $nomBloc nom du bloc
** $variablesAry array de variables array('NOM' => 'valeur')
*/
public function variables_bloc($nomBloc, $variablesAry) {
if (!array_key_exists($nomBloc, $this->blocs)) {
$tableauEreg = array();
ereg('<!-- DEBUT ' . $nomBloc . ' -->(.*)<!-- FIN ' . $nomBloc . ' -->', $this->contenuFichier, $tableauEreg);
$this->blocs[$nomBloc] = $tableauEreg[0];
}
$rechercheAry = array('<!-- DEBUT ' . $nomBloc . ' -->', '<!-- FIN ' . $nomBloc . ' -->');
$remplacementAry = array('', '');
foreach ($variablesAry as $nom => $valeur) {
$rechercheAry[] = '{' . $nomBloc . '.' . $nom . '}';
$remplacementAry[] = $valeur;
}
if (array_key_exists($nomBloc, $this->contenuBloc)) {
$this->contenuBloc[$nomBloc] .= str_replace($rechercheAry, $remplacementAry, $this->blocs[$nomBloc]);
}
else {
$this->contenuBloc[$nomBloc] = str_replace($rechercheAry, $remplacementAry, $this->blocs[$nomBloc]);
}
}
/*
** remplace les blocs de variables crée dans variables_blocs() par leur équivalent
*/
private function remplace_blocs() {
foreach ($this->contenuBloc as $nomBloc => $contenu) {
$this->contenuFichier = str_replace($this->blocs[$nomBloc], $contenu, $this->contenuFichier);
}
}
/*
** affiche le fichier demandé s'il n'y a pas d'erreur
*/
public function __toString() {
$this->remplace_variables();
$this->remplace_blocs();
if (!$this->erreur) {
return $this->contenuFichier;
}
exit;
}
/*
** affiche la liste d'erreur s'il y en a
*/
public function __destruct() {
if ($this->erreur) {
foreach ($this->erreur as $erreurId => $erreurTexte) {
$erreurId += 1;
echo '<br /><b>Erreur n°' . $erreurId . '</b> : ' . $erreurTexte;
}
}
}
}
?>
Si vous trouvez un moyen de résoudre mon soucis, merci de me l'indiquer ;) Bonne journée, EmmaBlack |
|
Hello ;) Merci pour la réponse. Pour la fonction toString, je pourrais retirer l'argument demandé en entrée. Il faudra juste modifier la fonction après pour que le résultat soit le même, mais ça ne doit pas être impossible :) Pour le moment j'arrête de toucher au code... Etant donné que tu es dessus, si tou les jours j'en poste un nouveau, ça n'aide pas :D |
 Admin |
Bah là j'ai lâché l'affaire, y'avait mon code, le tien, un mix des deux et au final rien ne marchait, alors quand par magie j'arrivais à corriger un truc y'avait autre chose qui déconnait, et ainsi de suite, bref l'horreur. -- 
|