cs_harmonyk
Messages postés37Date d'inscriptionsamedi 16 septembre 2006StatutMembreDernière intervention 5 juillet 2012
-
28 janv. 2010 à 13:07
cs_harmonyk
Messages postés37Date d'inscriptionsamedi 16 septembre 2006StatutMembreDernière intervention 5 juillet 2012
-
29 janv. 2010 à 11:29
Bonjour !
Je sèche complètement devant un script permettant de modifier le contenu d'un fichier texte.
J'explique :
J'affiche une page de présentation d'un produit (titre, images, liens et surtout la description).
Jusqu'ici tout fonctionne à merveille (merci neoxen ;)), j'ai un .txt annexe dans lequel j'ai écrit sous la forme :
Nom_article_1|....Description_1
Nom_article_2|....Description_2
etc...
et je me sers donc du nom de l'article pour aller chercher la description avec ce code :
Pour améliorer ce script, j'ai décidé d'y apporter un éditeur en ligne, permettant donc de modifier la description voulue.
Je récupère donc la description de la même manière que plus haut et l'affiche dans le textarea d'un formulaire, après parsage bien entendu , le texte s'affiche correctement.
Vachement content de moi, je poursuis avec la partie sauvegarde de la description modifiée, le script écrit bien la ligne comme je le veux, mais malheureusement me supprime toutes les autres lignes du .txt !!
voilà donc le problème qui m'amène vers des gens plus expérimentés que moi, comment faire pour ne modifier qu'une seule ligne de mon fichier.txt, en conservant toutes les autres intactes ?
ci-dessous le (pseudo) code sur lequel je me casse les dents : (commenté et raccourci pour l'occas')
<?php
//////////////////////////////////////////////////////////////////////////////////////////////////////////
// Configuration
$cfg['page_name'] = "admin.php";
$cfg['file_to_edit'] = "contenu/descriptions.txt";
// Code de lecture ecriture (ne fonctionne pas)
if ( isset($_POST['texte']) ) // Si le formulaire à été envoyé
{
$description = fopen($cfg['file_to_edit'],"r"); // Ouverture du .txt en lecture
$contenu=fgets($description); // Récupération du contenu
$explode=explode('|....',$contenu); // Tableau avec séparateur
$array[$explode[0]]=$explode[1];
$data1=$explode[0]; // Récupération du titre
fclose($description); // Fermeture du .txt
$data2 = '|....' . $_POST['texte']; // Ajout du séparateur
$donnees = $data1 . $data2; // + la description éditée
$avant_str = array("", "", " ", " ", "\'", "<retour>"); // Préparation
$apres_str = array(" ", " ", "", "", "'", "
"); // de la regex
$resultat = str_replace($avant_str, $apres_str, $donnees); // Execution
$description = fopen($cfg['file_to_edit'],"w"); // Ouverture du .txt en écriture
fwrite($description, $resultat . $reste); // Ecriture
fclose($description); // Fermeture du .txt
///////////////////////////////////////////////////////////////////////////////////////////////////////////
}
else // Sinon édition
{
?>
<form action="<?php echo $cfg['page_name']; ?>" method="post">
<textarea name="texte" onkeyup="preview(this, 'previewDiv');" onselect="preview(this, 'previewDiv');" id="textarea" cols="60" rows="10">
<?php
///////////////////////////////////////////////////////////////////////////////////////////////
// Code qui affiche la description voulue dans le textarea (fonctionne)
$description = fopen($cfg['file_to_edit'],"r");
while (!feof($description))
{
$contenu=fgets($description);
$explode=explode('|....',$contenu);
$array[$explode[0]]=$explode[1];
$avant_str = array(" ", " ", "", "", "\'", "&");
$apres_str = array("", "", " ", " ", "'", "et");
$resultat = str_replace($avant_str, $apres_str, ($array[$titre]));
}
echo $resultat;
fclose($description);
///////////////////////////////////////////////////////////////////////////////////////////////
?>
</textarea>
</form>
<?php
}
?>
Je précise que oui via mysql ce serait plus simple, mais je m'entraine à manipuler les fichers...Merci d'avance!
cs_harmonyk
Messages postés37Date d'inscriptionsamedi 16 septembre 2006StatutMembreDernière intervention 5 juillet 2012 28 janv. 2010 à 13:14
oups, j'ai oublié de préciser que dans cette tentative, j'essaie d'ajouter avec le fwrite une valeur $reste qui correspondrait au reste du .txt, en vain...
PS: Ou est le bouton "editer message" ??
syndrael
Messages postés2378Date d'inscriptionlundi 4 février 2002StatutMembreDernière intervention29 décembre 201220 28 janv. 2010 à 14:31
Pourquoi tu ne prends pas le contenu du fichier et fais un remplacement de la chaine Nom_article_1|....Description_1 par Nom_article_1|....Nouvelle_Description_1
Une petite expression régulière et voila !!
Et enfin tu sauvegarde le tout..
Mais es-tu obligé de passer par un fichier plat et en plus txt ?? Tu peux toujours passer par un XML avec DOM, c'est assez puissant come solution.
S.
cs_harmonyk
Messages postés37Date d'inscriptionsamedi 16 septembre 2006StatutMembreDernière intervention 5 juillet 2012 28 janv. 2010 à 22:39
Bonsoir syndrael,
merci de ta réponse rapide qui m'a permis d'avoir eu le temps de tester tes conseils.
J'ai donc retouché un peu au code pour y ajouter un petit str_replace ...
tout fonctionne à part le fait que la ligne modifiée vient s'ajouter au début du fichier .txt et ne remplace donc pas la description voulue.
Je suis sûr d'avoir foireauté quelque part
$data2 = '|....' . $_POST['texte']; // Ajout du séparateur
$donnees = $titre . $data2; // + la description éditée
$avant_str = array("", "", " ", " ", "\'", "<retour>"); // Préparation
$apres_str = array(" ", " ", "", "", "'", "
"); // de la 1°regex
$resultat = str_replace($avant_str, $apres_str, $donnees); // Execution
$array[$titre]=$resultat;
$file = file_get_contents($cfg['file_to_edit']);
$avant_str2 = array($file); // Préparation
$apres_str2 = array($resultat); // de la 2°regex
$final = str_replace($avant_str2, $apres_str2, $file); // Execution
// $final .= $file; // ne fonctionne pas car AJOUTE la ligne au début du .txt
if ($description = fopen($cfg['file_to_edit'],"w")) // Ouverture du .txt en écriture
{
fwrite($description, $final); // Ecriture
}
?>
cs_harmonyk
Messages postés37Date d'inscriptionsamedi 16 septembre 2006StatutMembreDernière intervention 5 juillet 2012 29 janv. 2010 à 11:29
Bonjour !
Bon j'ai planché pas mal cette nuit et j'en suis arrivé à un résultat presque concluant...
la description modifiée s'écrit parfaitement dans le .txt, le reste aussi, sauf la ligne d'après celle qui est modifiée.
Le script y ajoute 6 tabulations, je ne comprend pas pourquoi ??
// Code de lecture ecriture (ne fonctionne pas)
if ( isset($_POST['texte']) ) // Si le formulaire à été envoyé
{
$description = fopen($cfg['file_to_edit'],"r"); // Ouverture du .txt en lecture
while (!feof($description))
{
$contenu=fgets($description); // Récupération du contenu
$explode=explode('|....',$contenu); // Tableau avec séparateur
$array[$explode[0]]=$explode[1];
}
fclose($description); // Fermeture du .txt
$avant_str = array("", "", " ", " ", "\'", "<retour>"); // Préparation
$apres_str = array(" ", " ", "", "", "'", "
"); // de la 1°regex
$resultat = str_replace($avant_str, $apres_str, $_POST['texte']); // Execution
$file = file_get_contents($cfg['file_to_edit'], true);
$aData=explode('|....',$file);
$nbr_data=count($aData);
foreach($aData as $key=>$value)
{
if($key%2==0)
{
$array[$key]=$value;
$array[$key+1]=$aData[$key+1];
}
}
$avant_str2 = array($array[$titre]); // Préparation
$apres_str2 = array($resultat); // de la 2°regex
$final = str_replace($avant_str2, $apres_str2, $file); // Execution
if ($description = fopen($cfg['file_to_edit'],"w")) // Ouverture du .txt en écriture { fwrite($description, $final); // Ecriture
}
else
exit('Impossible d\'ouvrir le fichier');
fclose($description); // Fermeture du .txt
///////////////////////////////////////////////////////////////////////////////////////////////////////////
}