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 :

Problème Internationalisation avec Doctrine


Sujet :

ORM PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Novembre 2009
    Messages
    15
    Détails du profil
    Informations forums :
    Inscription : Novembre 2009
    Messages : 15
    Par défaut Problème Internationalisation avec Doctrine
    Bonjour à tous,

    Je découvre le développement avec Symfony et après quelques jours d'utilisations, je rencontre un problème pour internationaliser mes tables Doctrine.

    Tout d'abord, je vais vous exposer la situation:
    Mon site a pour but d'afficher des voyages.
    Chaque voyages est associé à une liste de pays (par une table de liaison)

    Voici la structure de mes tables:
    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
     
    Continent:
       tableName: Continent
       actAs:
          I18n:
             fields: [nom]
       columns:
          id:   { type: integer(3), unsigned: true, primary: true, autoincrement: true }
          nom:  { type: string(15), notnull: true }
     
     
    Pays:
       tableName: Pays
       columns:
          id:                  { type: integer(4), unsigned: true, primary: true, autoincrement: true }
          continent_id:        { type: integer(3), unsigned: true, notnull: true }
          sous_continent_id:   { type: integer(4), unsigned: true }
          iso:                 { type: string(2) }
          nom:                 { type: string(100), notnull: true }
       relations:
          Continent:           { onDelete: CASCADE, local: continent_id, foreign: id }

    Dans la classe Voyage, je récupère la liste des pays puis pour chaque pays je récupère le continent. Pour cela j'ai créé une méthode dans la classe ContinentTable (est-ce correct ou y a-t-il plus simple?):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    foreach($paysList->execute() as $pays)
    {
    	$continents[] = Doctrine_Core::getTable('Continent')->getContinentByIdAndCulture($result->pays_id, 'fr');
    }
    Et voici ma méthode:

    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
     
    public function getContinentByIdAndCulture($id, $culture = 'es')
    {
    	$q = $this->createQuery('c')
    		->select('c.id, t.nom as nom')
    		->leftJoin('c.Translation t')
    		->andWhere('t.id = ?', $id)
    		->andWhere('t.lang = ?', $culture);
     
    	foreach($q->execute() as $c)
    	{
    		$continent = $c->nom;
    	}
     
    	return $continent;
    }
    Dans cette méthode si je ne spécifie pas d'alias au champ nom, je n'arrive pas à le récupérer. Est-ce normal??


    Cela fonctionne plus ou moins, mais je voudrai vraiment adopter les bonnes méthodes de travail liées à ce Framework.

    Mon autre problème est lié à la culture. Je n'arrive pas à récupérer la culture automatiquement? Dois-je la définir dans chaque contrôleur?


    Davance, merci à tous pour vos remarques et conseils.
    Hervé

  2. #2
    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
    Le 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
     
    continent:
       tableName: Continent
       actAs:
          I18n:
             fields: [nom]
       columns:
          nom:
             type: string(15)
             notnull: true 
     
     
    pays:
       tableName: Pays
       columns:
          continent_id:        
             type: integer
             notnull: true 
          sous_continent_id: integer(4)
          iso: string(2)
          nom:
             type: string(100)
             notnull: true
       relations:
          continent:           
             onDelete: CASCADE
             local: continent_id
             foreign: id
             foreignAlias: payss
    remis à ma sauce, plus claire, supprimé des données inutiles et le fonctionnement par défaut de Doctrine mis en place, notamment pour les champs id, auto générés.

    Juste un problème avec pays qui prend un s au singulier. La norme veut que, du côté n de la relation, on rajoute un s au nom du champs pour préciser qu'il retourne un doctrine_collection et non pas un doctrine_record. La solution serait d'utiliser nation (et nations) en lieu et place de pays et payss...

    La requête peut ce résumer à
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    	$q = $this->createQuery('c')
    		->select('c.id, c.nom');
    Avec ce système, doctrine retourne le nom qui correspond à la culture de l'utilisateur. Seul problème, il va y avoir une requête pour chaque recherche de nom. On peut donc contrer la chose par :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    	$q = $this->createQuery('c')
    		->select('c.id, c.nom')
                    ->leftJoin('c.translation t');
    a noter que le champ reste celui récupéré et défini sur la table c. C'est tous l'intérêt du i18n automatique, tu ne t'occupe pas de lui, il gère.

  3. #3
    Membre averti
    Inscrit en
    Novembre 2009
    Messages
    15
    Détails du profil
    Informations forums :
    Inscription : Novembre 2009
    Messages : 15
    Par défaut
    Merci pour ta réponse rapide!
    Je vais tester ca au plus vite et reviendrai poster mes remarques

  4. #4
    Membre averti
    Inscrit en
    Novembre 2009
    Messages
    15
    Détails du profil
    Informations forums :
    Inscription : Novembre 2009
    Messages : 15
    Par défaut
    Je reviens vers vous suite aux modifications proposées.

    Dans un 1er temps, j'ai modifié ma requête par celle proposée mais cela ne fonctionne pas. Il ne me récupère par la culture. Il doit me manquer une étape.

    Dans un 2e temps; j'ai modifié le schéma tel que proposé mais cela ne fonctionne pas non plus. Voici l'erreur retournée lors de la création des tables:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Invalid schema element named "I18n" at path "Continent"
    Pourriez-vous m'indiquer comment corriger mes erreurs?

    Merci beaucoup,
    Hervé

  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
    Pour que la requête fonctionne, il faut avoir précisé la culture de l'utilisateur dans l'objet user.

    Le message d'erreur signifie que le nom du champ défini dans le behavior i18n n'existe pas dans les columns de la base de donnée, une erreur de copie ? Ou peut-être faut-il des espaces autour du nom [ nom ], à la réflexion, c'est ainsi que je les écris en général.

  6. #6
    Membre averti
    Inscrit en
    Novembre 2009
    Messages
    15
    Détails du profil
    Informations forums :
    Inscription : Novembre 2009
    Messages : 15
    Par défaut
    Bonjour,

    Après un petit mois de "déconnexion" me revoilà dans le projet.
    La culture semble être ok car j'utilise également le helper I18n et cela fonctionne bien. Exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <?php echo __('About Jobeet') ?>
    Ou alors je comprends plus...

    Voici mon code qui je pense correspond à la définition de la culture de l'utilisateur au niveau de mon fichier action (apps\frontend\modules\album\actions\actions.class.php):
    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
    class albumActions extends sfActions
    {
      public function executeIndex(sfWebRequest $request)
      {
     
    		// Lors de la 1ere connexion, on défini la langue préférée
    		if (!$request->getParameter('sf_culture'))
    		{
    			if ($this->getUser()->isFirstRequest())
    			{
    				$culture = $request->getPreferredCulture(array('fr', 'en', 'es'));
    				$this->getUser()->setCulture($culture);
    				$this->getUser()->isFirstRequest(false);
    			}
    			else
    			{
    				$culture = $this->getUser()->getCulture();
    			}
     
    			$this->redirect('localized_homepage');
    		}
    Mais dans ce cas je ne le fais peut-etre pas au bon endroit. Je souhaiterai évidemment que cela soit enregistrer de manière globale pour mon site.

    Merci pour votre aide

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 1
    Dernier message: 25/08/2013, 01h02
  2. [2.x] Problème avec doctrine:database:create
    Par Jugurth dans le forum Symfony
    Réponses: 3
    Dernier message: 25/04/2012, 13h06
  3. [1.x] Problème de relation 1-1 avec Doctrine
    Par Niki59 dans le forum Symfony
    Réponses: 6
    Dernier message: 05/04/2011, 14h58
  4. [1.x] Problème avec doctrine:generate-admin
    Par climbo dans le forum Débuter
    Réponses: 5
    Dernier message: 24/02/2011, 10h04
  5. [ZF 1.7] problème avec doctrine + oracle sur zendframework
    Par cornnery dans le forum Zend_Db
    Réponses: 1
    Dernier message: 09/03/2009, 17h41

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