Anomalie #578
ferméAprès MAJ en 0.7.4, les libellés de contributions et de statuts avec accent sont vides
Ajouté par Raphaël Hertzog il y a plus de 11 ans. Mis à jour il y a plus de 10 ans.
100%
Description
J'utilise PostgreSQL et lors de ma tentative de mise à jour en 0.7.4, j'ai constaté que tous les libellés de contribution et de statuts qui contenaient des acccents étaient vides (du moins sur la page web, je n'ai pas vérifié dans la base de données).
J'ai vu ce message dans les logs ceci dit:
92.243.16.27 - 2013-03-05 09:43:57 - 4 - PHP Warning: htmlspecialchars(): Invalid multibyte sequence in argument in /var/cache/galette/templates_c/a2019a98bfadd6abad76c4684c85611f9fdc0a1a.file.gestion_intitule_content.tpl.php on line 108
Je suis en Debian Squeeze avec toutes les mises à jour.
Mis à jour par Raphaël Hertzog il y a plus de 11 ans
Quelques informations supplémentaires.
Avant la mise à jour, dans la base les chaînes sont en ISO-8859-1 (tables galette_statuts et galette_types_cotisation) et PostgreSQL est configuré en ISO-8859-1. Les caractères accentués s'affichent correctement dans "Configuration > Gestions des statuts" et "Configuration > Gestions des types de contribution". Bizarrement les accents codés en ISO-8859-1 dans la table galette_adherents ne s'affichent pas correctement dans tous les écrans de gestions des adhérents... Il serait intéressant de comprendre le pourquoi de cette différence et le résoudre.
Après la mise à jour, je n'ai pas pris le temps de regarder ce qui s'était passé au niveau de la base de données.
Mis à jour par Johan Cwiklinski il y a plus de 11 ans
Merci pour les précisions :)
J'ai récemment supprimé des conversions d'encodage (pour des raisons de performance principalement) ; puisque le plugin admintools est en mesure de résoudre ce type de soucis pour MySQL, et que je n'ai jamais encore rencontré le cas avec un Postgres.
Je pense que ça fonctionne à certains endroits et pas à d'autres à cause de « problèmes » de traductions/traductions dynamiques. Je sais que ce point n'est pas parfaitement fonctionnel, et que pas mal de choses ne sont pas trop logiques voire relèvent presque du « bricolage ».
La mise à jour n'est pas censée modifier quoi que ce soit côté base de données, certainement pas l'encodage ;)
Mis à jour par Johan Cwiklinski il y a plus de 11 ans
Les modifications pour activer la conversion d'encodage pour les bases Postgres requiert deux petites modifications (une dans Galette, l'autre dans le plugin) :
diff --git a/galette/lib/Galette/Core/Db.php b/galette/lib/Galette/Core/Db.php
index 0e5cbab..ce3568b 100644
--- a/galette/lib/Galette/Core/Db.php
+++ b/galette/lib/Galette/Core/Db.php
@@ -538,7 +538,7 @@ class Db extends \Zend_Db
$tables = $this->getTables($prefix);
foreach ($tables as $table) {
- if ( $content_only === false ) {
+ if ( $content_only === false && !$this->isPostgres() ) {
//Change whole table charset
//CONVERT TO instruction will take care of each fields,
//but converting data stay our problem.
diff --git a/templates/default/admintools.tpl b/templates/default/admintools.tpl
index 660d2c5..a55731c 100644
--- a/templates/default/admintools.tpl
+++ b/templates/default/admintools.tpl
@@ -22,10 +22,8 @@
<div class="warningbox">
<p>{_T string="Make sure you've done a backup of the database before using any of the following tools!"}</p>
</div>
-{if $smarty.const.TYPE_DB == 'mysql'}
<article>
<p>
- <span>{_T string="That function is available for MySQL installations only!"}</span><br/>
{_T string="Converts the whole database data to UTF-8, do not change anything on the tables, just proceed data conversion."}<br/>
{_T string="You should use that function if you can see strange characters in your datas; after a manual import, or if you've not used Galette's update scripts."}<br/>
{_T string="That conversion stuff will read your entire database, and write back each non UTF-8 values after conversion; this may take a while."}
@@ -34,7 +32,6 @@
<input name="convert_encoding" type="submit" value="{_T string="Convert encoding"}"/>
</p>
</article>
-{/if}
</fieldset>
</form>
</section>
N'ayant pas de base ISO sous la main, je n'ai pas pu tester le fonctionnement, mais la conversion des données est faite côté PHP, ça devrait donc aller. La méthode admintools ne touche qu'aux données (en mysql comme en postgres).
À noter : cette modification affecte aussi la mise à jour à partir d'une version < 0.7 ; pour laquelle une requête ALTER est exécutée lorsqu'il s'agit de MySQL, je ne sais pas s'il faut un équivalent pour Postgres (je n'ai pas de base galette postgres < 0.7 en iso pour ma part) ; faute de tests possibles, je pense désactiver la conversion à l'installation pour Postgres ; si toutefois ce correctif fonctionnait :)
Mis à jour par Raphaël Hertzog il y a plus de 11 ans
Hum, tout ceci est plutôt contre-productif. Ce qu'il faudrait c'est que la connexion à la base de données indique le jeu de caractère désiré et laisser PostgreSQL faire la conversion à la volée.
En cas de changement d'encodage à l'insu de Postgres alors après on peut faire le changement manuel avec "update pg_database set encoding = pg_char_to_encoding('UTF8') where datname = 'galette'" mais en vérité cela ne devrait pas être nécessaire. Cette modif nécessite les droits d'admin (user postgres) et ne peut pas être effectuée automatiquement par galette.
Tu peux te créer une base ISO très facilement en faisant "createdb -E LATIN1 -O galette galettetest" et ensuite exécuter un dump d'une de tes bases en UTF-8. Le fichier commence par "SET client_encoding = 'UTF8';" et la conversion se fera à la volée.
Mis à jour par Johan Cwiklinski il y a plus de 11 ans
Raphaël Hertzog a écrit :
Hum, tout ceci est plutôt contre-productif. Ce qu'il faudrait c'est que la connexion à la base de données indique le jeu de caractère désiré et laisser PostgreSQL faire la conversion à la volée.
Oui, mais MySQL n'est pas capable de faire ça, et je souhaiterai autant que possible éviter les cas particuliers (j'en ai déjà bien trop alors que j'utilise un framework censé m'abstraire ce genre de considérations...).
Cela dit, c'est certainement bien plus simple, en effet.
En cas de changement d'encodage à l'insu de Postgres alors après on peut faire le changement manuel avec "update pg_database set encoding = pg_char_to_encoding('UTF8') where datname = 'galette'" mais en vérité cela ne devrait pas être nécessaire. Cette modif nécessite les droits d'admin (user postgres) et ne peut pas être effectuée automatiquement par galette.
Tu peux te créer une base ISO très facilement en faisant "createdb -E LATIN1 -O galette galettetest" et ensuite exécuter un dump d'une de tes bases en UTF-8. Le fichier commence par "SET client_encoding = 'UTF8';" et la conversion se fera à la volée.
Ok, je testerai ça, merci pour les infos.
Mis à jour par Johan Cwiklinski il y a plus de 11 ans
- Priorité changé de Haut à Normal
- Catégorie mis à Database
Mis à jour par Johan Cwiklinski il y a presque 11 ans
- % réalisé changé de 0 à 100
- Statut changé de Nouveau à Résolu
Appliqué par commit 6c267cf23aa176ede6c23de9c3a1e8eafdb991f0.