El paquete proporciona un rasgo para las clases de administración y un rasgo para las entidades. Juntos, añaden los campos y las acciones necesarias para la gestión de varias variantes lingüísticas.
Los locales provienen de los sitios Sonata Page. La administración entonces muestra las variantes disponibles y permite enlazar los registros de un mismo grupo de traducción.
Pantallas
- Edición de una traducción en el sitio seleccionado

- Lista de contenidos en la localidad seleccionada

- Creación de una traducción desde la variante actual

Ejemplo de implementación para una clase admin simple
Archivo de entidad
<?php
namespace App\Entity;
use App\Repository\SimpleTestRepository;
use Doctrine\ORM\Mapping as ORM;
use Partitech\SonataExtra\Traits\EntityTranslationTrait;
#[ORM\Entity(repositoryClass: SimpleTestRepository::class)]
class SimpleTest
{
use EntityTranslationTrait;
#[ORM\Id]
#[ORM\GeneratedValue]
#[ORM\Column]
private ?int $id = null;
// ...
}
Archivo admin
<?php
declare(strict_types=1);
namespace App\Admin;
use Partitech\SonataExtra\Attribute\AsAdmin;
use Sonata\AdminBundle\Admin\AbstractAdmin;
use Sonata\AdminBundle\Admin\AdminInterface;
use Sonata\AdminBundle\Datagrid\DatagridMapper;
use Sonata\AdminBundle\Datagrid\ListMapper;
use Sonata\AdminBundle\Form\FormMapper;
use Sonata\AdminBundle\Show\ShowMapper;
use Partitech\SonataExtra\Controller\Admin\TranslationController;
use Partitech\SonataExtra\Traits\AdminTranslationTrait;
#[AsAdmin(
manager_type: 'orm',
label: 'Simple Entity',
model_class: \App\Entity\SimpleTest::class,
)]
final class SimpleTestAdmin extends AbstractAdmin
{
use AdminTranslationTrait;
// ...
}
Solo hay que añadir los rasgos a las clases admin y entidad. Luego, ejecute los siguientes comandos:
bin/console doctrine:schema:update --force
bin/console cache:clear
Si ya tiene un controlador, simplemente agregue el rasgo de controlador
class MenuController extends Controller
{
use \Partitech\SonataExtra\Traits\ControllerTranslationTrait;
}
También puede llamar a la acción de creación de traducción usando el controlador extendido como servicio
use \Partitech\SonataExtra\Controller\Admin\TranslationController;
class MenuController extends Controller
{
use \Partitech\SonataExtra\Traits\ControllerTranslationTrait;
private $TranslationController;
#[Required]
public function autowireDependencies(
TranslationController $TranslationController
): void {
$this->TranslationController = $TranslationController;
}
public function createTranslationAction($id, $from_site, $to_site, $fqcn): Response
{
return $this->TranslationController->createTranslationAction($id, $from_site, $to_site, $fqcn);
}
}
Configuración del administrador
El trait tiene su propia configuración. Si tienes un método de configuración en tu administrador, simplemente asegúrate de llamar a la configuración del trait de la siguiente manera:
#[AsAdmin(
manager_type: 'orm',
group: 'Admin',
label: 'Test',
model_class: \App\Entity\Test::class
)]
final class TestAdmin extends AbstractAdmin
{
use AdminTranslationTrait;
protected function configure(): void
{
$this->configureTrait();
$this->setTemplate('edit', '@PartitechSonataMenu/CRUD/edit.html.twig');
}
}
Configuración de la ruta del administrador
El rasgo añade su propia ruta para crear traducciones. Si los usuarios también agregan rutas, deben configurar sus rutas de la siguiente manera:
#[AsAdmin(
manager_type: 'orm',
group: 'Admin',
label: 'Test',
model_class: \App\Entity\Test::class
)]
final class TestAdmin extends AbstractAdmin
{
use AdminTranslationTrait;
protected function configureRoutes(RouteCollectionInterface $collection): void
{
$this->configureTraitRoutes($collection);
$collection->remove('show');
}
// ...
}
La llamada a configureTraitRoutes() agrega las rutas necesarias antes de la configuración de tus propias rutas. Esto solo es necesario si configureRoutes está implementado en la clase admin.
Compatibilidad de la traducción automática
La funcionalidad multilingüe es compatible con nuestra herramienta de traducción automática a través de la «API de traducción» (ver servicio_inteligente.md).
Agregue el atributo #[Translatable] para hacer que un campo sea elegible para la traducción automática a través de la API, utilizando el proveedor de la aplicación (ver servicio_inteligente.md).
use Partitech\SonataExtra\Attribute\Translatable;
#[ORM\Column(type: 'text', nullable: true)]
#[Translatable]
private ?string $description=null;
// ...
Esta funcionalidad es compatible con las relaciones OneToMany. En este caso, agregue la anotación tanto en la relación de la entidad como en los campos de la entidad relacionada.
Durante una traducción, el objeto se clona primero y luego se traduce. La clonación automática es adecuada para un objeto simple; para una entidad compleja, implemente explícitamente el método __clone(). La estructura del menú no se puede clonar sin una función de clonación interna.
Acerca de los campos slug
Como el slug debe ser único, durante el proceso de clonación, el proceso busca un método $object->getSlug(). Si el método existe, el proceso verifica si el término ha sido traducido o no. Si el término es el mismo, antepondrá la valor con su localización.
if (method_exists($clonedObject, 'setSlug') && $clonedObject->getSlug()==$object->getSlug()) {
$slugger = new AsciiSlugger();
$slug=$slugger->slug($this->site->getLocale().'-'.$clonedObject->getSlug())->lower();
$clonedObject->setSlug($slug);
}
Integración multilingüe de la clasificación Sonata
Para conservar la información de traducción de SonataClassificationTag y SonataClassificationCategory, use las clases de administración proporcionadas por Sonata Extra.
En la configuración sonata_classification.yaml, mantenga su configuración como sigue:
sonata_classification:
class:
category: App\Entity\SonataClassificationCategory
collection: App\Entity\SonataClassificationCollection
context: App\Entity\SonataClassificationContext
tag: App\Entity\SonataClassificationTag
En su entidad, asegúrese de agregar el trait:
- EtiquetaDeClasificaciónSonata.php
<?php
declare(strict_types=1);
namespace App\Entity;
use Doctrine\ORM\Mapping as ORM;
use Doctrine\DBAL\Types\Types;
use App\Repository\SonataClassificationTagRepository;
use Sonata\ClassificationBundle\Entity\BaseTag;
use Partitech\SonataExtra\Traits\EntityTranslationTrait;
#[ORM\Entity(repositoryClass: SonataClassificationTagRepository::class)]
#[ORM\Table(name: 'classification__tag')]
#[ORM\HasLifecycleCallbacks]
class SonataClassificationTag extends BaseTag
{
use EntityTranslationTrait;
#[ORM\Id]
#[ORM\Column(type: Types::INTEGER)]
#[ORM\GeneratedValue]
protected ?int $id = null;
public function getId(): ?int
{
return $this->id;
}
}
- CategoriaDeClasificacionSonata.php
<?php
namespace App\Entity;
use Doctrine\DBAL\Types\Types;
use Doctrine\ORM\Mapping as ORM;
use Sonata\ClassificationBundle\Entity\BaseCategory;
use Partitech\SonataExtra\Traits\EntityTranslationTrait;
#[ORM\Entity]
#[ORM\Table(name: 'classification__category')]
class SonataClassificationCategory extends BaseCategory
{
use EntityTranslationTrait;
#[ORM\Id]
#[ORM\Column(type: Types::INTEGER)]
#[ORM\GeneratedValue]
protected ?int $id = null;
public function getId(): ?int
{
return $this->id;
}
}
Utilice las clases admin de etiquetas y categorías proporcionadas por Sonata Extra. NO UTILICE la etiqueta y la categoría admin del paquete sonataClassification. No tendrán los campos de seguimiento necesarios para el multilingüe.
- sonata_admin.yaml
cms:
icon: fa fa-pencil
label: CMS
keep_open: true
items:
- Partitech\SonataExtra\Admin\ArticleAdmin
- sonata.page.admin.page
- sonata.page.admin.shared_block
- Partitech\SonataExtra\Admin\SliderAdmin
- Partitech\SonataExtra\Admin\FaqCategoryAdmin
- Partitech\SonataExtra\Admin\TagAdmin
- Partitech\SonataExtra\Admin\CategoryAdmin
Punto de control
Antes de agregar una traducción, verifique que los sitios Sonata Page tengan las configuraciones regionales esperadas y que solo una entrada del grupo esté definida como versión por defecto. Luego pruebe la creación, edición y navegación entre variantes con un usuario con permisos limitados.