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 05/11/2007, 19h10   #1
Invité de passage
 
Inscription : novembre 2007
Messages : 6
Détails du profil
Informations forums :
Inscription : novembre 2007
Messages : 6
Points : 2
Points : 2
Par défaut Stratégie CHARSET db/view... mb_string et cie

bonjour,

je viens de me mettre au zf.

quelle est la bonne stratégie pour les charset ?

voici ma piste

config.ini
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
 
 
[global]
input.encoding            = ISO-8859-15 #par exemple
output.encoding            = ISO-8859-15 #par exemple
internal.encoding              = ISO-8859-15 #par exemple
 
...
[prod : global]
...
 
...
 
database.collation = utf8_swedish_ci
database.charset   = utf8
database.encoding = UTF-8
....
dans le bootstrap (index.php)
Code :
1
2
 
Zend_Registry::get("db")->getConnection()->exec("SET NAMES '".Zend_Registry::get("config")->database->charset."' COLLATE '".Zend_Registry::get("config")->database->collation."'");
donc il faut maintenant bien filtrer ce que je récupère de la base et ce que j'y met...

je pensais décliner une classe Zend_Db pour surcharger la fonction ->quote() et les fonctions de type ->fetch() et glisser des petits mb_convert_encoding() pour convertir entre work.charset et database.charset.

Ensuite utiliser $view->setEscape() pour indiquer une fonction qui utilise mb_convert_encoding() pour convertir vers output.charset. Ou bien décliner Zend_View pour surcharger escape() et ajouter 2 méthodes ->setWorkEncoding() et ->setOutputEncoding() (pour être plus esthétique).

est-ce la bonne stratégie ? l'idée est de pouvoir être très générique bien sûr

comment faites vous ?

EDIT :

et avec mbstring.encoding_translation quelqu'un a testé ? => pas bien

EDIT 2 :

j'ai sous-classer Zend_Db_Adapter_Pdo_Mysql

EDIT 3 :

en mysql le charset latin1 correspond à Windows-1252 en mbstring
quazardous est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/11/2007, 17h55   #2
Invité de passage
 
Inscription : novembre 2007
Messages : 6
Détails du profil
Informations forums :
Inscription : novembre 2007
Messages : 6
Points : 2
Points : 2
après quelques heures de farfouillage de docs et de codes...

pour la base de données :
sous-classer Zend_Db_Adapter_Pdo_Mysql (pour Mysql) semble être une bonne idée

Code :
1
2
 
class Encoding_Db_Adapter_Pdo_Mysql extends Zend_Db_Adapter_Pdo_Mysql
pour input http :
sous-classer les zend_filter

pour output http :

le moteur mbstring en automatique (mbstring.encoding_translation On) c'est pas le top (risque d'effet de bord, impact selon l'implémentation du zf, très lié à la conf serveur, etc)

mbstring permet aussi d'utiliser ob_start avec une fonction de callback mais ob_start est aussi utilisé par zend_cache.....

d'où l'idée d'une classe Encoding_Dummy_Cache_Page qui utilise ob_start uniquement pour la convertion mbstring et pour vraiment utilser la cache + mbstring il faut sous-classer Zend_Cache_Page en Encoding_Cache_Page (par ex)

cela permet de rester cohérent avec les évolutions du zf...

commentaires ?

EDIT : le code

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
 
class Encoding_Db_Adapter_Pdo_Mysql extends Zend_Db_Adapter_Pdo_Mysql
{
 
	protected $_charset = false;
	protected $_collation = false;
	protected $_databaseEncoding = false;
	protected $_internalEncoding = false;
 
	public function __construct($config)
	{
		parent::__construct($config);
 
		if(isset($this->_config['charset']))
		{
			$this->setCharset($this->_config['charset']);
		}
		if(isset($this->_config['collation']))
		{
			$this->setCollation($this->_config['collation']);
		}
	}
 
	public function setCharset($charset)
	{
		$this->_charset=$charset;
	}
 
	public function getCharset()
	{
		return $this->_charset;
	}
 
	public function setCollation($collation)
	{
		$this->_collation=$collation;
	}
 
	public function setEncodings($database, $internal)
	{
		$this->_databaseEncoding = $database;
		$this->_internalEncoding = $internal;
	}
 
	public function getDatabaseEncoding()
	{
		return $this->_databaseEncoding;
	}
 
	public function getInternalEncoding()
	{
		return $this->_internalEncoding;
	}
 
	public function getCollation()
	{
		return $this->_collation;
	}
 
	protected function _connect()
	{
		if ($this->_connection)
		return;
 
		parent::_connect();
 
		// please do not touch names if I don't tell you to do so
		//$this->_connection->setAttribute(PDO::ATTR_CASE, PDO::CASE_NATURAL);
 
		if($this->getCharset())
		{
			if($this->getCollation())
			{
				$this->query("SET NAMES '".$this->getCharset()."' COLLATE '".$this->getCollation()."'");
			}
			else
			{
				$this->query("SET NAMES '".$this->getCharset()."'");
			}
		}
	}
}
et l'appel dans le bootstrap

Code :
1
2
3
4
5
6
7
8
9
10
11
 
		$db = Zend_Db::factory('Pdo_Mysql', array(
    'host'             => Zend_Registry::get("config")->database->host,
    'username'         => Zend_Registry::get("config")->database->username,
    'password'         => Zend_Registry::get("config")->database->password,
    'dbname'           => Zend_Registry::get("config")->database->name,
	'charset'          => Zend_Registry::get("config")->database->charset,
	'collation'        => Zend_Registry::get("config")->database->collation,
	'options'		   => $options,
	'adapterNamespace' => 'Encoding_Db_Adapter', //cf classe Encoding_Db_Adapter_Pdo_Mysql
		));
quazardous est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/11/2007, 18h06   #3
Invité de passage
 
Inscription : novembre 2007
Messages : 6
Détails du profil
Informations forums :
Inscription : novembre 2007
Messages : 6
Points : 2
Points : 2
re,

je continue ce post seul

pour le output le pseudo cache c pas une bonne piste...

j'utilise juste le $view->setEscape

Code :
1
2
3
4
5
6
7
8
9
10
11
 
if(Zend_Registry::get("config")->internal->encoding!=Zend_Registry::get("config")->output->encoding)
{
	Zend_Loader::loadClass('Encoding_Escape');
	$escape=new Encoding_Escape(Zend_Registry::get("config")->internal->encoding,Zend_Registry::get("config")->output->encoding);
	$view->setEscape(array($escape, "escape"));
}
else
{
	$view->setEncoding(Zend_Registry::get("config")->internal->encoding);
}
Encoding_Escape :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
 
class Encoding_Escape
{
	protected $_internalEncoding;
	protected $_outputEncoding;
 
	public function __construct($internal, $output)
	{
		$this->_internalEncoding=$internal;
		$this->_outputEncoding=$output;
	}
 
	public function escape($string)
	{
		return mb_convert_encoding(htmlspecialchars($string,ENT_COMPAT,$this->_internalEncoding),$this->_outputEncoding,$this->_internalEncoding);
	}
}
a+
quazardous 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 12h02.


 
 
 
 
Partenaires

Hébergement Web