Précédent   Forum des professionnels en informatique > PHP > Outils > Zend > Zend Framework
Zend Framework Forum d'entraide sur la programmation PHP avec Zend Framework. Avant de poster -> FAQ ZF, Cours ZF
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 16/09/2007, 21h11   #1
Membre Expert
 
Avatar de Janitrix
 
Inscription : octobre 2005
Messages : 3 398
Détails du profil
Informations forums :
Inscription : octobre 2005
Messages : 3 398
Points : 2 331
Points : 2 331
Par défaut Vue personnalisée et encodage UTF-8

Bonjour,

J'ai une vue personnalisé qui implémente l'interface Zend_View_Interface, qui me permet d'utiliser Smarty comme moteur de template. J'utilise également une base de données avec l'encodage UTF-8 bin. Dans ma page, j'ai bien une balise meta avec l'encodage utf-8. Cependant, j'ai tout de même des "?" qui apparaisse pour les caractères spéciaux. J'ai trouvé une réponse dans la FAQ, qui dit d'appeler la fonction :
Code :
$this->view->setEscape('utf8_encode');
dans la méthode init du Controller. Cependant, comme ma vue est personnalisée, j'obtiens une erreur comme quoi la méthode setEscape n'existe pas.

Ma question est donc, comme faire pour implémenter cette méthode dans ma vue personnalisée. Est-ce au moins possible ?

Merci
Janitrix est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/09/2007, 22h23   #2
Modérateur
 
Avatar de mathieu
 
Inscription : juin 2003
Messages : 4 893
Détails du profil
Informations forums :
Inscription : juin 2003
Messages : 4 893
Points : 4 466
Points : 4 466
Ta vue est personnalisée comment ? Avec une association au lieu d'un héritage ?
__________________
Modérateur PHP
mathieu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/09/2007, 22h51   #3
Membre Expert
 
Avatar de Janitrix
 
Inscription : octobre 2005
Messages : 3 398
Détails du profil
Informations forums :
Inscription : octobre 2005
Messages : 3 398
Points : 2 331
Points : 2 331
C'est une classe que j'ai trouvé sur le site de Philippe Le Van, auquel j'ai apporté quelques modifications :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
<?php
/*
 * Created on 20 juin 07
 *
 * @author Philippe Le Van (http://www.kitpages.fr)
 * @copyright 2005-2007
 */
Zend_Loader::loadClass("Zend_View_Interface");
 
class Kitpages_View_Smarty implements Zend_View_Interface {
 
    protected $_smarty = null;
    /**
     * Sets the template engine object
     *
     * @return smarty object
     */
    public function setEngine($smarty) {
        $this->_smarty = $smarty;
    }
    /**
     * Return the template engine object, if any
     * @return mixed
     */
    public function getEngine() {
        return $this->_smarty;
    }
 
    public function setScriptPath($path) {
        // nothing to do... in smarty...
    }
 
    /**
     * Assign a variable to the view
     *
     * @param string $key The variable name.
     * @param mixed $val The variable value.
     * @return void
     */
    public function __set($key, $val) {
        if ('_' == substr($key, 0, 1)) {
            require_once 'Zend/View/Exception.php';
            throw new Zend_View_Exception(
                'Setting private var is not allowed',
                $this);
        }
        if ($this->_smarty == null) {
            require_once 'Zend/View/Exception.php';
            throw new Zend_View_Exception(
                'Smarty not defined',
                $this);
        }
        $this->_smarty->assign($key,$val);
        return;
    }
 
    public function __get($key) {
        if ('_' == substr($key, 0, 1)) {
            require_once 'Zend/View/Exception.php';
            throw new Zend_View_Exception(
                'Setting private var is not allowed',
                $this);
        }
        if ($this->_smarty == null) {
            require_once 'Zend/View/Exception.php';
            throw new Zend_View_Exception(
                'Smarty not defined',
                $this);
        }
        return $this->_smarty->get_template_vars($key);
    }
 
    /**
     * Allows testing with empty() and
     * isset() to work
     *
     * @param string $key
     * @return boolean
     */
    public function __isset($key) {
        $vars = $this->_smarty->get_template_vars();
        return isset($vars[$key]);
    }
 
    /**
     * Allows unset() on object properties to work
     *
     * @param string $key
     * @return void
     */
    public function __unset($key) {
        $this->_smarty->clear_assign($key);
    }
 
    /**
     * Assign variables (other method)
     *
     */
    public function assign($spec, $value = null) {
        if (!is_array($spec)) {
            $spec = array($spec=>$value);
        }
        foreach ($spec as $key=>$val) {
            if ('_' == substr($key, 0, 1)) {
                require_once 'Zend/View/Exception.php';
                throw new Zend_View_Exception(
                    'Setting private var is not allowed',
                    $this);
            }
            if ($this->_smarty == null) {
                require_once 'Zend/View/Exception.php';
                throw new Zend_View_Exception(
                    'Smarty not defined', $this);
            }
            $this->_smarty->assign($key,$val);
        }
        return;
 
    }
 
    /**
    * Implémentation de la méthode Smarty append.
    */
    public function append($key, $val) {
    	if ('_' == substr($key, 0, 1)) {
            require_once 'Zend/View/Exception.php';
            throw new Zend_View_Exception(
                'Setting private var is not allowed',
                $this);
        }
        if ($this->_smarty == null) {
            require_once 'Zend/View/Exception.php';
            throw new Zend_View_Exception(
                'Smarty not defined',
                $this);
        }
        $this->_smarty->append($key,$val);
        return;
	}
 
    /**
     * Clear all assigned variables
     *
     * Clears all variables assigned to
     * Zend_View either via {@link assign()} or
     * property overloading ({@link __get()}/{@link __set()}).
     *
     * @return void
     */
    public function clearVars() {
        $this->_smarty->clear_all_assign();
    }
 
    /**
     * Processes a view script and returns the output.
     *
     * @param string $name The script script name to process.
     * @return string The script output.
     */
    public function render($name) {
        return $this->_smarty->fetch($name);
    }
 
    /**
     * Retrieve all view script paths
     * unused (smarty...)
     * @return array
     */
    public function getScriptPaths() {}
 
    /**
     * Set a base path to all view resources
     * unused (smarty...)
     * @param  string $path
     * @param  string $classPrefix
     * @return void
     */
    public function setBasePath($path, $classPrefix='Zend_View'){
    }
 
    /**
     * Add an additional path to view resources
     * unused (smarty...)
     * @param  string $path
     * @param  string $classPrefix
     * @return void
     */
    public function addBasePath($path, $classPrefix='Zend_View'){
    }
 
}
?>
Dans mon fichier index.php :
Code :
1
2
3
4
5
6
7
8
9
10
11
Zend_Loader::loadClass("Kitpages_View_Smarty");
$view = new Kitpages_View_Smarty();
$view->setEngine($smarty);
 
Zend_Loader::loadClass(
    "Kitpages_Controller_Action_Helper_ViewManager"
);
 
$viewManager = new Kitpages_Controller_Action_Helper_ViewManager();
$viewManager->setView($view);
Zend_Controller_Action_HelperBroker::addHelper($viewManager);
Janitrix est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/09/2007, 14h19   #4
Membre à l'essai
 
Inscription : juillet 2007
Messages : 38
Détails du profil
Informations forums :
Inscription : juillet 2007
Messages : 38
Points : 24
Points : 24
Salut,
J'ai eu pas mal de problème avec utf-8 mais je n'utilise pas smarty donc à tout hasard :
Code :
$this->view->setEncoding('utf-8');
Si tu utilises MySql, il y as un probleme avec utf-8 cf.

Chez moi ça à marché.
FredPont est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/09/2007, 20h19   #5
Rédacteur
 
Avatar de Yoteco
 
Alain Sahli
Ingénieur développement logiciels
Inscription : décembre 2004
Messages : 1 086
Détails du profil
Informations personnelles :
Nom : Alain Sahli
Âge : 25

Informations professionnelles :
Activité : Ingénieur développement logiciels
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : décembre 2004
Messages : 1 086
Points : 1 479
Points : 1 479
Une solution pas très propre c'est d'utiliser la fonction PHP utf8_encode() lorsque tu fais des requêtes sur ta base. Tu encodes en UTF-8 avant de passer le texte à ta vue.

Sinon tu peux essayer (je ne sais pas ce que sa va donner) d'aller dans ta méthode assign et là avant d'insérer le $value dans ton array tu fais un utf8_encode().
Yoteco est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/09/2007, 22h09   #6
Membre Expert
 
Avatar de Janitrix
 
Inscription : octobre 2005
Messages : 3 398
Détails du profil
Informations forums :
Inscription : octobre 2005
Messages : 3 398
Points : 2 331
Points : 2 331
En fait, ce que je me demandais, c'est :
au niveau client, c'est du UTF-8, ok, au niveau base de données, c'est du UTF-8. Maintenant, si je rentre les données d'un formulaire dans ma base, est ce que ce sera directement du UTF-8 ou je dois obligatoirement faire la conversion moi même en PHP ?

Ensuite, pour ce qui est du setEncode sur ma vue, comme je l'ai dit, c'est une vue personnalisé, et je ne dispose pas de cette méthode, et je ne sais pas comment l'implémenter (la doc n'est pas très clair sur ce point).

Merci.
Janitrix est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/09/2007, 22h23   #7
Modérateur
 
Avatar de mathieu
 
Inscription : juin 2003
Messages : 4 893
Détails du profil
Informations forums :
Inscription : juin 2003
Messages : 4 893
Points : 4 466
Points : 4 466
Citation:
Envoyé par Janitrix Voir le message
En fait, ce que je me demandais, c'est :
au niveau client, c'est du UTF-8, ok, au niveau base de données, c'est du UTF-8. Maintenant, si je rentre les données d'un formulaire dans ma base, est ce que ce sera directement du UTF-8 ou je dois obligatoirement faire la conversion moi même en PHP ?
si le formulaire est affiché en UTF-8, le navigateur renvois les données en UTF-8 donc tu n'as pas de traitement à faire

Citation:
Envoyé par Janitrix Voir le message
Ensuite, pour ce qui est du setEncode sur ma vue, comme je l'ai dit, c'est une vue personnalisé, et je ne dispose pas de cette méthode, et je ne sais pas comment l'implémenter (la doc n'est pas très clair sur ce point).
pour utiliser cette méthode il faudrait que ta vue hérite aussi de Zend_View

mais comme l'a dit Yoteco, ce n'est pas très propre d'utiliser utf8_decode/encode, normalement tu n'en as pas besoin si tout est en UTF-8
__________________
Modérateur PHP
mathieu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/09/2007, 22h26   #8
Membre Expert
 
Avatar de Janitrix
 
Inscription : octobre 2005
Messages : 3 398
Détails du profil
Informations forums :
Inscription : octobre 2005
Messages : 3 398
Points : 2 331
Points : 2 331
Citation:
si le formulaire est affiché en UTF-8, le navigateur renvois les données en UTF-8 donc tu n'as pas de traitement à faire
Merci de cette précision

Citation:
pour utiliser cette méthode il faudrait que ta vue hérite aussi de Zend_View
Ah, moi j'implémentais Zend_View_Interface, j'ai trouvé ça sur un tutoriel, donc j'ai pas trop au courant.

Merci et je vous tiens au courant
Janitrix est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/09/2007, 23h03   #9
Membre Expert
 
Avatar de Janitrix
 
Inscription : octobre 2005
Messages : 3 398
Détails du profil
Informations forums :
Inscription : octobre 2005
Messages : 3 398
Points : 2 331
Points : 2 331
Bon j'ai remplacé implements Zend_View_Interface par extends Zend_View. Il ne fait plus d'erreur quand j'appelle
Code :
$this->view->setEscape('utf8_encode');
Cependant, rien ne se passe Toujours mon point d'interrogation sur font noir quand il veut afficher un 'à'.

Je ne vois plus quoi faire. Si vous avez des idées...

Janitrix est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/09/2007, 10h30   #10
Membre à l'essai
 
Inscription : juillet 2007
Messages : 38
Détails du profil
Informations forums :
Inscription : juillet 2007
Messages : 38
Points : 24
Points : 24
As tu essayée la modif de "Zend_Db_Adapter_Pdo_Mysql" ?
FredPont est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/09/2007, 10h40   #11
Membre chevronné
 
Avatar de haltabush
 
Développeur Web
Inscription : avril 2005
Messages : 726
Détails du profil
Informations personnelles :
Âge : 27
Localisation : France

Informations professionnelles :
Activité : Développeur Web

Informations forums :
Inscription : avril 2005
Messages : 726
Points : 790
Points : 790
Oui, il faut aussi configurer la BD en utf8, avec set names UTF-8 (ou quelque chose comme ça, là je dis ça de mémoire)
__________________
HADOPI : black-out du net!
haltabush est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/09/2007, 16h05   #12
Membre Expert
 
Avatar de Janitrix
 
Inscription : octobre 2005
Messages : 3 398
Détails du profil
Informations forums :
Inscription : octobre 2005
Messages : 3 398
Points : 2 331
Points : 2 331
Citation:
Envoyé par FredPont Voir le message
As tu essayée la modif de "Zend_Db_Adapter_Pdo_Mysql" ?
Citation:
Envoyé par haltabush Voir le message
Oui, il faut aussi configurer la BD en utf8, avec set names UTF-8 (ou quelque chose comme ça, là je dis ça de mémoire)
Bah ça marche même sans ça. J'avais une vielle entrée qui avait dû être enregistrée en ISO-****. J'ai fait une nouvelle entrée, et ça marche maintenant.

Est-ce tout de même conseillé d'utiliser setName sur la base de données ?

Janitrix est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/09/2007, 16h13   #13
Membre chevronné
 
Avatar de haltabush
 
Développeur Web
Inscription : avril 2005
Messages : 726
Détails du profil
Informations personnelles :
Âge : 27
Localisation : France

Informations professionnelles :
Activité : Développeur Web

Informations forums :
Inscription : avril 2005
Messages : 726
Points : 790
Points : 790
Non, en fait le set name est juste là pour configurer le serveur mysql, qui par défaut fait ses entrées/sorties en iso, je crois. Si tu l'as bien configuré, c'est pas la peine.
__________________
HADOPI : black-out du net!
haltabush est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/09/2007, 16h14   #14
Membre Expert
 
Avatar de Janitrix
 
Inscription : octobre 2005
Messages : 3 398
Détails du profil
Informations forums :
Inscription : octobre 2005
Messages : 3 398
Points : 2 331
Points : 2 331
Ok. Parce qu'au niveau de PHPMyAdmin, j'ai tout mis en UTF-8. Donc la base doit d'elle même traiter les connexions en UTF-8. Merci bien à vous
Janitrix est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/09/2007, 10h34   #15
Membre à l'essai
 
Inscription : juillet 2007
Messages : 38
Détails du profil
Informations forums :
Inscription : juillet 2007
Messages : 38
Points : 24
Points : 24
Citation:
Envoyé par Janitrix Voir le message
Donc la base doit d'elle même traiter les connexions en UTF-8.
Euh je resterait vigilent sur ce point ?
FredPont 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 21h10.


 
 
 
 
Partenaires

Hébergement Web