2015-04-13 3 views
0

Je suis nouveau dans symfo mais j'ai besoin de traduire le contenu de mon site. J'utilise a2lix (dernière version) et les comportements de doctrine KNP (Translatable).Comment récupérer la traduction d'une "sous-entité" en utilisant Symfony a2lix knp doctrine comportements traduisibles

Disons que j'ai 2 entités (par exemple Articles et Catégories).

Comme dans le doc (https://github.com/KnpLabs/DoctrineBehaviors) pour les traductions, j'utilise 2 classes pour les catégories (Category et CategoryTranslation). Pour récupérer les traductions de ma catégorie, j'utilise une requête avec les paramètres régionaux. J'obtiens l'environnement local avec Request $ request ($ locale = $ request-> getLocale();). Voici un exemple de mon contrôleur et de la requête dans mon référentiel.

Contrôleur

public function indexAction(Request $request) 
    { 
     $em = $this->getDoctrine()->getManager(); 
     $locale = $request->getLocale(); 

     $entities = $em->getRepository('AcmeBundle:Category')->findAllByLocale($locale); 

     return $this->render('CTCArtworkBundle:Backend/Artwork:index.html.twig', array(
      'entities' => $entities, 
     )); 
    } 

dépôt Je suis en train de récupérer des informations pour les paramètres régionaux.

public function findAllByLocale($locale){ 

     return $this->createQueryBuilder('a') 
        ->join('a.translations', 'aTrans') 
        ->where('aTrans.locale = :locale') 
        ->setParameter("locale", $locale) 
        ->addSelect('aTrans') 
        ->getQuery() 
        ->getResult() 
     ;   
} 

Je ne sais pas si c'est une bonne pratique mais ça marche pour moi. Je récupère fr/en catégories dans mon modèle de Twig comme quand je change l'url:

<tr> 
    <th>Category</th> 
    <td>{{ category.translations|First.name }}</td> 
</tr> 

Mon problème

Pour la traduction de mon article, je fais la même chose. J'ai 3 propriétés - titre - Description - catégorie (J'utilise a2lix_translatedEntity (http://a2lix.fr/bundles/translation-form/#bundle-additional))

Lorsque je tente de rendre un dossier de l'article, je ne récupérerez pas la traduction de ma catégorie Nom, mais bien pour le titre et description.

J'ai aussi lu cela (https://github.com/KnpLabs/DoctrineBehaviors#guess-the-current-locale) mais je ne comprends pas vraiment. Est-ce un moyen de toujours passer les paramètres régionaux?

Qu'est-ce que je fais mal?

Je suis bloqué et ne trouve aucune documentation pour résoudre mon problème. Désolé pour mon anglais ;-)

Toute aide serait très appréciable. Merci

+0

regard sur [cette réponse] (http://stackoverflow.com/questions/29232860/how-to-access-translated-property-using-knp-labs -translatable-doctrine-behaviors/29233740 # 29233740) il pourrait être utile pour vous. –

+0

@gp_sflover, merci beaucoup, vous me sauvez aussi la vie. –

Répondre

1

KNP a sa propre façon de deviner les paramètres régionaux actuels, simplement en accédant à la portée de la demande actuelle. L'ensemble du "passage local" est utile si vous souhaitez extraire des enregistrements pour des paramètres régionaux spécifiques.

Maintenant, pour la traduction de votre catégorie. Puisque vous n'avez pas inclus vos entités, je vais essayer de vous montrer quelques exemples pour accéder à vos traductions.

Dans votre entité de catégorie, disons que vous avez une propriété nom qui renverrait le nom de votre catégorie. Ensuite, vous pouvez définir une méthode simple d'aide qui renverrait ce nom, selon le lieu actuel:

public function getName() { 
    if($name == $this->translate()->getName()) { 
     return $name; 
    } 

    return ''; 
} 

Alors, qu'avons-nous fait ici?

  1. $ this-> translate() -> getName() - cette ligne recherche votre entité de traduction (dans ce cas, ce serait CategoryTranslation) et méthode invoque getName(). Ensuite, soit nous retournons le nom de la catégorie traduite, soit une chaîne vide si aucune traduction n'a été ajoutée.

Et enfin, voici comment vous pouvez accéder à votre nom de la catégorie dans votre modèle brindille:

Depuis que nous avons défini notre méthode d'aide, il n'y a plus besoin d'accéder à .translations dans votre modèle. Vous pouvez simplement appeler:

{{ category.name }} 

J'espère que vous avez eu l'idée.

+0

merci beaucoup, vous me sauvez la vie. –

0

Et vous pouvez également utiliser cette

{{ category.translate.name }}