php symfony doctrine2 sonata-admin

php - sonata symfony



SonataAdminBundle con campos traducibles(extensiones de doctrina) (1)

Tu situación es bastante compleja. Probablemente lo mejor podría ser si no utiliza ninguna anotación, anula la clase de repositorio y crea toda su propia lógica.

Podemos intentar aprovechar la nueva capacidad desde Doctrine 2.1 de crear Composite Keys compuestas como clave principal, como dijo Feras en su comentario.

Doctrine 2 admite claves primarias compuestas de forma nativa. Las claves compuestas son un concepto de base de datos relacionales muy potente y nos aseguramos de que Doctrine 2 sea compatible con la mayoría de los casos de uso de claves primarias compuestas. Para Doctrine 2.0 se admiten claves compuestas de tipos de datos primitivos, para Doctrine 2.1 incluso claves externas como claves primarias.

En los documentos, tenemos un buen ejemplo para un caso de uso que es más o menos similar al suyo:

Atributos dinámicos de una entidad (por ejemplo, artículo). Cada artículo tiene muchos atributos con la clave principal "article_id" y "attribute_name".

Puede ver el ejemplo aquí: http://docs.doctrine-project.org/en/latest/tutorials/composite-primary-keys.html#use-case-1-dynamic-attributes

Pero como ese enfoque solo considera una entidad, debemos adaptarla a sus necesidades. Podemos seguir estos pasos:

  1. Cree un tipo de vistas de su tabla ext_translations

    CREATE VIEW profile_ext_translations AS SELECT * FROM ext_translations WHERE object_class = ''Profile''

  2. A continuación, cree entidades diferentes para esas vistas, por lo que tendría una entidad ProfileExtTranslations con una clave primaria compuesta, como se ProfileExtTranslations a continuación:

    ** * @Entity */ class ProfileExtTranslations { /** * @ORM/ManyToOne(targetEntity="Profile", inversedBy="translations") * @ORM/JoinColumn(name="foreign_key", referencedColumnName="id", onDelete="CASCADE")*/ private $profile; /** @Id @Column(type="string") */ private $field; //Other fields and methods }

  3. Y ahora, el código de la entidad de perfil, en el mapaPor las traducciones, solo usas:

    /** * @ORM/OneToMany(targetEntity="ProfileExtTranslation", mappedBy="profile", cascade={"persist", "remove"}) */ protected $translations;

Y con esto y probablemente un poco de ajuste, deberías tenerlo funcionando.

Tengo una tabla con todas las traducciones en una tabla "ext_translations".

La traducción funciona muy bien. El problema ahora es: quiero administrar esas traducciones a través del paquete sonata-admin.

Ya encontré una documentación, cómo obtener extensiones de doctrina de trabajo con el administrador de sonata. Pero en mi caso tengo UNA tabla / entidad para todas mis traducciones (para entidades múltiples).

De acuerdo con esta documentación: http://www.elao.com/blog/symfony-2/doctrine-2/how-to-manage-translations-for-your-object-using-sonataadminbundle.html ¿cuál debería ser mi mapa? atributo (ver abajo)?

tabla ext_translations:

mysql> show columns from ext_translations; +--------------+--------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +--------------+--------------+------+-----+---------+----------------+ | id | int(11) | NO | PRI | NULL | auto_increment | | locale | varchar(8) | NO | MUL | NULL | | | object_class | varchar(255) | NO | | NULL | | | field | varchar(32) | NO | | NULL | | | foreign_key | varchar(64) | NO | | NULL | | | content | longtext | YES | | NULL | | +--------------+--------------+------+-----+---------+----------------+

MappedBy:

/** * @ORM/OneToMany(targetEntity="ProfileTranslation", mappedBy="object", cascade={"persist", "remove"}) */ protected $translations;

Hasta donde he entendido el problema aquí: "Tengo una clave compuesta (clase de objeto (la entidad) + nombre (del atributo) + clave externa (identificación de la entidad)), entonces, ¿cómo debería hacer referencia el ''asignadosBy'' a esto?

No quiero crear una clase extra para cada entidad traducible (como en el tutorial de arriba)