Ich möchte euch schnell einen kleinen Trick zu meinem Lieblingsthema Encoding und I18N zeigen. In CakePHP ist zwar in der nächsten größeren Version eine I18N Unterstützung geplant, ich weiß jedoch nicht in wie weit diese schon implementiert wurde. Natürlich haben wir keine Zeit auf diese Version zu warten.
Wenn man die Daten seiner Model UTF-8 kodiert vom Datenbankserver bekommen will, muss man wie bekannt sein sollte, bei jeder neuen Verbindung zuerst das “set names ‘utf8′” SQL Statement absetzen um dem Server die Kodierung mitzuteilen. In CakePHP hat man die Möglichkeit bei “beforeFind” einzuhacken. Das ist jedoch keine optimale Lösung, da dann vor jedem Query dieses Statement abgesetzt wird. Besser ist folgende Methode, indem der Konstruktor des AppModel erweitert wird:
class AppModel extends Model
{
function __construct($id=false, $table=null, $ds=null) {
parent::__construct($id, $table, $ds);
$this->execute( "SET NAMES 'UTF8'" );
}
}
Auf GetTheAnswer gibt es von mir ein etwas ausführlicheres Tutorial zu Encoding jedoch in Englisch.
5 Responses
dirk.olbertz
August 24th, 2006 at 10:48
1Etwas ungünstig dabei ist nur, dass dies dann für jedes Model gemacht wird und man so teilweise fünf oder sechsmal pro Seitenaufruf das “SET NAMES ‘UTF8′” ausführt.
In Cake 1.2 wird es aber die Möglichkeit geben, in der database.php die Codierung des Zeichensatzes mit zu übergeben, so dass dann obiger Trick überflüssig wird.
Daniel Hofstetter
August 25th, 2006 at 8:33
2Falls man einen eigenen Server betreibt, so kann auch
[mysqld]
init-connect = ‘SET NAMES utf8′
zur Konfigurations-Datei /etc/mysql/my.cnf hinzufügen.
Reen
August 25th, 2006 at 9:58
3Ich hab das ganze ähnlich gelöst, nur dass ich eine
Konstante gesetzt habe die verhindert dass es mehr als einmal ausgeführt wird:
if(!defined(’MODEL_UTF8′)) {
$this->execute( “SET NAMES ‘UTF8′” );
define(’MODEL_UTF8′);
}
Lars Strojny
September 7th, 2006 at 4:40
4Ein Problem gibt es noch mit den View-Helpern. Sobald dort htmlentities() oder htmlspecialchars() verwendet wird, wird leider kein Charset übergeben. Das Problem ist, dass PHP sich bei diesen Funktionen in keinster Weise um die INI-Direktive default_charset kümmert, sondern ausschließlich auf den Parameter hört. Somit bleibt einem hier nichts anderes übrig, als hier Cake zu patchen und alle Stellen in den View-Helpern, in denen htmlentities() zum Einsatz kommt, mit htmlentities( $string, null, “UTF-8″ ) bzw. dem Pendant für htmlspeciachars() zu ersetzen.
Andreas
September 8th, 2006 at 11:15
5Die mehrfache Ausführung der SET NAMES Abfrage kann auch durch eine statische Variable im AppModel verhindert werden. Ich hab das hier[1] mal dargestellt.
http://andreas-waidelich.de/weblog/view/248
Gruß, Andreas
RSS feed for comments on this post · TrackBack URI
Leave a reply
Letzte Kommentare
Links
Kategorien
Meta
Cake Bakery is proudly powered by WordPress - BloggingPro theme by: Design Disease