Page 1 sur 2

str_replace veut pas remplacer :'(

Posté : 13 mars 2007, 20:56
par amalgame
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 ! ^^

Posté : 13 mars 2007, 20:59
par titerm
sans la définition de la class tpl_moteur(), on aura bien du mal a t'aider

Posté : 13 mars 2007, 21:05
par amalgame
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);
	}
}
?>

Posté : 13 mars 2007, 23:01
par titerm
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); 

Posté : 13 mars 2007, 23:30
par Invité
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. :(

Posté : 13 mars 2007, 23:46
par amalgame
oups j'ai oublié de me logger, si un admin passe dans le coin :oops:

Posté : 14 mars 2007, 13:28
par amalgame
Au secours !! :cry:

Posté : 14 mars 2007, 13:43
par Jules Petibidon
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 ! ;)

Posté : 14 mars 2007, 16:20
par amalgame
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.

Posté : 14 mars 2007, 18:55
par Jules Petibidon
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... ;)

Posté : 15 mars 2007, 00:18
par titerm
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.

Posté : 15 mars 2007, 17:21
par amalgame
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

Posté : 15 mars 2007, 18:34
par zeus
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 ;)

Posté : 15 mars 2007, 20:26
par titerm
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 ...

Posté : 15 mars 2007, 21:43
par amalgame
Ah mince, désolé ! ^^

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