Clansuite Community Forum

 
Willkommen Gast. Bitte einloggen oder registrieren.
Haben Sie Ihre Aktivierungs E-Mail übersehen?

Einloggen mit Benutzername, Passwort und Sitzungslänge
 
Seiten: [1]   Nach unten
  Drucken  
Autor Thema: doctrine 2  (Gelesen 730 mal)
0 Mitglieder und 2 Gäste betrachten dieses Thema.
paulbr
Developer
*****
Offline Offline

Beiträge: 126


« am: Mai 02, 2011, 07:58:13 »

Hallo jens,

hast du eine Idee wie man dem doctrine 2 beibringt das er uft8 verwenden soll?

Ich hab das in der doctrine2.core.php versucht, aber ohne erfolg.

Ich möchte ungern die library ändern, allerdings wäre das erstmal eine notlösung.

In EntityManager.php
nach Zeile 722 hinzufügen:
$conn->setCharset("utf8");

Damit ist die Ausgabe zumindest mal wieder korrekt.

Vielleicht hast du ja noch eine Idee!

gruss
paul

Edit:
mann bin ich doof!
Vergiss das, ist doch einfacher wenn man versucht nicht kompliziert zu denken Smiley

Reicht folgende änderung in der doctrine2.core.php

tausche:
   return \Doctrine\ORM\EntityManager::create($connectionOptions, $config);

durch:
   $em = \Doctrine\ORM\EntityManager::create($connectionOptions, $config);
   $em->getConnection()->setCharset('UTF8');
   return $em;

Ich comitte das gleich.


Gespeichert
Rikku
Neuling
*
Offline Offline

Beiträge: 24


« Antworten #1 am: Mai 02, 2011, 11:03:30 »

Ist das nicht besser über den EventManager zu lösen?

Code:
$evm = new EventManager();
$evm->addEventSubscriber(new MysqlSessionInit('UTF8'));

$conn = DriverManager::getConnection($connectionParams, null, $evm);
Gespeichert
paulbr
Developer
*****
Offline Offline

Beiträge: 126


« Antworten #2 am: Mai 03, 2011, 01:51:25 »

hmm hab ich noch nicht ausprobiert, werd ich morge mal tun.

Möglich wäre evtl. auch anstatt:
  $em->getConnection()->setCharset('UTF8');

das man dies definiert:
  $em->getEventManager()->addEventSubscriber(new MysqlSessionInit('utf8', 'utf8_unicode_ci'));

Ich probiere das mal aus.

Was auf jedenfall nicht ausreicht ist wenn man nur die $connectionOptions ergänzt:

  $connectionOptions = array(
       'driver'    => $db_config['database']['driver'],
       'user'      => $db_config['database']['username'],
       'password'  => $db_config['database']['password'],
       'dbname'    => $db_config['database']['name'],
       'host'      => $db_config['database']['host'],
       'charset' => 'UTF8',
       'driverOptions' => array(
           'charset' => 'UTF8'
       )
   );

Ich glaube aber das man das auch benötigt beim schreiben in die DB.
Wobei man hier evtl. das gewünschte outputcharset aus der $config nehmen sollte.


gruss
paul

-----------------

EDIT:

ja es Funktioniert ebenfalls wenn man:
Code:
...
use \Doctrine\DBAL\Event\Listeners\MysqlSessionInit;

# Security Handler
if (defined('IN_CS') === false)
...

und dann in der function init
Code:
...
  $em = \Doctrine\ORM\EntityManager::create($connectionOptions, $config);
  $em->getEventManager()->addEventSubscriber(new MysqlSessionInit('utf8', 'utf8_unicode_ci'));
  return $em;

abändert.

Was jetzt die bessere Lösung ist muss man sehen, wenn die Module nach und nach
auf d2 abgeändert werden.

Zitat
$evm = new EventManager();
$evm->addEventSubscriber(new MysqlSessionInit('UTF8'));

Warum noch ein Object auf EventManager machen, wenn der bereits im EntityManager vorhanden ist?
Ein use auf MysqlSessionInit wird wohl auf jedenfall benötigt, da dies weder im EntityManager noch im EventManager vorhanden ist.

Man muss sich hier vortasten, mit d2 bin ich noch nicht sehr weit vorgedrungen um das richtig zu
verstehen. Ich denke auch das hier noch einige Änderungen in d2 kommen werden.

Gespeichert
Rikku
Neuling
*
Offline Offline

Beiträge: 24


« Antworten #3 am: Mai 03, 2011, 12:38:53 »

Hallo Paul,

ich hatte das Code Beispiel nur schnell aus der Doku kopiert. Ohne vorher nachzusehen wie das in Clansuite zu Implementieren wäre.

So wie ich das gelesen hatte, wird das Event ja nur gefeuert, wenn Doctrine eine Verbindung zu einer MySQL DB herstellt und und dann UTF8 setzt wenn es nicht clientseitig aktiviert ist. Bei anderen Datenbanken ist das ja dann nicht notwendig. Daher eher die Lösung über die Events anstatt das für alle DB`s zu setzten.

gruß
Rikku
Gespeichert
paulbr
Developer
*****
Offline Offline

Beiträge: 126


« Antworten #4 am: Mai 03, 2011, 02:16:26 »

Hallo Daniel,

ich bin auch überfragt was d2 betrifft, hab google bemüht und ebend festgestellt, das viele dieses
Problem haben.
Fakt ist, das d2 im gegensatz zu d1 nicht automatisch in utf8 speichert und ausgibt, da kann
in der clansuite noch 100mal charset=utf8 stehen, d2 ignoriert das.
D2 muss explizit darauf hingewiesen werden, das es utf8 verwenden soll Smiley

gruss
paul
Gespeichert
Jens-A. Koch
Maintainer
*
Offline Offline

Beiträge: 574

One-Man Team


« Antworten #5 am: Mai 03, 2011, 08:45:35 »

Ja, das geht beides. Ich würde den Weg über $em->getConnection()->setCharset('UTF8'); bevorzugen. Somit wird auch für andere Dbs UTF-8 gesetzt und nicht nur MySQL spezifisch.

Wählt man den Lösungsweg über $em->getEventManager()->addEventSubscriber(new MysqlSessionInit('utf8', 'utf8_unicode_ci')); taucht das Problem sofort wieder auf,
wenn jemand eine andere Db einsetzten möchte. Um das für alle Dbs zu lösen, könnte man
auf einen dynamischen gebildeten Klassennamen zurückgreifen.
Also je nach Db: "new $db_config['database']['driver'] . SessionInit", anstatt "new MysqlSessionInit".

Nachtrag: Glaube das geht nicht auf einer Zeile, wegen dem new - daher besser auf zwei Zeilen:
$classname = $db_config['database']['driver'] . 'SessionInit';
new $classname;
Gespeichert

Keine Supportanfragen per PN oder Mail. Fragen bitte nur im Forum stellen (Wie man Fragen richtig stellt).
Rikku
Neuling
*
Offline Offline

Beiträge: 24


« Antworten #6 am: Mai 03, 2011, 08:59:28 »

Ja, das geht beides. Ich würde den Weg über $em->getConnection()->setCharset('UTF8'); bevorzugen. Somit wird auch für andere Dbs UTF-8 gesetzt und nicht nur MySQL spezifisch.

Deswegen gibt es ja den MySQL Listner, weil bei anderen Datenbanken das "Problem" garnicht auftritt.

Aber letztendlich ist es wohl völlig egal, welchen weg man hier man nimmt.
Gespeichert
paulbr
Developer
*****
Offline Offline

Beiträge: 126


« Antworten #7 am: Mai 04, 2011, 09:21:08 »


Wenn das Problem bei anderen Drivern gar nicht auftritt, braucht man es doch nur wenn MySql
genutzt wird.
Dann könnte man auch erst abfragen ob driver == "pdo_mysql" ist und dann das charset setzen.

Allerdings finde ich das man hier grundsätzlich das charset setzen sollte, zudem man ja in der
clansuite.config.php die möglichkeit hat ein charset zu ändern.
Wenn irgendwann mal ein Anwender den latin zeichensatz da setzt, gibbed sonst probleme.

Wir sollten also hier nicht nur die connection daten sondern auch das outputcharset aus der
clansuite.config an d2 übergeben, bzw. wir machen für die section: [database] einen zusätzlichen
parameter: charset = "utf8".
So kann dann jeder Anwender für sich entscheiden wie er es gerne hätte Smiley

Code:
        $connectionOptions = array(
            'driver'    => $db_config['database']['driver'],
            'user'      => $db_config['database']['username'],
            'password'  => $db_config['database']['password'],
            'dbname'    => $db_config['database']['name'],
            'host'      => $db_config['database']['host'],
            'charset'   => $db_config['database']['charset'],
            'driverOptions' => array(
                'charset' => $db_config['database']['charset']
            )
        );
...
        $em = \Doctrine\ORM\EntityManager::create($connectionOptions, $config);
        $em->getConnection()->setCharset($db_config['database']['charset']);
...


gruss
paul
Gespeichert
Jens-A. Koch
Maintainer
*
Offline Offline

Beiträge: 574

One-Man Team


« Antworten #8 am: Mai 04, 2011, 11:54:00 »

Änderungen vorgenommen
- clansuite.config.php: Neues Setting: [database] charset = UTF8
- $connectionOptions um charset aus der Config ergänzt

Gruß Jens
Gespeichert

Keine Supportanfragen per PN oder Mail. Fragen bitte nur im Forum stellen (Wie man Fragen richtig stellt).
Seiten: [1]   Nach oben
  Drucken  
 
Gehe zu:  


Powered by SMF 1.1.16 | SMF © 2006-2009, Simple Machines

Google visited last this page Gestern um 10:25:24