Précédent   Forum des professionnels en informatique > PHP > Langage > Fichiers
Fichiers Forum d'entraide sur les fichiers avec PHP. Avant de poster -> FAQ fichiers et Sources fichiers
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 01/08/2011, 10h17   #1
Invité de passage
 
Homme Bryan
Étudiant
Inscription : juillet 2011
Messages : 15
Détails du profil
Informations personnelles :
Nom : Homme Bryan
Localisation : France, Loire Atlantique (Pays de la Loire)

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : juillet 2011
Messages : 15
Points : 3
Points : 3
Par défaut Créer un fichier qui contient le code source généré

Salut les dév' o/

Ma recherche n'ayant rien donné de pertinent, je me permet de poster mon propre topic.

Voilà mon soucis, j'ai créé un formulaire assez long (très long même). Ce formulaire affiche à sa fin un rapport qui rassemble une grande partie des réponses de l'utilisateur ainsi que des calculs effectués avec celles-ci.

C'est là que mes problèmes commencent, je cherche à récupérer le code source généré par le fichier "report.php" afin de le stocker dans un fichier .html qui sera dans un dossier "reports" (qu'on créé s'il n'existe pas).
Chaque rapport devra avoir son propre fichier afin de pouvoir le consulter en dehors de l'application web.

N'ayant absolument jamais touché à la création/lecture/écriture de fichiers, je dois avoué que je suis un peu (complètement?) pommé...

Dans le manuel PHP j'ai trouvé la fonction "fflush()" qui pourrait éventuellement m’intéresser mais je ne vois pas comment l'utiliser.

Je vous remercie par avance pour votre aide.

Cordialement,
Sayko.
Sayko est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/08/2011, 10h34   #2
Rédacteur
 
Avatar de jreaux62
 
Homme Jérôme Réaux
Webdesigner
Inscription : août 2008
Messages : 2 993
Détails du profil
Informations personnelles :
Nom : Homme Jérôme Réaux
Âge : 45
Localisation : France, Pas de Calais (Nord Pas de Calais)

Informations professionnelles :
Activité : Webdesigner
Secteur : Arts - Culture

Informations forums :
Inscription : août 2008
Messages : 2 993
Points : 5 786
Points : 5 786
Envoyer un message via Skype™ à jreaux62
Bonjour,
as-tu regardé sur cette page ? et notamment :
- file_get_contents — Lit tout un fichier dans une chaîne
- file_put_contents — Écrit un contenu dans un fichier
- mkdir — Crée un dossier
- ...
__________________
"Ce qui se conçoit bien s'énonce clairement - Et les mots pour le dire arrivent aisément."
Nicolas Boileau-Despréaux, Homme de lettres français (1636-1711), principal théoricien de l'esthétique classique.
Site perso Mes tutos DVP : Gestion-Affichage de Nouvelles - Affichage en tableau HTML - Fonctions de redimensionnement d'images
jreaux62 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/08/2011, 10h54   #3
Invité de passage
 
Homme Bryan
Étudiant
Inscription : juillet 2011
Messages : 15
Détails du profil
Informations personnelles :
Nom : Homme Bryan
Localisation : France, Loire Atlantique (Pays de la Loire)

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : juillet 2011
Messages : 15
Points : 3
Points : 3
Bonjour jréaux62,

Tout d'abord merci pour ta réponse rapide.

J'avais effectivement regardé le file_get_contents, mais j'avoue ne pas avoir prêté attention aux deux autres (je ne m'étais pas encore penché sur la création de mon dossier (vis-à-vis du mkdir))

Mais le file_get_contents me permettra-t-il de récupérer le code généré pour le client, et non pas celui que j'ai rédigé en php?

EDIT:

J'ai testé ceci, mais ça ne semble pas fonctionner:

Code :
1
2
3
4
if (!file_exists("/reports"))
{
mkdir("/reports");
}

EDIT2:

Corrigé!

Code :
1
2
3
4
if (!file_exists("./reports/"))
{
mkdir("./reports/");
}
Sayko est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/08/2011, 12h00   #4
Rédacteur
 
Avatar de jreaux62
 
Homme Jérôme Réaux
Webdesigner
Inscription : août 2008
Messages : 2 993
Détails du profil
Informations personnelles :
Nom : Homme Jérôme Réaux
Âge : 45
Localisation : France, Pas de Calais (Nord Pas de Calais)

Informations professionnelles :
Activité : Webdesigner
Secteur : Arts - Culture

Informations forums :
Inscription : août 2008
Messages : 2 993
Points : 5 786
Points : 5 786
Envoyer un message via Skype™ à jreaux62
Oups !
- file_get_contents() reprend en effet tout le code (le contenu du fichier, code php, ...).

Une solution, pour avoir le CODE SOURCE, est la temporisation de sortie avec ob_start()

Une petite page "test" pour s'en convaincre :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<h4>contenu du fichier</h4>
<?php // contenu du fichier
$contenu_page = file_get_contents ('./test1.php'); ?>
 
<textarea cols="100" rows="10"><?php print_r($contenu_page); ?></textarea>
 
<h4>CODE GENERE</h4>
<?php // CODE GENERE
	ob_start();
	include('./test1.php');
	$code_genere = ob_get_contents();
	ob_end_clean(); 
?>
 
<textarea cols="100" rows="10"><?php print_r($code_genere); ?></textarea>
avec test1.php :
Code :
1
2
3
4
5
6
7
8
9
10
11
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" dir="ltr">
<?php $titre = 'Essai'; ?>
<head>
	<title> test </title>
</head>
<body>
<h4><?php echo $titre; ?></h4>
<?php echo 'I\'m the King of the World !'; ?>
</body>
</html>
C'est donc bien la 2ème solution qu'il faut prendre.
Ensuite, il suffit de copier $code_genere dans un fichier.
__________________
"Ce qui se conçoit bien s'énonce clairement - Et les mots pour le dire arrivent aisément."
Nicolas Boileau-Despréaux, Homme de lettres français (1636-1711), principal théoricien de l'esthétique classique.
Site perso Mes tutos DVP : Gestion-Affichage de Nouvelles - Affichage en tableau HTML - Fonctions de redimensionnement d'images
jreaux62 est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 01/08/2011, 12h06   #5
Modérateur
 
Avatar de Benjamin Delespierre
 
Benjamin Delespierre
Développeur Web
Inscription : février 2010
Messages : 2 984
Détails du profil
Informations personnelles :
Nom : Benjamin Delespierre
Âge : 24
Localisation : France

Informations professionnelles :
Activité : Développeur Web
Secteur : High Tech - Opérateur de télécommunications

Informations forums :
Inscription : février 2010
Messages : 2 984
Points : 5 011
Points : 5 011
Commence par faire générer le rapport normalement. Une fois que c'est fait, tu place ob_start et ob_end_clean en début et fin de génération HTML, tu réccupère ainsi le buffer de sortie. Ce buffer, tu vas en faire deux choses: le stocker dans un fichier .html et l'afficher.

Voici à quoi ça peut ressembler:
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
 
<?php 
define('REPORT_DIR', dirname(__FILE__) . '/reports');
if (!file_exists(REPORT_DIR))
  mkdir(REPORT_DIR;
 
// commencer la bufferisation
ob_start();
?>
 
Générer le code HTML ici ...
 
<?php
$content = ob_get_contents(); // réccupérer le buffer
$filename = "report_" . time() . ".html";
if (file_put_contents(REPORT_DIR . '/' . $filename, $content))
  echo "-- ERREUR LORS DE L'ECRITURE DU RAPPORT--";
 
// fin de la bufferisation, on affiche la page
ob_end_flush();
-- Edit

visiblement jreaux m'a devancé
__________________
A la recherche d'un framework MVC facile a prendre en main ? Essayez Axiom
Nouveau: la référence d'Axiom est disponible sur GitHub (je la peaufine en ce moment même).

Un problème correctement identifié est à moitié résolu, évitez de poster l'intégralité de votre code avec pour seule explication "ça ne marche pas...".
Pour identifier correctement vos problèmes PHP, utilisez la gestion des erreurs et xdebug.

Les boutons et existent, servez-vous en
Benjamin Delespierre est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 01/08/2011, 12h10   #6
Rédacteur
 
Avatar de jreaux62
 
Homme Jérôme Réaux
Webdesigner
Inscription : août 2008
Messages : 2 993
Détails du profil
Informations personnelles :
Nom : Homme Jérôme Réaux
Âge : 45
Localisation : France, Pas de Calais (Nord Pas de Calais)

Informations professionnelles :
Activité : Webdesigner
Secteur : Arts - Culture

Informations forums :
Inscription : août 2008
Messages : 2 993
Points : 5 786
Points : 5 786
Envoyer un message via Skype™ à jreaux62
Citation:
Envoyé par Benjamin Delespierre Voir le message
visiblement jreaux m'a devancé
Merci à toi de confirmer que mon code est juste !
Je n'étais pas du tout sûr de moi, vu que je ne l'avais jamais fait ! ... en fait, si, mais il y a très longtemps ...)
(Une grosse louche de curiosité, une pincée de recherche dans le manuel php, et une cuillerée de tests : voilà, c'est prêt !)
__________________
"Ce qui se conçoit bien s'énonce clairement - Et les mots pour le dire arrivent aisément."
Nicolas Boileau-Despréaux, Homme de lettres français (1636-1711), principal théoricien de l'esthétique classique.
Site perso Mes tutos DVP : Gestion-Affichage de Nouvelles - Affichage en tableau HTML - Fonctions de redimensionnement d'images
jreaux62 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/08/2011, 12h35   #7
Invité de passage
 
Homme Bryan
Étudiant
Inscription : juillet 2011
Messages : 15
Détails du profil
Informations personnelles :
Nom : Homme Bryan
Localisation : France, Loire Atlantique (Pays de la Loire)

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : juillet 2011
Messages : 15
Points : 3
Points : 3
Merci

A présent tout fonctionne parfaitement, au chargement de la page, j'enregistre le fichier html qui contient le code source généré dans un dossier "reports" que je crée s'il n'existe pas.

Récapitulatif au cas où cela pourrait aider quelqu'un d'autre:

Aux premières lignes du fichier php (ou juste avant le premier echo / première balise html):

Code :
1
2
3
<?php 
ob_start();
?>
Tout à la fin du fichier (ou juste après le dernier echo / dernière balise html):

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<?php
//Si le dossier "reports n'existe pas, on le crée à la racine du projet
if (!file_exists("./reports/"))
{
	mkdir("./reports/");
}
 
//On fixe le chemin et le format de nom des fichiers	
$filename = './reports/'.$codification.'_'.$date.'.htm';
 
//On récupère le code source généré par le fichier
$filecontent = ob_get_contents();
 
//On crée le fichier avec le nom désiré et on y insère le code source
file_put_contents($filename, $filecontent);
?>
Voila

Merci beaucoup à vous deux !

Je passe le topic en résolu.
Sayko est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/08/2011, 12h42   #8
Rédacteur
 
Avatar de jreaux62
 
Homme Jérôme Réaux
Webdesigner
Inscription : août 2008
Messages : 2 993
Détails du profil
Informations personnelles :
Nom : Homme Jérôme Réaux
Âge : 45
Localisation : France, Pas de Calais (Nord Pas de Calais)

Informations professionnelles :
Activité : Webdesigner
Secteur : Arts - Culture

Informations forums :
Inscription : août 2008
Messages : 2 993
Points : 5 786
Points : 5 786
Envoyer un message via Skype™ à jreaux62
A la fin, pense à "tirer la chasse" !
-> ob_end_clean ()
__________________
"Ce qui se conçoit bien s'énonce clairement - Et les mots pour le dire arrivent aisément."
Nicolas Boileau-Despréaux, Homme de lettres français (1636-1711), principal théoricien de l'esthétique classique.
Site perso Mes tutos DVP : Gestion-Affichage de Nouvelles - Affichage en tableau HTML - Fonctions de redimensionnement d'images
jreaux62 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/08/2011, 12h52   #9
Modérateur
 
Avatar de Benjamin Delespierre
 
Benjamin Delespierre
Développeur Web
Inscription : février 2010
Messages : 2 984
Détails du profil
Informations personnelles :
Nom : Benjamin Delespierre
Âge : 24
Localisation : France

Informations professionnelles :
Activité : Développeur Web
Secteur : High Tech - Opérateur de télécommunications

Informations forums :
Inscription : février 2010
Messages : 2 984
Points : 5 011
Points : 5 011
Citation:
Envoyé par jreaux62 Voir le message
A la fin, pense à "tirer la chasse" !
-> ob_end_clean ()
Logiquement ce sera fait implicitement. Utilise ob_end_clean si tu souhaite terminer la bufferisation et vider l'output ou ob_end_flush si tu souhaite terminer la bufferisation et envoyer le buffer au navigateur. (tirer la chasse en anglais se dit "flush" et c'est l'opposé de clean , ici on ne veut surtout pas flusher mais cleaner le buffer).

Par mesure de sécurité supplémentaire, je te recommande de mettre toute la bufferisation dans un bloc try afin de pouvoir fait ob_end_* en cas d'exception (on est jamais à l'abri).

Je l'ai fait comme ça pour Axiom:
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
 
        try {
            ob_start();
 
            extract(self::$_layout_vars);
            extract(self::$_response->getResponseVars());
            foreach (self::$_response->getMessages() as $level => $message) {
                ${$level} = $message;
            }
            include $__filename;
 
            ${self::$_config['layout_content_var']} = ob_get_contents();
            ob_end_clean();
        }
        catch (Exception $e) {
            ob_end_clean();
 
            Router::load('ErrorController', 'http500');
            return;
        }
 
        include dirname(dirname(__FILE__)) . "/application/view/layouts/" . self::$_config['layout_file'] . ".{$format}.php";
__________________
A la recherche d'un framework MVC facile a prendre en main ? Essayez Axiom
Nouveau: la référence d'Axiom est disponible sur GitHub (je la peaufine en ce moment même).

Un problème correctement identifié est à moitié résolu, évitez de poster l'intégralité de votre code avec pour seule explication "ça ne marche pas...".
Pour identifier correctement vos problèmes PHP, utilisez la gestion des erreurs et xdebug.

Les boutons et existent, servez-vous en
Benjamin Delespierre est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/08/2011, 13h31   #10
Rédacteur
 
Avatar de jreaux62
 
Homme Jérôme Réaux
Webdesigner
Inscription : août 2008
Messages : 2 993
Détails du profil
Informations personnelles :
Nom : Homme Jérôme Réaux
Âge : 45
Localisation : France, Pas de Calais (Nord Pas de Calais)

Informations professionnelles :
Activité : Webdesigner
Secteur : Arts - Culture

Informations forums :
Inscription : août 2008
Messages : 2 993
Points : 5 786
Points : 5 786
Envoyer un message via Skype™ à jreaux62
Citation:
Envoyé par Benjamin Delespierre Voir le message
(tirer la chasse en anglais se dit "flush" et c'est l'opposé de clean , ici on ne veut surtout pas flusher mais cleaner le buffer).
Tu as raison. J'aurais dû dire :
"N'oublie pas de nettoyer la cuvette !"
__________________
"Ce qui se conçoit bien s'énonce clairement - Et les mots pour le dire arrivent aisément."
Nicolas Boileau-Despréaux, Homme de lettres français (1636-1711), principal théoricien de l'esthétique classique.
Site perso Mes tutos DVP : Gestion-Affichage de Nouvelles - Affichage en tableau HTML - Fonctions de redimensionnement d'images
jreaux62 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/08/2011, 15h34   #11
Invité de passage
 
Homme Bryan
Étudiant
Inscription : juillet 2011
Messages : 15
Détails du profil
Informations personnelles :
Nom : Homme Bryan
Localisation : France, Loire Atlantique (Pays de la Loire)

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : juillet 2011
Messages : 15
Points : 3
Points : 3
Hop, c'est corrigé, merci
Sayko est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 13h43.


 
 
 
 
Partenaires

Hébergement Web