str_replace veut pas remplacer :'(

Eléphanteau du PHP | 21 Messages

13 mars 2007, 20:56

Bonjour,

Je bloque depuis une heure sur mon problème et franchement, je comprends pas...

Au secours ! :cry:

voici le code :

<?php

	# date actuelle
	$date_actuelle = date('Y-m-d');

	# désignation du template
	$tpl_file_html = file_get_contents('templates/tpl_soirees.html');

	# Tags
	$partie1_tag = array('tpl_part#01');
	$partie2_tag = array('tpl_part#02');


# requete partie1
$requete1 = 'SELECT * FROM soirees WHERE date>'.$date_actuelle.' AND online=\'yes\' ORDER BY date LIMIT '.$messages_par_page;

# démarage moteurs
$partie1 = new tpl_moteur;
$partie2 = new tpl_moteur;

# extraction partie1 du template
$partie1->tpl_extraction_partie($tpl_file_html,$partie1_tag);
$partie2->tpl_extraction_partie($tpl_file_html,$partie2_tag);

#echo $partie1->tpl_parties[0];
#echo $partie2->tpl_parties[0];

$resultat1 = mysql_query($requete1);

while ($row1 = mysql_fetch_assoc($resultat1)){

	#requête partie 2
	$requete2 = 'SELECT * FROM soirees_elements WHERE id_soirees='.$row1['id'].' AND online=\'yes\' ORDER BY debut';
	$resultat2 = mysql_query($requete2);

	$tpl_html_out_partie2 = '';

	while ($row2 = mysql_fetch_assoc($resultat2)){

		# éléments à changer
		$partie2->tpl_variables('{image}',$row2['image']);
		$partie2->tpl_variables('{debut}',$row2['debut']);
		$partie2->tpl_variables('{fin}',$row2['fin']);
		$partie2->tpl_variables('{contenu}',$row2['contenu']);

		#remplacement
		$partie2->tpl_remplacement();

		#accumulation des parties de la soirée
		$tpl_html_out_partie2 .= $partie2->tpl_html_out;
		$partie2->tpl_unset();
	}

	# test provisoire
	#echo '<h1>'.$row1['date'].'</h1>';
	#echo $tpl_html_out_partie2;

	# éléments à changer
	$partie1->tpl_variables('{date}',$row1['date']);
	$partie1->tpl_variables('$partie2->tpl_parties[0]','$tpl_html_out_partie2');

	# remplacement
	$partie1->tpl_remplacement();

	#accumulation des soirées
	$tpl_html_out_partie1 .= $partie1->tpl_html_out;
	$partie1->tpl_unset();

}
	#sortie de test
	echo $tpl_html_out_partie1;
?>
Et là, le problème c'est que du code qui suit seul la date change:
    # éléments à changer
    $partie1->tpl_variables('{date}',$row1['date']);
    $partie1->tpl_variables('$partie2->tpl_parties[0]','$tpl_html_out_partie2');
je comprends pas pourquoi. :?

Voilà, merci d'avance ! ^^

Mammouth du PHP | 505 Messages

13 mars 2007, 20:59

sans la définition de la class tpl_moteur(), on aura bien du mal a t'aider

Eléphanteau du PHP | 21 Messages

13 mars 2007, 21:05

Ah oui, c'est pas faux :oops:
<?php

class tpl_moteur {

	public $tpl_html_out;
	public $tpl_parties;

	#var $tpl_parties = array();
	var $tpl_parties_max = int;
	var $tpl_parties_alt = int;

	var $tpl_recherche = array();
	var $tpl_remplace = array();

	function tpl_extraction_partie ($tpl_file_html,$tag){

		foreach ($tag as $html_tag){

			$verif = stripos($tpl_file_html, $html_tag);
			if ($verif === false) {

				# affichage erreur
   				echo "<b>Une erreur s'est produite :</b> le tag '<i>$html_tag</i>' n'a pas &eacute;t&eacute; trouv&eacute;e dans le template.";

			}else{

				# création des tags réels
				$html_tag_start = '<!-- '.$html_tag.':start -->';
				$html_tag_end = '<!-- '.$html_tag.':end -->';

				# calculs des limites de l'extrait
				$pos_debut_extrait = strpos($tpl_file_html,$html_tag_start);
				$pos_fin_extrait = strpos($tpl_file_html,$html_tag_end)+strlen($html_tag_end);

				# extraction de l'extrait
				$extrait = (substr($tpl_file_html, $pos_debut_extrait,$pos_fin_extrait-$pos_debut_extrait)."\n\n");

				# ajout de l'extrait dans le tableau
				$this->tpl_parties[] = $extrait;
			}
		}

		# On compte le nombre de partie pour l'alternance de pattern
		$this->tpl_parties_max = count ($this->tpl_parties);
		$this->tpl_parties_alt = 0 ;
	}

	function tpl_variables ($tpl_nom,$tpl_valeur){
		$this->tpl_recherche[] = $tpl_nom;
		$this->tpl_remplace[] = $tpl_valeur;
	}

	function tpl_remplacement(){

		$this->tpl_html_out = str_replace ($this->tpl_recherche, $this->tpl_remplace, $this->tpl_parties[$this->tpl_parties_alt]);

		$this->tpl_parties_alt +=1;
		if ($this->tpl_parties_alt>=$this->tpl_parties_max){
			$this->tpl_parties_alt = 0 ;
		}

	}

	function tpl_unset(){
		unset ($this->tpl_recherche,$this->tpl_remplace,$this->tpl_parties_max,$this->tplparties_alt,$this->tpl_html_out);
	}
}
?>

Mammouth du PHP | 505 Messages

13 mars 2007, 23:01

Sans regarder plus que ca, un truc m'attire l'oeil...
   $partie1->tpl_variables('$partie2->tpl_parties[0]','$tpl_html_out_partie2'); 
Je suis pas sur que tu veuilles faire ca...
Essai plutot comme ca...
   $partie1->tpl_variables($partie2->tpl_parties[0],$tpl_html_out_partie2); 

Invité
Invité n'ayant pas de compte PHPfrance

13 mars 2007, 23:30

ah oui non mais c'était comme ça avant ! lol
j'avais changé pour voir, j'ai oublié de le changer.

... et ça marche pas du coup. :(

Eléphanteau du PHP | 21 Messages

13 mars 2007, 23:46

oups j'ai oublié de me logger, si un admin passe dans le coin :oops:

Eléphanteau du PHP | 21 Messages

14 mars 2007, 13:28

Au secours !! :cry:

Eléphant du PHP | 259 Messages

14 mars 2007, 13:43

hello,

un petit print_r() sur les variables que tu passe à str_replace te donnerait peut-être une piste pour débugger ta classe... voir meme un print_r( $taClasse ), pour vérifier qu'elle a bien la "forme" escomptée...

accessoirement, tu mélange des déclarations php5 et php4... à priori ca devrait pas causer de bug, (à moins que tu décide d'afficher les erreurs de niveau E_STRICT) mais c'est pas une habitude recommandable.

Bon courage ! ;)

Eléphanteau du PHP | 21 Messages

14 mars 2007, 16:20

Merci Jules pour ton aide ! :wink:
un petit print_r() sur les variables que tu passe à str_replace te donnerait peut-être une piste pour débugger ta classe... voir meme un print_r( $taClasse ), pour vérifier qu'elle a bien la "forme" escomptée..
Je viens de le faire et ça me donne pour une des soirées ça :
tpl_moteur Object
(
    [tpl_parties] => Array
        (
            [0] => <!-- tpl_part#01:start -->
	<div><h3><u>{date}</u></h3></div>

<!-- tpl_part#02:start -->
	<div>
		<img src = "{image}" alt="image de la partie de soir&eacute;e" width="100"/>
	</div>

	
	<div>
		<p>{debut}/{fin}</p>
	</div>
	
	<div>
		<p>{contenu}</p>
	</div>
<!-- tpl_part#02:end -->

<!-- tpl_part#01:end -->


        )

    [tpl_parties_alt] => 0
    [tpl_recherche] => Array
        (
            [0] => {date}
            [1] => <!-- tpl_part#02:start -->
	<div>
		<img src = "{image}" alt="image de la partie de soir&eacute;e" width="100"/>
	</div>
	
	<div>
		<p>{debut}/{fin}</p>
	</div>

	
	<div>
		<p>{contenu}</p>
	</div>
<!-- tpl_part#02:end -->


        )

    [tpl_remplace] => Array
        (
            [0] => 2007-03-18
            [1] => <!-- tpl_part#02:start -->
	<div>
		<img src = "http://img.audiofanzine.com/img/v35/logo.jpg?id=11" alt="image de la partie de soir&eacute;e" width="100"/>

	</div>
	
	<div>
		<p>20:00/21:30</p>
	</div>
	
	<div>
		<p>bla bla</p>
	</div>
<!-- tpl_part#02:end -->

<!-- tpl_part#02:start -->
	<div>
		<img src = "http://fr.audiofanzine.com/img/produits/normal/1/1/111163.jpg" alt="image de la partie de soir&eacute;e" width="100"/>
	</div>
	
	<div>
		<p>21:40/23:30</p>
	</div>
	
	<div>

		<p>Nec piget dicere avide magis hanc insulam populum Romanum invasisse quam iuste. Ptolomaeo enim rege foederato nobis et socio ob aerarii nostri angustias iusso sine ulla culpa proscribi ideoque hausto veneno voluntaria morte deleto et tributaria facta est </p>
	</div>
<!-- tpl_part#02:end -->


        )

    [tpl_html_out] => <!-- tpl_part#01:start -->
	<div><h3><u>2007-03-18</u></h3></div>

<!-- tpl_part#02:start -->
	<div>

		<img src = "{image}" alt="image de la partie de soir&eacute;e" width="100"/>
	</div>
	
	<div>
		<p>{debut}/{fin}</p>
	</div>
	
	<div>
		<p>{contenu}</p>
	</div>

<!-- tpl_part#02:end -->

<!-- tpl_part#01:end -->


)
Je comprends pas tout est là pour que ça remplace mais ça ne se remplace pas ! :shock:

ça me donne ça :

Code : Tout sélectionner

<!-- tpl_part#01:start --> <div><h3><u>2007-03-18</u></h3></div> <!-- tpl_part#02:start --> <div> <img src = "{image}" alt="image de la partie de soir&eacute;e" width="100"/> </div> <div> <p>{debut}/{fin}</p> </div> <div> <p>{contenu}</p> </div> <!-- tpl_part#02:end --> <!-- tpl_part#01:end -->
Si quelqu'un comprends quelquechose...

P.s. : si je mélange, php4 et 5 c'est pour que ça passe chez free. :? Enfin, si tu parles des requetes mysql.

Eléphant du PHP | 259 Messages

14 mars 2007, 18:55

je parlais surtout des déclarations de variables : "var" et "public" mélangés... c'est mal poli ;)

sinon pour ce qui est de ta classe, elle a l'air pas mal foutue, mais trop complexe pour la débuguer sur un forum peut-être ;)

tu devrais essayer un script de test, fonction par fonction... en commençant par de simples remplacements, puis ensuite en testant les boucles, etc...

enfin si tu veux t'éviter de te prendre le chou, il existe aussi des milliers de classes de templates, plus ou moins efficaces... mais je peux comprendre que c'est plus marrant de faire la sienne... j'ai fait la meme chose (qui ressemble fortement à la tienne d'ailleurs...)

bref, désolé de pas pouvoir t'aider plus, mais mon neurone a déja du mal avec le code que je ponds, alors celui des autres... ;)

Mammouth du PHP | 505 Messages

15 mars 2007, 00:18

Bah quand on regarde ce que contient les vars c'est normal que seule {date} soit remplacé

tu fais un str_replace d'un array par un autre array
Donc chaque element du premier array sera remplacer par l'élement equivalent ds le second array

ton premier array contient
[tpl_recherche] => Array
        (
            [0] => {date}
            [1] => <!-- tpl_part#02:start -->
    <div>
        <img src = "{image}" alt="image de la partie de soir&eacute;e" width="100"/>
    </div>
    
    <div>
        <p>{debut}/{fin}</p>
    </div>

    
    <div>
        <p>{contenu}</p>
    </div>
<!-- tpl_part#02:end -->


        ) 

Alors pour l'élement 0, c 'est {date} et ca marche, Ok normale on le retrouve dans la section tpl_parties, mais pour l'element 1, c'est plutot louche comme éléement de recherche.... Tu devrais avoir {debut}, etc...
La tu as un bout de code html qui manifestement n'este pas totalement identique (y a déjà l'air d'avoir un newline en plus au dessus du div {debut}/{fin}....

Bref, t'aurai pu faire un file_put_contents de tes recherche et de ta cible, et tu aurai vupourquoi ca match pas.

Eléphanteau du PHP | 21 Messages

15 mars 2007, 17:21

Oueh, en fait si j'avais coder de manière un peu plus pro dès le dépard, j'aurais foutu des conditions dans chaque fonction pour le débugage... :oops:

J'aurais certainement au final moins perdu de temps.

note pour plutard : toujours partir du principe que ça peut ne pas marcher.

Enfin bref.
La tu as un bout de code html qui manifestement n'este pas totalement identique
Manifestement. Mais c'est justement ça que j'aimerai comprendre : pourquoi ce fichu bout de code n'est pas identique.
Parceque je l'extrait puis je le recherche dans le fichier d'où je l'ai extrait. J'aimerai bien savoir ce qui c'est passé entre c'est deux moments pour le rendre non trouvablepar mon str_teplace.

Parceque bon, quand un mur est trop haut, on passe à côté mais quand même, c'est couillon, refaire une autre fonction juste pour remplacer ce foutu code html alors que c'est le même principe que pour les {machin_truc}... T_T snif

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 13231 Messages

15 mars 2007, 18:34

Oueh, en fait si j'avais coder de manière un peu plus pro dès le dépard, j'aurais foutu des conditions dans chaque fonction pour le débugage... :oops:

J'aurais certainement au final moins perdu de temps.

note pour plutard : toujours partir du principe que ça peut ne pas marcher.
Bienvenue dans le monde des développeurs professionnels :pouce:

Toujours prévoir le cas où ça va ne pas marcher parce qu'il y a 9 chances sur 10 qu'il arrive ;)
Connaître son ignorance est la meilleure part de la connaissance
Pour un code lisible : n'hésitez pas à sauter des lignes et indenter

twitter - site perso - Github - Zend Certified Engineer

Mammouth du PHP | 505 Messages

15 mars 2007, 20:26

Bah je t'ai montré une différence... Y a un newline en plus dans un cas...

Ca pourrai etre du par exemple a une convertion des fins de lignes ...

Eléphanteau du PHP | 21 Messages

15 mars 2007, 21:43

Ah mince, désolé ! ^^

j'ai du lire un peu trop vite!
Bienvenue dans le monde des développeurs professionnels
Mais heu !!! :oops: