IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

ORM PHP Discussion :

Internationalisation et behavior Doctrine I18n


Sujet :

ORM PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    32
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 32
    Par défaut Internationalisation et behavior Doctrine I18n
    Bonjour,

    Je suis en train d'essayer de mettre en place l'internationalisation avec le behavior I18n de Doctrine. Je précise que je suis sur symfony 1.4.5 ce qui est censé permettre de pouvoir utiliser un champ "culture" à la place de champ "lang".

    Cependant, il doit y avoir quelque chose qui m'échappe car mes pages me retournent toujours des erreurs :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Unknown record property / related component "myfield" on "MyObject"
    J'ai bien modifié mon schema pour spécifier tous les behaviors I18n sur les objets à internationaliser, j'ai mis à jour la base de données avec des scripts de migration Doctrine, j'ai re-généré les classes, vidé le cache, mais cela semble ne pas suffire.

    Faut-il aussi ré-écrire toutes les requêtes pour que ça fonctionne ?

  2. #2
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    32
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 32
    Par défaut
    Je précise aussi que j'ai bien ajouté un use_helper('I18N') dans toutes les templates et que la culture de l'utilisateur est bien définie.

    Lorsque j'utilise l'internationalisation sur les chaînes de caractère en les écrivant avec le helper __(), les chaînes sont bien remplacées, mais c'est du côté du bahavior de Doctrine que ça bloque...

  3. #3
    Expert confirmé
    Avatar de Michel Rotta
    Homme Profil pro
    DPO
    Inscrit en
    Septembre 2005
    Messages
    4 954
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : DPO
    Secteur : Distribution

    Informations forums :
    Inscription : Septembre 2005
    Messages : 4 954
    Par défaut
    Il faudrait plus de renseignements :
    • un bout du shema.yml
    • comment tu initialises la culture du user
    • comment tu récupères les données
    • que te donnes les requêtes SQL quant tu est en mode DEV dans les outils SF ?

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    32
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 32
    Par défaut
    Après quelques tests, je me suis rendu compte que c'est en fait un de mes objets qui a une clé primaire basée sur 2 champs que je ne parviens pas à internationaliser.

    un bout du shema.yml
    => Voici mon schema :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
     
    options:
      type: INNODB
      collate: utf8_general_ci
      charset: utf8
     
    Enseigne:
      connection: doctrine
      columns:
        id:
          type: integer(8)
          primary: true
          autoincrement: true
        nom:
          type: string(255)
     
    TypeContenu:
      connection: doctrine
      actAs:
        I18n:
          fields: [libelle]
          i18nField: culture
          length: 5
      columns:
        id:
          type: integer(8)
          primary: true
          autoincrement: true
        libelle:
          type: string(255)
     
    Contenu:
      connection: doctrine
      actAs:
        I18n:
          fields: [libelle]
          i18nField: culture
          length: 5
      columns:
        id_enseigne:
          type: integer(8)
          primary: true
        id_type_contenu:
          type: integer(8)
          primary: true
        libelle:
          type: string(20)
      relations:
        Enseigne:
          local: id_enseigne
          foreign: id
          type: one
          foreignAlias: EnseigneContenus
          foreignType: many
        TypeContenu:
          local: id_type_contenu
          foreign: id
          type: one
          foreignAlias: EnseigneContenus
          foreignType: many
    L'internationalisation fonctionne bien sur TypeContenu mais pas sur Contenu à cause apparemment de ses 2 champs en clé primaire...


    comment tu initialises la culture du user
    => J'ajoute simplement un $this->setCulture('fr_FR') dans la méthode initialize de la classe myUser.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
      public function initialize(sfEventDispatcher $dispatcher, sfStorage $storage, $options = array())
      {
        parent::initialize($dispatcher, $storage, $options);
     
        $this->setCulture('fr_FR');
      }
    comment tu récupères les données
    => Directement avec le code généré par symfony :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    public function executeIndex(sfWebRequest $request)
      {
        $this->contenus = Doctrine::getTable('Contenu')
          ->createQuery('a')
          ->execute();
      }
    que te donnes les requêtes SQL quant tu est en mode DEV dans les outils SF ?
    => Les requêtes que j'obtiens sont bien correctes mais c'est au niveau de l'objet que la propriété n'existe pas :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    1.
    SET NAMES 'UTF8'
     
    2.
    SELECT c.id_enseigne AS c__id_enseigne, c.id_type_contenu AS c__id_type_contenu FROM contenu c
     
    3.
    SELECT c.id_enseigne AS c__id_enseigne, c.id_type_contenu AS c__id_type_contenu, c.libelle AS c__libelle, c.culture AS c__culture FROM contenu_translation c WHERE (c.id_enseigne IN ('1'))
    Aurais-tu plus d'infos sur le behavior I18n appliqué sur un objet dont la clé primaire porte sur 2 champs ?

  5. #5
    Expert confirmé
    Avatar de Michel Rotta
    Homme Profil pro
    DPO
    Inscrit en
    Septembre 2005
    Messages
    4 954
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : DPO
    Secteur : Distribution

    Informations forums :
    Inscription : Septembre 2005
    Messages : 4 954
    Par défaut
    C'est pas gagné.

    Doctrine ne sait clairement pas gérer correctement des tables avec plus d'une clef primaire, à l'exception des tables qui font les liaisons entre deux tables "normales" pour le cas des liaisons n-n (Et encore, quant il n'y a pas d'argument sur ce type de liaison).

    Donc la solution consiste à supprimer la double clef primaire.

    Je te propose :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
     
    options:
      type: INNODB
      collate: utf8_general_ci
      charset: utf8
     
    Enseigne:
      columns:
        nom: string(255)
     
    TypeContenu:
      actAs:
        I18n:
          fields: [libelle]
      columns:
        libelle: string(255)
     
    Contenu:
      actAs:
        I18n:
          fields: [libelle]
      columns:
        enseigne_id:
          type: integer(8)
        type_contenu_id:
          type: integer(8)
        libelle:
          type: string(20)
      indexes:
        enstype:
          fields: [ enseigne_id, type_contenu_id ]
          type: unique
      relations:
        Enseigne:
          local: enseigne_id
          foreign: id
          foreignAlias: EnseigneContenus
        TypeContenu:
          local: itype_contenu_id
          foreign: id
          foreignAlias: EnseigneContenus
    • J'ai viré ce qui n'était pas utile ou déjà défini par défaut.
    • J'ai mis les nom des champs de liaison à la coutume
    • S'il n'y a pas de clef primaire définie, doctrine crée un id primaire integer donc on le laisse faire
    • J'ai créé un index unique pour s'assurer qu'il n'y ai pas de doublon dans les clefs, comme s'il y avait un index unique.

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    32
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 32
    Par défaut
    Merci mimi, effectivement ça fonctionne en remplaçant la clé primaire sur 2 champs par une nouvelle clé primaire sur un champ 'id' en incrément auto.

    Il me reste un problème sur les requêtes Doctrine qui comportent une jointure avec un autre objet internationalisé : les champs de l'objet lié ne sont pas reconnus. Par contre, quand j'ajoute une jointure avec Translation, ça fonctionne.

    Faut-il systématiquement ajouter une jointure de ce type pour que ça fonctionne ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
      ->leftJoin('b.Translation t')
      ->addWhere('t.culture = ?', $culture)

Discussions similaires

  1. Réponses: 6
    Dernier message: 04/11/2010, 12h11
  2. [i18n - GNU gettext]Conseil d'internationalisation
    Par Sophie L. dans le forum Général Java
    Réponses: 5
    Dernier message: 20/04/2009, 14h39
  3. Réponses: 1
    Dernier message: 21/07/2006, 14h59
  4. [I18n] Internationalisation d'une image?
    Par questionneuse dans le forum Struts 1
    Réponses: 6
    Dernier message: 22/06/2006, 12h22
  5. [I18N] internationalisation ne marche pas
    Par gloglo dans le forum Struts 1
    Réponses: 44
    Dernier message: 31/05/2006, 10h59

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo