[RESOLU] Comment créer pages html avec template + données csv

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : [RESOLU] Comment créer pages html avec template + données csv

Re: Comment créer pages html avec template + données csv

par monica59 » 14 juin 2014, 12:30

Hello,

Je viens de voir et on va dire que je n'aurai pas su le faire seule :( j'ai test le code cela marche parfaitement mais je ne comprends pas pourquoi la dernière ligne du csv n'est pas prise en compte il me creer 2 page au lieu de 3 .
Par contre des que je rajoute une ligne au csv il me génère 3 pages sur 4 , bon c'est pas trop gênant j'ajouterai une dernière ligne qui me servira pas ainsi j'aurai toute les pages :roll:
En tout cas merci beaucoup pour ton temps et d'avoir bien commenté ton code cela va beaucoup m'aider à l'avenir muchas gracias !!

Re: Comment créer pages html avec template + données csv

par telnes » 14 juin 2014, 11:27

<?php

$file = 'data.csv'; //chemin vers le fichier csv
$tpl = 'html.tpl'; //chemin vers le fichier template
$row = 1; //compteur de ligne
$tabData = array(); //tableau des données CSV
$tabTitle = array(); //titre les colonnes
$fileExt = '.html';

//ouvre le fichier
if (($handle = fopen($file, "r")) !== FALSE) {

        // on parcours le fichier csv tant qu'il n'y a plus de ligne
    while (($data = fgetcsv($handle, 1000, ",")) !== FALSE) {
        $num = count($data); //nombre de champs sur une ligne
                //récupère les champs sur une ligne
                for ($c=0; $c < $num; $c++) {
                        if($row == 1){ // titre des colonnes csv
                         
                                $tabData[trim($data[$c])] = array(); //on créer un tableau avec le titre de la colonne
                                $tabTitle[$c] = trim($data[$c]);
                        }
                        else{
                                
                                $tabData[$tabTitle[$c]][] = trim($data[$c]); // on met les données dans le tableau
                        
                        }                               
                }       
                $row++; // on incrémente la ligne
    }           
                
                
        //récupère le fichier template
        $tplFile = file_get_contents($tpl);//récupère le fichier template
		
		$row = $row-2; //décrémente de 2 ( titre + incrément de fin en trop)
		
		//boucle sur le nombre de ligne == nombre de fichier à créer
		for($i=1;$i<$row;$i++){
			
			$tplFileTmp = $tplFile; // on associe un tpl clean
			$datas = getLine($tabData,$i);//récupère les champs de la ligne $i (1 2 3 ...)

			//boucle sur les champs pour remplacer dans le fichier tpl
			foreach($datas as $title=>$value){
					//remplace dans le tpl
					$tplFileTmp = str_replace('{'.$title.'}',$value,$tplFileTmp);
			}
			
                        // écrire le fichier
			file_put_contents($datas['productname'].$fileExt,$tplFileTmp);
			echo $datas['productname'].$fileExt." créer !<br />\n";
			
		}	

}
else{

        die("no file to open");
}

//function sinon
function getLine($array,$num){

        $ligne = $num-1;
        $tmp = array(); //tableau
        foreach($array as $title=>$tab){ //pour chaque titre=>valeur du tableau
        
                $tmp[$title]=$tab[$ligne]; 
        }
        return $tmp;
}



?>
 

Re: Comment créer pages html avec template + données csv

par monica59 » 13 juin 2014, 18:10

ok

mais si je met le contenu de $tplFile dans un fichier je risque d'avoir une page enregistre de la meme sorte que ce que me donne le echo $tplFile

de ce que je vois le echo $tplFile m'affiche tout les pages dans une seule page dynamique alors je vois pas comment il va me dissocier le tout ??

Re: Comment créer pages html avec template + données csv

par telnes » 13 juin 2014, 18:01

hello

tu dois mettre le contenu de $tplFile dans un fichier, (si le fichier n'existe pas, il sera créé (il faut tout lire)

Re: Comment créer pages html avec template + données csv

par monica59 » 13 juin 2014, 17:12

Ola

j'ai vu la fonction file_put_contents mais dans l'exemple le fichier existe deja
<?php
$file = 'people.txt';
// Ouvre un fichier pour lire un contenu existant
$current = file_get_contents($file);
// Ajoute une personne
$current .= "Jean Dupond\n";
// Écrit le résultat dans le fichier
file_put_contents($file, $current);
?>
la dans notre cas les pages sont générée à la volé alors je vois pas trop ou je dois les enregistrées

je pense que c'est à ce niveau la
     //écris les autres pages
        foreach($tabData['productname'] as $p=>$value){
        
               echo  '<a href="?p='.($p+1).'">'.$value.'</a> - '; // lien pas tres catholique !! ??? :/ <img src="http://forum.phpfrance.com/images/smilies/icon_smile.gif" alt=":)" title="Smile" />
                //echo '<a href="'.$value.'.html">'.$value.'</a> - '; // lien pas tres catholique !! ??? :/ <img src="http://forum.phpfrance.com/images/smilies/icon_smile.gif" alt=":)" title="Smile" />
        }
        
        echo $tplFile; //affiche le tpl

Re: Comment créer pages html avec template + données csv

par telnes » 13 juin 2014, 16:19

hello

au lieu de faire un echo de la page il faut l'enregistré via http://fr2.php.net/manual/fr/function.f ... ntents.php par exemple (bonne lecture lecture)

Re: Comment créer pages html avec template + données csv

par monica59 » 13 juin 2014, 16:03

Ola

Je viens de tester le code cela marche nickel seulement comment je fais pour les enregistrer séparément genre page1.html page2.html etc..

En tout cas c'est tres bien expliqué sur le code =D>

Re: Comment créer pages html avec template + données csv

par monica59 » 13 juin 2014, 15:45

ah mince je n'avais pas vu ok donc j'avais tout faux sur le string je vois ce que cela veux dire maintenant je vais tester le code merci pour ton temps :oops:

Re: Comment créer pages html avec template + données csv

par telnes » 13 juin 2014, 15:19

hello
$productname = ["productname"]=> string(13);


ca n'existe pas !! c'est pas possible (erreur), la synthaxe est incorrecte

ensuite var_dump() affiche la structure de la donnée, en l'occurence ici c'est un tableau (array) et string correspond à la longueur de la chaine dans le champs ... cf la doc http://fr2.php.net/manual/fr/function.var-dump.php
ce qui est important dans le tableau c'est les index et les valeurs.
var_dump(array('titi','toto'));
array(2) {
  [0]=>
  string(4) "titi"
  [1]=>
  string(4) "toto"
}
tu as un tableau avec 2 valeurs (array(2))
en index 1 de ton tableau tu as "titi" qui fait 4 caractères (string(4))
...

si tu veux accéder au champs 2 de ton tableau il faut faire
$tab = array('titi','tata');
echo $tab[1]; // index 0,1 ....
il faut te documenter et surtout faire des exemples simples pour comprendre les for,foreach array ...

le code que tu veux est ici php-debutant/comment-creer-pages-html-a ... ml#p424316 mais tu n'a pas regardé

++

Re: Comment créer pages html avec template + données csv

par monica59 » 13 juin 2014, 14:57

1 oui j'ai vu que la ligne deux etait manquante je l'ai ajouter au code var_dump(getLine($tabData,2));

ensuite de ce que j'ai compris le string(13) est egale à la colonne productname donc maintenant avec ces valeurs

je doit les inserer dans le fichier template.html pour cela je dois remplacer les <title>{productname} Home Page</title> par quelque chose comme <title> <?php echo $productname; ?> Home Page</title> faire ca pour tout le reste et enregistrer le template
avec le nom du produit.html et passer à la ligne suivant en répétant la meme chose.

mon code
<?php

$productname = ["productname"]=> string(13);
$productlogo = ["productlogo"]=> string(14);
$productimage = ["productimage"]=> string(15);
$productoldprice = ["productoldprice"]=> string(18);
$productprice = ["productprice"]=> string(15);
$model = ["model"]=> string(8);
$productdescription = ["productdescription"]=> string(21);

$fp = fopen("template.html", "a");

fputcsv($fp,array($productname ,
$productlogo ,
$productimage ,
$productoldprice ,
$productprice ,
$model ,
$productdescription,
));

fclose($fp);

?>
va juste creer un fichier template.html avec ces infos dedans ..... mais ce n'est pas ca que je dois faire
d'abord lire le csv ensuite recuperer les infos du csv ensuite ouvrir le fichier template.html et remplacer les endroits spécifiques par les infos récupérées du csv et ensuite me servir du nom du produit pour donner un nom unique a la page html

Re: Comment créer pages html avec template + données csv

par telnes » 13 juin 2014, 14:09

1 est ce que tu as compris le code ?
2 est ce que tu as regardé sur http://www.php.net/ les fonctions qui te paraissent pas claires ?
3 est ce que tu as exécuté ton code ?

ps : la lecture de http://www.php.net/manual/fr/language.v ... basics.php est fortement conseillé


html.tpl
<html> 
<head> 
<title>{productname} Home Page</title> 
<style></style> 
</head> 
<body> 
<img style="width: 100%; height: 100%" src='data:image/png;base64,{productlogo}'/> 
<img style="width: 100%; height: 100%" src='data:image/png;base64,{productimage}'/> 
<strong>{productname}</strong> 
<del> 
<font color=#FF0000> 
{productoldprice} 
</font> 
</del> 
<strong>{productprice}</strong> 
<input type=hidden name=model id=model value='{model}'> 
<p>{productdescription} </p> 
</body> 
</html>
data.csv
productname , productlogo , productimage , productoldprice , productprice , model , productdescription 
page 1 , bbbbbbbbbbb1 , cccccccccccc1 , ddddddddddddddd1 , eeeeeeeeeeee1 , fffff1 , gggggggggggggggggg1 
page 2 , bbbbbbbbbbb2 , cccccccccccc2 , ddddddddddddddd2 , eeeeeeeeeeee2 , fffff2 , gggggggggggggggggg2 
page 3 , bbbbbbbbbbb3 , cccccccccccc3 , ddddddddddddddd3 , eeeeeeeeeeee3 , fffff3 , gggggggggggggggggg3
code.php
<?php

$file = 'data.csv'; //chemin vers le fichier csv
$tpl = 'html.tpl'; //chemin vers le fichier template
$row = 1; //compteur de ligne
$tabData = array(); //tableau des données CSV
$tabTitle = array(); //titre les colonnes
$numPage = (isset($_GET['p']) and $_GET['p']>0)?(int)$_GET['p']:'1'; //numéro de la page récupéré en URL ?p=3 ou 1 sinon

//ouvre le fichier
if (($handle = fopen($file, "r")) !== FALSE) {

	// on parcours le fichier csv tant qu'il n'y a plus de ligne
    while (($data = fgetcsv($handle, 1000, ",")) !== FALSE) {
        $num = count($data); //nombre de champs sur une ligne
		//récupère les champs sur une ligne
		for ($c=0; $c < $num; $c++) {
			if($row == 1){ // titre des colonnes csv
			 
				$tabData[trim($data[$c])] = array(); //on créer un tableau avec le titre de la colonne
				$tabTitle[$c] = trim($data[$c]);
			}
			else{
				
				$tabData[$tabTitle[$c]][] = trim($data[$c]); // on met les données dans le tableau
			
			}				
		}	
		$row++; // on incrémente la ligne
    }		
		
	//si $numPage > $row == impossible
	if($numPage >= ($row-1)) $numPage = 1;
		
	//récupère le fichier template
	$tplFile = file_get_contents($tpl);//récupère le fichier template
	$datas = getLine($tabData,$numPage);//récupère les champs de la ligne numPage

	//boucle sur les champs
	foreach($datas as $title=>$value){
		//remplace dans le tpl
		$tplFile = str_replace('{'.$title.'}',$value,$tplFile);
	}

	//écris les autres pages
	foreach($tabData['productname'] as $p=>$value){
	
		echo '<a href="?p='.($p+1).'">'.$value.'</a> - '; // lien pas tres catholique !! ??? :/ :)
	}
	
	echo $tplFile; //affiche le tpl
	

}
else{

	die("no file to open");
}

//function sinon
function getLine($array,$num){

	$ligne = $num-1;
	$tmp = array(); //tableau
	foreach($array as $title=>$tab){ //pour chaque titre=>valeur du tableau
	
		$tmp[$title]=$tab[$ligne]; 
	}
	return $tmp;
}



?>

Re: Comment créer pages html avec template + données csv

par monica59 » 13 juin 2014, 13:37

Je viens de tester ca me sort :

Code : Tout sélectionner

colonne : productname valeur: aaaaaaaaaaa1 colonne : productlogo valeur: bbbbbbbbbbb1 colonne : productimage valeur: cccccccccccc1 colonne : productoldprice valeur: ddddddddddddddd1 colonne : productprice valeur: eeeeeeeeeeee1 colonne : model valeur: fffff1 colonne : productdescription valeur: gggggggggggggggggg1 array(7) { ["productname "]=> string(13) "aaaaaaaaaaa2 " [" productlogo "]=> string(14) " bbbbbbbbbbb2 " [" productimage "]=> string(15) " cccccccccccc2 " [" productoldprice "]=> string(18) " ddddddddddddddd2 " [" productprice "]=> string(15) " eeeeeeeeeeee2 " [" model "]=> string(8) " fffff2 " [" productdescription "]=> string(21) " gggggggggggggggggg2 " } array(7) { ["productname "]=> string(13) "aaaaaaaaaaa3 " [" productlogo "]=> string(14) " bbbbbbbbbbb3 " [" productimage "]=> string(15) " cccccccccccc3 " [" productoldprice "]=> string(18) " ddddddddddddddd3 " [" productprice "]=> string(15) " eeeeeeeeeeee3 " [" model "]=> string(8) " fffff3 " [" productdescription "]=> string(20) " gggggggggggggggggg3" }
par example ["productname "]=> string(13) donc je dois me servir de ca pour remplacer dans mon template la partie => <p>{productdescription} </p>

<?php

$productname = ["productname"]=> string(13);
$productlogo = ["productlogo"]=> string(14);
$productimage = ["productimage"]=> string(15);
$productoldprice = ["productoldprice"]=> string(18);
$productprice = ["productprice"]=> string(15);
$model = ["model"]=> string(8);
$productdescription = ["productdescription"]=> string(21);

$fp = fopen("template.html", "a");

fputcsv($fp,array($productname ,
$productlogo ,
$productimage ,
$productoldprice ,
$productprice ,
$model ,
$productdescription,
));

fclose($fp);

?>
enfin ca je pense pas que ca remplace les champs sur ma page template :shock:

Re: Comment créer pages html avec template + données csv

par telnes » 13 juin 2014, 12:34

hello

sur la page getcsv http://www.php.net/manual/fr/function.fgetcsv.php il y a un exemple

en 1 reprendre l'exemple !!!
en 2 l'adapter

ps: le code tout fait c'est cool, ca permet de reprendre pas à pas le fonctionnement si tu as envie de comprendre, mais faire soit même ca permet d’acquérir des mécanismes.

fichier data.csv
productname , productlogo , productimage , productoldprice , productprice , model , productdescription 
aaaaaaaaaaa1 , bbbbbbbbbbb1 , cccccccccccc1 , ddddddddddddddd1 , eeeeeeeeeeee1 , fffff1 , gggggggggggggggggg1 
aaaaaaaaaaa2 , bbbbbbbbbbb2 , cccccccccccc2 , ddddddddddddddd2 , eeeeeeeeeeee2 , fffff2 , gggggggggggggggggg2 
aaaaaaaaaaa3 , bbbbbbbbbbb3 , cccccccccccc3 , ddddddddddddddd3 , eeeeeeeeeeee3 , fffff3 , gggggggggggggggggg3
fichier code.php
<?php

$file = 'data.csv'; //chemin vers le fichier
$row = 1; //compteur de ligne
$tabData = array(); //tableau des données CSV
$tabTitle = array(); //titre les colonnes

//ouvre le fichier
if (($handle = fopen($file, "r")) !== FALSE) {

	// on parcours le fichier csv tant qu'il n'y a plus de ligne
    while (($data = fgetcsv($handle, 1000, ",")) !== FALSE) {
        $num = count($data); //nombre de champs sur une ligne
		//récupère les champs sur une ligne
		for ($c=0; $c < $num; $c++) {
			if($row == 1){ // titre des colonnes csv
			 
				$tabData[$data[$c]] = array(); //on créer un tableau avec le titre de la colonne
				$tabTitle[$c] = $data[$c];
			}
			else{
				
				$tabData[$tabTitle[$c]][] = $data[$c]; // on met les données dans le tableau
			
			}				
		}	
		$row++; // on incrémente la ligne
    }		


	//var_dump($tabData);
	
	//accés à la ligne 2 par exemple
	$ligne = 2;
	foreach($tabData as $title=>$tab){ //pour chaque titre=>valeur du tableau
	
		echo 'colonne : <b>'.$title.'</b> valeur: '.$tab[$ligne-1]."<br />\n"; // ligne-1 car le tab commence en 0 
	
	}
	
	// via function
	var_dump(getLine($tabData,3));
	
	
}
else{

	die("no file to open");
}

//function sinon
function getLine($array,$num){

	$ligne = $num-1;
	$tmp = array(); //tableau
	foreach($array as $title=>$tab){ //pour chaque titre=>valeur du tableau
	
		$tmp[$title]=$tab[$ligne]; 
	}
	return $tmp;
}



?>

Re: Comment créer pages html avec template + données csv

par telnes » 13 juin 2014, 12:01

hello
Donc je cherche à utiliser le fichier csv comme source de données ainsi que la page template
pour obtenir un résultat comme ceci:

productname1.html
productname2.html
productname3.html etc.
donc tu cherche a générer (créer) des page html via php

ou

tu veux une page php unique
productname.php?id=1
productname.php?id=2
productname.php?id=3

???

ps: il y a url rewriting aussi pour mélanger les deux cas

Re: Comment créer pages html avec template + données csv

par monica59 » 12 juin 2014, 23:12

c'est pas clair du tout pour moi je suis perdue :cry: