Précédent   Forum des professionnels en informatique > PHP > Outils > Zend > Zend Framework > MVC
MVC Forum de support sur le développement d'applications de type modèle-vue-contrôleur avec Zend Framework ainsi que vos questions sur les plugins, les helpers etc. Avant de poster -> Cours MVC, FAQ ZF Controller
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 05/12/2011, 15h07   #1
Candidat au titre de Membre du Club
 
Inscription : mai 2009
Messages : 34
Détails du profil
Informations personnelles :
Localisation : France, Yvelines (Île de France)

Informations forums :
Inscription : mai 2009
Messages : 34
Points : 11
Points : 11
Par défaut Tbs ou phpodt en MVC

Bonjour à tous
voulant générer un odt avec des données, je veux utiliser la bibliothèque odtphp
en procédural pas de problème mais avec Zend c'est une autre histoire,

Voila ou j'en suis :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
public function monAction()
{
$this->_helper->layout()->disableLayout();
$this->_helper->viewRenderer->setNoRender();
$this->getResponse()->setHeader('Content-Type', 'application/vnd.oasis.opendocument.text', true);
$odf = new odf("mon_fichier_template.odt");
 
                $npv = "123456";
                $serv = "Hello";
                $odf->exportAsAttachedFile();
 
}
Je télécharge bien mon odt mais je ne retrouve rien de mon template (et encore moins mes variables de test) et surtout, le fichier possède entre 40 et 150 pages avec 1 à 10 lignes de caractères chinois par page comme ceci :
'###'#######mimetypeapplication/vnd.oasis.opendocument.textPK#########¦ë>################Configurations2/

la ou mon fichier original n'en comporte qu'une, comme si je n'avais pas le bon en tête...

En procédural, je fais un lien vers une page qui contient juste
Code :
1
2
3
4
5
$odf = new odf("mon_fichier_template.odt");
 
                $npv = "123456";
                $serv = "Hello";
                $odf->exportAsAttachedFile();
ainsi que l'include bien sur et hop, je retrouve mon template avec mes variables.

Quelqu'un a une idée de mon problème ?
manuzed78 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/12/2011, 12h12   #2
Invité de passage
 
Homme
Inscription : juin 2011
Messages : 2
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations forums :
Inscription : juin 2011
Messages : 2
Points : 2
Points : 2
Je pense que le problème vient du fait que tu envoies deux fois les en-têtes HTTP : une fois avec Zend, et une fois avec la méthode exportAsAttachedFile de l'objet odf.

Essaie d'envoyer toi même les en-têtes en précisant le nom du fichier à télécharger (en tête Content-Disposition) et d'afficher le contenu de ton objet odf en tant que chaine de caractères directement (en castant) :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
 
public function monAction()
{
    $odf = new odf("mon_fichier_template.odt");
    $npv = "123456";
    $serv = "Hello";
 
    $this->_helper->layout()->disableLayout();
    $this->_helper->viewRenderer->setNoRender();
    $this->getResponse()
        ->setHeader( 'Content-Type', 'application/vnd.oasis.opendocument.text', true );
        ->setHeader( 'Content-Disposition', 'attachment; filename="mon_fichier.odt"', true )
        ->appendBody( (string)$odf );
}
geektophe est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/12/2011, 14h19   #3
Invité de passage
 
Homme
Inscription : juin 2011
Messages : 2
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations forums :
Inscription : juin 2011
Messages : 2
Points : 2
Points : 2
J'ai épluché le fichier odf.php, et je pense avoir trouvé ta solution. Il faut sauvegarder le contenu de ton fichier ODT dans un fichier temporaire en utilisant la méthode saveToDisk sans argument, et ensuite envoyer son contenu avec Zend. On peut récupérer le nom du fichier temporaire avec la méthode getTmpfile de l'objet odf. Voilà le code :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
public function monAction()
{
    $odf = new odf("mon_fichier_template.odt");
    // Manipulations diverses
    $odf->saveToDisk();
 
    $this->_helper->layout()->disableLayout();
    $this->_helper->viewRenderer->setNoRender(true);
    $this->getResponse()
         ->setHeader( 'Content-Type', 'application/vnd.oasis.opendocument.text', true );
         ->setHeader( 'Content-Disposition', 'attachment; filename="mon_fichier.odt"', true )
         ->appendBody( file_get_contents( $odf->getTmpfile() ) );
}
EDIT: la méthode setNoRender doit prendre comme paramètre true
geektophe est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/12/2011, 15h44   #4
Candidat au titre de Membre du Club
 
Inscription : mai 2009
Messages : 34
Détails du profil
Informations personnelles :
Localisation : France, Yvelines (Île de France)

Informations forums :
Inscription : mai 2009
Messages : 34
Points : 11
Points : 11
Par défaut Solution

Réponse pour ceux qui galèrent comme moi

Le fichier odt doit commencer par les caractère "PK" (hexa="50.4B") or
mon fichier généré commence par une séquence d' octets EF.BB.BF (parfois répetés 5 fois). Cette séquence "EF.BB.BF" est en fait la marque BOM qu'on ajoute au début des fichiers pour indiquer que c'est de l'UTF-8.

Si tu ouvres le fichier résultat sous un éditeur hexa et que tu retires cette séquence, alors on peut l'ouvrir sous OpenOffice sans problème ...

SOLUTION convertir les scripts en utf8 sans BOM
(c'est possible dans notepad++) sauf qu'il faut aussi le faire pour la bibrairie Zend ...

BONUS pour les linuxiens :

find /chemin/vers/sources -type f -exec sed -i -e '1 s/\xEF\xBB\xBF//' {} \; -print

la commande qui va tout faire tout seul ... et en moins de 1 minute !



Un grand merci à Geektof
manuzed78 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 15h31.


 
 
 
 
Partenaires

Hébergement Web