symfony - Cómo imprimir datos traducibles en sonata admin con DoctrineBehaviors desde kpnlabs
translation sonata-admin (2)
Solo estoy buscando la forma correcta de usar DoctrineBehaviors por knplabs.
Ya he renderizado un formulario en el paquete de administración de sonata con la ayuda de este paquete: https://github.com/a2lix/TranslationFormBundle
Ahora, quiero tener mi campo traducido en la lista de administración.
En este momento, es trabajar con este método:
/**
* @ORM/Entity
* @ORM/Table(name="sport")
*/
class Sport
{
...
public function getNom(){
return $this->translate()->getNom();
}
}
Es un trabajo pero, tengo que reasignar todo el campo traducido en la entidad original. Estoy bastante seguro de que me falta algo, especialmente con la magia de las traducciones proxy.
ACTUALIZAR:
class Sport
{
use /Knp/DoctrineBehaviors/Model/Translatable/Translatable;
public function __call($method, $arguments)
{
return $this->proxyCurrentLocaleTranslation($method, $arguments);
}
/**
* @ORM/Column(type="integer")
* @ORM/Id
* @ORM/GeneratedValue(strategy="AUTO")
*/
private $id;
// Need this method for the admin list template
public function getNom(){
return $this->translate()->getNom();
}
// Work even the precedent method not here, the proxy call work fine.
public function __toString(){
return $this->getNom();
}
}
class SportTranslation
{
use ORMBehaviors/Translatable/Translation;
/**
* @ORM/Column(type="string", length=255)
*/
protected $nom;
/**
* @return string
*/
public function getNom()
{
return $this->nom;
}
/**
* @param string
* @return null
*/
public function setNom($nom)
{
$this->nom = $nom;
}
}
Gracias por su rápida respuesta @nifr! El método proxy funciona en un controlador (probé el __toString Method of sport, funciona bien).
Pero el problema aparentemente proviene del paquete de administración de sonata, reviso el código de la plantilla, no sé por qué no funciona.
Mantendré el método feo hasta que encuentre una mejor solución.
En este momento, es la única forma de imprimir valor en la plantilla de la lista de administración.
Si encuentro algo mejor, actualizaré esta publicación.
Cómo usar Knp / DoctrineBehaviors magic proxy translations
Dado que tiene MyClass
y MyClassTranslation
siguiendo la convención de nomenclatura (clase de traducción con el sufijo Translation ).
Solo las propiedades que no necesitan ser traducidas viven en MyClass
y todas las propiedades traducibles viven en MyClassTranslation
.
Digamos que la propiedad traducible será description
.
MyClass.php
Atención : ni description
propiedad ni getters / setters para la description
en MyClass
... ¡de lo contrario __call()
no se invocará correctamente!
class MyClass
{
use /Knp/DoctrineBehaviors/Model/Translatable/Translatable;
public function __call($method, $arguments)
{
return $this->proxyCurrentLocaleTranslation($method, $arguments);
}
protected $nonTranslatableProperty;
// ...
MyClassTranslation.php
use Doctrine/ORM/Mapping as ORM;
class MyClassTranslation
{
use /Knp/DoctrineBehaviors/Model/Translatable/Translation;
/**
* @var string
*/
protected $description;
/**
* @return string
*/
public function getDescription()
{
return $this->description;
}
/**
* @param string $description
*
* @return MyClassTranslation
*/
public function setDescription($description)
{
$this->description = $description;
return $this;
}
Ahora llamando a MyClass::getDescription()
invocará el método mágico __call()
que devolverá la traducción usando la configuración regional actual porque no hay getDescription()
método getDescription()
en MyClass
.
Solución:
Debería eliminar todos los getters / setters / propiedades SportTranslation
presentes en SportTranslation
de su clase Sport
y en su lugar agregar el __call()
mágico __call()
.
En este momento, es la única forma de imprimir valor en la plantilla de la lista de administración.
Si desea todas las traducciones, simplemente puede agregar en su clase de deporte admin:
protected function configureListFields(ListMapper $listMapper)
{
$listMapper
->addIdentifier(''translations'')
}
De esta forma, el resultado dependerá de la función __toString de la clase SportTranslation.
De lo contrario, si desea imprimir la traducción actual, supongo que debe usar una plantilla personalizada. Por ejemplo, eliminaré el método getNom en Sport.
Luego, en tu clase de deporte administrativo:
protected function configureListFields(ListMapper $listMapper)
{
$listMapper
->addIdentifier(''translations'', null, array(
''template'' => ''YourAdminBundle:CRUD:translatable.html.twig''
));
}
En tu plantilla
{% extends ''SonataAdminBundle:CRUD:base_list_field.html.twig'' %}
{% block field%}
{{ object }}
{% endblock %}
De esa forma llamará al __toString de su Clase deportiva y funciona sin el método getNom.
Desafortunadamente, no corrige mi problema con el tuyo: Cómo ordenar datos traducibles en el administrador de sonata usando el comportamiento doctrinal de knplabs