[résolu] Changement de "header PHP" dans une action

Note de ce sujet :
  • Moyenne : 0 (0 vote(s))
  • 1
  • 2
  • 3
  • 4
  • 5
#1
Citation :#~~~~~ DEBUT BLOC A NE PAS SUPPRIMER ~~~~~
#~ Version du CMS: !1.9.4.1
#~ Url du site :
#~ Hébergeur / Soft : Ubuntu
#~ Informations Système :
#~~~~~ FIN BLOC A NE PAS SUPPRIMER ~~~~~



Bonjour,

Je suis confronté à un petit soucis.

J'ai porté un composant (zfdatagrid) dans CMSMS.
Celui-ci permet de lister des occurrences de la base de données et propose également des liens d'export (CSV, PDF, ...).

Afin d'afficher le listing dans une page, j'utilise un tag du type {MonModule action='afficherDatagrid'}, cela fonctionne parfaitement, et lorsque je clique sur un lien d'export (par exemple CSV), la page se recharge donc et le composant détecte dans l'URL que les données doivent être proposé au téléchargement.

Il opère donc les instructions suivantes :
Code :
header('Content-Description: File Transfer');
            header('Cache-Control: public, must-revalidate, max-age=0'); // HTTP/1.1
            header('Pragma: public');
            header('Expires: Sat, 26 Jul 1997 05:00:00 GMT'); // Date in the past
            header('Last-Modified: ' . gmdate('D, d M Y H:i:s') . ' GMT');
            header("Content-Type: application/csv");
            header('Content-Disposition: attachment; filename="' . $this->getFileName() . '"');
            header('Content-Transfer-Encoding: binary');

Le souci ici est que je récupère bien toutes les données au format CSV mais qu'elles sont précédées du template de la page, c'est à dire de tout le début du gabarit de la page jusqu'à ce que les méthodes header() soient appelées.
Mon fichier CSV comprend donc
Code :
- le header de la page
- la navigation
- l'ouverture de la balise de contenu
- les données au format CSV
(les méthodes header() arrêtant le chargement du reste de la page après cela).


Il y a-t-il donc un moyen de désactiver le chargement du gabarit pour que mes fichiers ne contiennent que les données à exporter ?
(j'ai l'impression que CMSMS fait des "echo" de chaque élement du gabarit jusqu'à ce que mes méthodes header() soit appelées, j'aimerais éviter ce comportement justement)
#1
Citation :#~~~~~ DEBUT BLOC A NE PAS SUPPRIMER ~~~~~
#~ Version du CMS: !1.9.4.1
#~ Url du site :
#~ Hébergeur / Soft : Ubuntu
#~ Informations Système :
#~~~~~ FIN BLOC A NE PAS SUPPRIMER ~~~~~



Bonjour,

Je suis confronté à un petit soucis.

J'ai porté un composant (zfdatagrid) dans CMSMS.
Celui-ci permet de lister des occurrences de la base de données et propose également des liens d'export (CSV, PDF, ...).

Afin d'afficher le listing dans une page, j'utilise un tag du type {MonModule action='afficherDatagrid'}, cela fonctionne parfaitement, et lorsque je clique sur un lien d'export (par exemple CSV), la page se recharge donc et le composant détecte dans l'URL que les données doivent être proposé au téléchargement.

Il opère donc les instructions suivantes :
Code :
header('Content-Description: File Transfer');
            header('Cache-Control: public, must-revalidate, max-age=0'); // HTTP/1.1
            header('Pragma: public');
            header('Expires: Sat, 26 Jul 1997 05:00:00 GMT'); // Date in the past
            header('Last-Modified: ' . gmdate('D, d M Y H:i:s') . ' GMT');
            header("Content-Type: application/csv");
            header('Content-Disposition: attachment; filename="' . $this->getFileName() . '"');
            header('Content-Transfer-Encoding: binary');

Le souci ici est que je récupère bien toutes les données au format CSV mais qu'elles sont précédées du template de la page, c'est à dire de tout le début du gabarit de la page jusqu'à ce que les méthodes header() soient appelées.
Mon fichier CSV comprend donc
Code :
- le header de la page
- la navigation
- l'ouverture de la balise de contenu
- les données au format CSV
(les méthodes header() arrêtant le chargement du reste de la page après cela).


Il y a-t-il donc un moyen de désactiver le chargement du gabarit pour que mes fichiers ne contiennent que les données à exporter ?
(j'ai l'impression que CMSMS fait des "echo" de chaque élement du gabarit jusqu'à ce que mes méthodes header() soit appelées, j'aimerais éviter ce comportement justement)
#2
négatif, il ne fait pas d'echo.

et remplacer le rechargement de la page courante par un lien vers une page au gabarit minimaliste (notamment sans toute la partie html non souhaitée) qui fasse directement l'export en csv ?
#2
négatif, il ne fait pas d'echo.

et remplacer le rechargement de la page courante par un lien vers une page au gabarit minimaliste (notamment sans toute la partie html non souhaitée) qui fasse directement l'export en csv ?
#3
Merci pour ce retour bess.

S'il ne fait pas d'echo, peux-tu expliciter (même en 1 ligne) comment fonctionne-t-il stp? (le fait que le changement d'header embarque du contenu existant me laisse penser que la réponse HTTP est déjà partiellement remplie).


Je voulais éviter justement un changement de page, afin qu'une fois le fichier proposé au téléchargement la personne soit toujours sur la page où est affiché le datagrid.
Du coup l'idée serait
- de créer un gabarit vide et d'y appeler la même action qu'actuellement
- tester l'alias de la page courante pour savoir si une redirection doit être opérée après téléchargement du fichier pour revenir à la précédente si on est dans le cas d'un export.

Je vais voir cela. Merci.
#3
Merci pour ce retour bess.

S'il ne fait pas d'echo, peux-tu expliciter (même en 1 ligne) comment fonctionne-t-il stp? (le fait que le changement d'header embarque du contenu existant me laisse penser que la réponse HTTP est déjà partiellement remplie).


Je voulais éviter justement un changement de page, afin qu'une fois le fichier proposé au téléchargement la personne soit toujours sur la page où est affiché le datagrid.
Du coup l'idée serait
- de créer un gabarit vide et d'y appeler la même action qu'actuellement
- tester l'alias de la page courante pour savoir si une redirection doit être opérée après téléchargement du fichier pour revenir à la précédente si on est dans le cas d'un export.

Je vais voir cela. Merci.
#4
Citation :Je voulais éviter justement un changement de page, afin qu'une fois le fichier proposé au téléchargement la personne soit toujours sur la page où est affiché le datagrid.

smarty -> template -> cache de template -> tour de magie -> hop ca fait des chocapic.

bon tu l'auras compris, ma connaissance de la machine s'arrête au cache Big Grin mais non, dans le code source on est pas sensé faire des echo à tous va, ne serait ce pour des question de performances.


Citation :Je voulais éviter justement un changement de page, afin qu'une fois le fichier proposé au téléchargement la personne soit toujours sur la page où est affiché le datagrid.

target='_blank' ?
#4
Citation :Je voulais éviter justement un changement de page, afin qu'une fois le fichier proposé au téléchargement la personne soit toujours sur la page où est affiché le datagrid.

smarty -> template -> cache de template -> tour de magie -> hop ca fait des chocapic.

bon tu l'auras compris, ma connaissance de la machine s'arrête au cache Big Grin mais non, dans le code source on est pas sensé faire des echo à tous va, ne serait ce pour des question de performances.


Citation :Je voulais éviter justement un changement de page, afin qu'une fois le fichier proposé au téléchargement la personne soit toujours sur la page où est affiché le datagrid.

target='_blank' ?
#5
En fait le problème avec cette solution est que la majorité des cas où j'ai besoin de cela se situe dans l'admin, et je ne vois pas comment choisir le gabarit d'une page particulière..
#5
En fait le problème avec cette solution est que la majorité des cas où j'ai besoin de cela se situe dans l'admin, et je ne vois pas comment choisir le gabarit d'une page particulière..
#6
ha ouais effectivement... Sad

de puis je ne suis pas certain de ma réponse pour les echo non plus..

tu fais ton propre module ?
#6
ha ouais effectivement... Sad

de puis je ne suis pas certain de ma réponse pour les echo non plus..

tu fais ton propre module ?
#7
Oui je suis dans des modules créés de A à Z.
J'ai donc la main sur les "actions.*.php".

Jusque là tout se passait bien mais là je bloque un peu. Je ne sais pas s'il faut que je crée un "hack" pour retenir la sortie jusqu'à la fin des traitements de CMSMS et ainsi pouvoir changer de header() en cours de route sans avoir les gabarits déjà envoyés, ou bien s'il existe une solution existantes (ce qui évite de modifier le coeur de l'application juste pour cela).

Je vais continuer de chercher..
#7
Oui je suis dans des modules créés de A à Z.
J'ai donc la main sur les "actions.*.php".

Jusque là tout se passait bien mais là je bloque un peu. Je ne sais pas s'il faut que je crée un "hack" pour retenir la sortie jusqu'à la fin des traitements de CMSMS et ainsi pouvoir changer de header() en cours de route sans avoir les gabarits déjà envoyés, ou bien s'il existe une solution existantes (ce qui évite de modifier le coeur de l'application juste pour cela).

Je vais continuer de chercher..
#8
Hello,

J'ai été confronté à ce genre de problème lors de la création d'un module avec téléchargement de PDFs.

Voici une piste - si tu utilises la méthode "CreateFrontEndLink", il faut passer dans tes paramètres les valeurs :
Code :
'showtemplate'=>'false', 'disable_theme'=>'true'

Ce qui donne par exemple :
Code :
$MonLienTelechargement = $this->CreateFrontEndLink($id, $returnid, 'telechargement', '', array('showtemplate'=>'false', 'disable_theme'=>'true'));

Et voici la signature de la fonction CreateFrontEndLink de la classe CMSModule :
Code :
function CreateFrontendLink( $id, $returnid, $action, $contents='', $params=array(), $warn_message='',
                     $onlyhref=false, $inline=true, $addtext='', $targetcontentonly=false, $prettyurl='' )

J'espère que tu pourras régler ton problème Wink
#8
Hello,

J'ai été confronté à ce genre de problème lors de la création d'un module avec téléchargement de PDFs.

Voici une piste - si tu utilises la méthode "CreateFrontEndLink", il faut passer dans tes paramètres les valeurs :
Code :
'showtemplate'=>'false', 'disable_theme'=>'true'

Ce qui donne par exemple :
Code :
$MonLienTelechargement = $this->CreateFrontEndLink($id, $returnid, 'telechargement', '', array('showtemplate'=>'false', 'disable_theme'=>'true'));

Et voici la signature de la fonction CreateFrontEndLink de la classe CMSModule :
Code :
function CreateFrontendLink( $id, $returnid, $action, $contents='', $params=array(), $warn_message='',
                     $onlyhref=false, $inline=true, $addtext='', $targetcontentonly=false, $prettyurl='' )

J'espère que tu pourras régler ton problème Wink
#9
Merci airelibre Smile
Fallait le trouver celui-là pardi, bien joué !

On va finir par trouver une solution.
Malheureusement côté BackEnd ça ne fonctionne et c'est surtout là que j'en ai besoin. Je continue Smile
#9
Merci airelibre Smile
Fallait le trouver celui-là pardi, bien joué !

On va finir par trouver une solution.
Malheureusement côté BackEnd ça ne fonctionne et c'est surtout là que j'en ai besoin. Je continue Smile
#10
Petite question, si certaines personnes ont déjà travaillés sur des modules en AJAX en récupérant des données coté serveur, j'imagine que le template du BackEnd n'était pas embarqué.

Peut-être quelqu'un aurait une idée dans ce contexte ?
#10
Petite question, si certaines personnes ont déjà travaillés sur des modules en AJAX en récupérant des données coté serveur, j'imagine que le template du BackEnd n'était pas embarqué.

Peut-être quelqu'un aurait une idée dans ce contexte ?
#11
Bonjour,

Une solution est de vider le tampon avant de générer les nouvelles données, via :
Code :
ob_end_clean();

Par exemple
Code :
ob_end_clean();
ob_start();
// stuff here
ob_end_flush();
#11
Bonjour,

Une solution est de vider le tampon avant de générer les nouvelles données, via :
Code :
ob_end_clean();

Par exemple
Code :
ob_end_clean();
ob_start();
// stuff here
ob_end_flush();
#12
merci pour ton retour eureka Smile
#12
merci pour ton retour eureka Smile


Atteindre :


Utilisateur(s) parcourant ce sujet : 1 visiteur(s)