Search code examples
symfonydoctrine-ormtranslationbehaviora2lix-translation

How to retrieve translation of a "sub entity" using Symfony a2lix knp doctrine behaviors translatable


I'm new in symfo but I need to translate content of my site.

I'm using a2lix (last version) and KNP doctrine behaviors (Translatable).

Let's say that I have 2 entities (e.g. Articles and Categories).

As in the doc (https://github.com/KnpLabs/DoctrineBehaviors) for translations, I'm using 2 classes for Categories (Category and CategoryTranslation). To retrieve the translations, of my category, I'm using a query with the locale. I get the locale with Request $request ($locale = $request->getLocale();). Here is an example of my controller and the query in my repository.

Controller

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,
        ));
    }

Repository I'm trying to retrieve informations for the locale.

public function findAllByLocale($locale){

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

I don't know if it's a good practice but it works for me. I retrieve fr/en categories in my Twig template like so when I change the url :

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

My problem

For the translation of my article, I do the same. I have 3 properties - title - description - category (I'm using a2lix_translatedEntity (http://a2lix.fr/bundles/translation-form/#bundle-additional))

When I try to render a record of Article, I never retrieve the translation for my category Name but well for title and description.

I also read that (https://github.com/KnpLabs/DoctrineBehaviors#guess-the-current-locale) but I don't really understand. Is that a way to always pass locale ?

What am I doing wrong ?

I'm blocked and don't find any documentation to resolve my problem. Sorry for my english ;-)

Any help would be very appreciate. Many Thanks


Solution

  • KNP has its own way to guess the current locale, simply by accessing current request scope. The whole "passing locale" thing is useful if you want to pull records for specific locale.

    Now, for your category translation. Since you did not include your entities, I will try to show you some examples to access your translations.

    In your Category entity, lets say you have a property name that would return your category name. Then you can define a simple helper method that would return that name, by current locale:

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

    So, what have we done here?

    1. $this->translate()->getName() - this line looks for your translation entity (in this case that would be CategoryTranslation) and invokes method getName() . Then, we either return translated category name, or an empty string if no translation has been added.

    And lastly, this is how you can access your category name in your twig template:

    Since we defined our helper method, there is no longer any need to access .translations in your template. You can simply call:

    {{ category.name }}
    

    Hope you got the idea.