Foros del Web » Programando para Internet » PHP » Symfony »

[SOLUCIONADO] Traducciones en la BD con Stof Doctrine Extension

Estas en el tema de Traducciones en la BD con Stof Doctrine Extension en el foro de Symfony en Foros del Web. Hola Gente, Acudo ya desesperando despues de mirar mil sitios a ver si a alguien le ha pasado o sabe la solucion a un problema ...
  #1 (permalink)  
Antiguo 22/11/2013, 11:32
 
Fecha de Ingreso: septiembre-2009
Ubicación: Madrid
Mensajes: 25
Antigüedad: 15 años, 3 meses
Puntos: 0
Traducciones en la BD con Stof Doctrine Extension

Hola Gente,

Acudo ya desesperando despues de mirar mil sitios a ver si a alguien le ha pasado o sabe la solucion a un problema muy estupido.

La inserccion y el guardado de la traducciones me las hace perfectamente. El caso es que cuando obtengo el objeto mediante un find quiero que este venga traducido automaticamente (Se que poniendo un refresh seteando el locale funcionaria) pero no se puede hacer esto automaticamente???

Tengo lo siguiente (Entidad/Documento)

Código PHP:
<?php

namespace MGDExampleBundleDocument
;

use 
DoctrineODMMongoDBMappingAnnotations as ODM;
use 
GedmoMappingAnnotation as Gedmo;
use 
GedmoTranslatableTranslatable;

/**
 * MGD\ExampleBundle\Document\Student
 *
 * @ODM\Document
 * @ODM\ChangeTrackingPolicy("DEFERRED_IMPLICIT")
 */
class Student implements Translatable
{
    
/**
     * @var id $id
     *
     * @ODM\Id(strategy="AUTO")
     */
    
protected $id;

    
/**
     * @var string $name
     *
     * @Gedmo\Translatable
     * @ODM\Field(name="name", type="string")
     */
    
protected $name;

    
/**
     * @var timestamp $birth_date
     *
     * @ODM\Field(name="birth_date", type="timestamp")
     */
    
protected $birth_date;

    
/**
     * @var string $nationality
     *
     * @Gedmo\Translatable
     * @ODM\String
     */
    
protected $nationality;

    
/**
     * Get id
     *
     * @return id $id
     */
    
public function getId()
    {
        return 
$this->id;
    }

    
/**
     * Set name
     *
     * @param string $name
     * @return self
     */
    
public function setName($name)
    {
        
$this->name $name;
        return 
$this;
    }

    
/**
     * Get name
     *
     * @return string $name
     */
    
public function getName()
    {
        return 
$this->name;
    }

    
/**
     * Set birthDate
     *
     * @param timestamp $birthDate
     * @return self
     */
    
public function setBirthDate($birthDate)
    {
        
$this->birth_date $birthDate;
        return 
$this;
    }

    
/**
     * Get birthDate
     *
     * @return timestamp $birthDate
     */
    
public function getBirthDate()
    {
        return 
$this->birth_date;
    }

    
/**
     * Set nationality
     *
     * @param string $nationality
     * @return self
     */
    
public function setNationality($nationality)
    {
        
$this->nationality $nationality;
        return 
$this;
    }

    
/**
     * Get nationality
     *
     * @return string $nationality
     */
    
public function getNationality()
    {
        return 
$this->nationality;
    }

}
He creado un DataFixtures para probar el uso

Código PHP:
<?php

namespace MGDExampleBundleDataFixtures
;

use 
DoctrineCommonDataFixturesFixtureInterface;
use 
DoctrineCommonPersistenceObjectManager;
use 
MGDExampleBundleDocumentStudent;


class 
StudentData implements FixtureInterface
{
    public function 
load(ObjectManager $manager)
    {
        
$student= new Student();

        
$student
            
->setName("Mikel")
            ->
setNationality("English Default")
            ->
setLocale('en')
        ;

        
$manager->persist($student);
        
$manager->flush();

        
$student
            
->setName("Miguel")
            ->
setNationality("Español")
            ->
setLocale('es')
        ;

        
$manager->persist($student);
        
$manager->flush();

        
$student
            
->setName("EaterFrankFurT")
            ->
setNationality("German1en")
            ->
setLocale('de')
        ;

        
$manager->persist($student);
        
$manager->flush();

        
// Or you can use this

        
$repository $manager->getRepository('Gedmo\\Translatable\\Document\\Translation');
        
$student= new Student();

        
$repository
            
->translate($student,'name''es','Pechitos es')
            ->
translate($student,'name''de','DrugenFength de')
            ->
translate($student,'name''en','Nationality en')

            ->
translate($student,'nationality''es','nationality es')
            ->
translate($student,'nationality''de','nationality de')
            ->
translate($student,'nationality''en','nationality en')
        ;

        
$manager->persist($student);
        
$manager->flush();


    }
}


Código PHP:
class DefaultController extends Controller
{
    
/**
     * @Route("/hello/{name}")
     * @Template()
     */
    
public function indexAction($name)
    {
        
/** @var Request $request */
        
$request $this->container->get('request');
        
$request->setLocale('de');

        
/** @var Student $studentReturned */
        
$manager $this->get('doctrine_mongodb')->getManager();
        
$studentReturned=$manager->getRepository("MGDExampleBundle:Student")->find("528f8156d82fcc5425000008");

        
/* Opción que no querria usar

        $studentReturned->setLocale($request->getLocale());
        $manager->refresh($studentReturned);*/

        
$translations=null;

        return array(
'translations' => $translations'student' => $studentReturned );
    }

Un Saludo
  #2 (permalink)  
Antiguo 22/11/2013, 17:57
Avatar de masterpuppet
Software Craftsman
 
Fecha de Ingreso: enero-2008
Ubicación: Montevideo, Uruguay
Mensajes: 3.550
Antigüedad: 16 años, 11 meses
Puntos: 845
Respuesta: Traducciones en la BD con Stof Doctrine Extension

Configuraste la extensión como sugiere su documentación ?

https://github.com/l3pp4rd/DoctrineE...tener-services
__________________
http://es.phptherightway.com/
thats us riders :)
  #3 (permalink)  
Antiguo 22/11/2013, 19:00
 
Fecha de Ingreso: septiembre-2009
Ubicación: Madrid
Mensajes: 25
Antigüedad: 15 años, 3 meses
Puntos: 0
Respuesta: Traducciones en la BD con Stof Doctrine Extension

Le he tenido que agregar un listener para variable de session local que por lo que sea no basta con poner

Código PHP:
$request->getSession()->set('_locale''en');
$request->setLocale('en'); 
este es el listener de idioma que he tenido que crear

Código PHP:
use SymfonyComponentHttpKernelEventGetResponseEvent;
use 
SymfonyComponentHttpKernelKernelEvents;
use 
SymfonyComponentEventDispatcherEventSubscriberInterface;

class 
LocaleListener implements EventSubscriberInterface
{
    private 
$defaultLocale;

    public function 
__construct($defaultLocale 'es')
    {
        
$this->defaultLocale $defaultLocale;
    }

    public function 
onKernelRequest(GetResponseEvent $event)
    {

        
$request $event->getRequest();
        if (!
$request->hasPreviousSession()) {
            return;
        }

        if (
$locale $request->attributes->get('_locale')) {

            
$request->getSession()->set('_locale'$locale);
        } else {
            
$request->setLocale($request->getSession()->get('_locale'$this->defaultLocale));
        }
    }

    public static function 
getSubscribedEvents()
    {
        return array(
            
KernelEvents::REQUEST => array(array('onKernelRequest'17)),
        );
    }

Servicios

Código PHP:
<?xml version="1.0" ?>

<container xmlns="http://symfony.com/schema/dic/services"
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
           xsi:schemaLocation="http://symfony.com/schema/dic/services http://symfony.com/schema/dic/services/services-1.0.xsd">

    <services>
        <service id="example.locale_listener"
                 class="MGD\ExampleBundle\Listener\LocaleListener">
            <argument>%kernel.default_locale%</argument>
            <tag name="kernel.event_subscriber" />
        </service>

    </services>

</container>
Parece ser que es necesario crear este listener para que el bundle pille el idioma

Etiquetas: bd, doctrine, extension
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 21:45.