Il bundle fornisce un trait per le classi admin e un trait per le entità. Insieme, aggiungono i campi e le azioni necessari per la gestione di più varianti linguistiche.
Le locali provengono dai siti Sonata Page. L'amministrazione mostra quindi le varianti disponibili e consente di collegare le registrazioni di uno stesso gruppo di traduzione.
Schermi
- Edizione di una traduzione nel sito selezionato

- Elenco dei contenuti nella locale selezionata

- Creazione di una traduzione dalla variante corrente

Esempio di implementazione per una classe admin semplice
File di entità
<?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;
// ...
}
File 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;
// ...
}
Basta aggiungere i trait alle classi admin ed entità. Poi, esegui i seguenti comandi:
bin/console doctrine:schema:update --force
bin/console cache:clear
Se avete già un controller, aggiungete semplicemente il tratto del controller
class MenuController extends Controller
{
use \Partitech\SonataExtra\Traits\ControllerTranslationTrait;
}
Puoi anche chiamare l'azione di creazione della traduzione utilizzando il controller esteso come servizio
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);
}
}
Configurazione dell'amministratore Il trait ha la propria configurazione. Se avete un metodo di configurazione nel vostro amministratore, assicuratevi semplicemente di chiamare la configurazione del trait come segue:
#[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');
}
}
Configurazione della rotta amministratore
Il trait aggiunge la propria rotta per creare traduzioni. Se gli utenti aggiungono anche delle rotte, devono configurare le loro rotte come segue:
#[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');
}
// ...
}
L'appello a configureTraitRoutes() aggiungi le rotte necessarie prima della configurazione delle tue rotte. Questo è necessario solo se configureRoutes è implementato nella classe admin.
Compatibilità della traduzione automatica
La funzionalità multilingue è compatibile con il nostro strumento di traduzione automatica tramite l'«API di traduzione» (vedi servizio_intelligente.md).
Aggiungi l'attributo #[Translatable] per rendere un campo idoneo alla traduzione automatica tramite l'API, utilizzando il fornitore dell'applicazione (vedi servizio_intelligente.md).
use Partitech\SonataExtra\Attribute\Translatable;
#[ORM\Column(type: 'text', nullable: true)]
#[Translatable]
private ?string $description=null;
// ...
Questa funzionalità è compatibile con le relazioni OneToMany. In questo caso, aggiungi l'annotazione sia sulla relazione dell'entità sia sui campi dell'entità collegata.
Durante una traduzione, l'oggetto viene prima clonato, poi tradotto. Il clonaggio automatico è adatto a un oggetto semplice; per un'entità complessa, implementare esplicitamente il metodo __clone(). La struttura ad albero del menu non può essere clonata senza una funzione di clonazione interna.
A proposito dei campi slug Come lo slug deve essere unico, durante il processo di clonazione, il processo cerca un metodo $object->getSlug(). Se il metodo esiste, il processo verifica se il termine è stato tradotto o meno. Se il termine è lo stesso, prefisserà il valore con la sua locale.
if (method_exists($clonedObject, 'setSlug') && $clonedObject->getSlug()==$object->getSlug()) {
$slugger = new AsciiSlugger();
$slug=$slugger->slug($this->site->getLocale().'-'.$clonedObject->getSlug())->lower();
$clonedObject->setSlug($slug);
}
Integrazione multilingue della classificazione Sonata Per conservare le informazioni di traduzione di SonataClassificationTag e SonataClassificationCategory, utilizzate le classi admin fornite da Sonata Extra.
Nella configurazione sonata_classification.yaml, mantenete la vostra configurazione come segue:
sonata_classification:
class:
category: App\Entity\SonataClassificationCategory
collection: App\Entity\SonataClassificationCollection
context: App\Entity\SonataClassificationContext
tag: App\Entity\SonataClassificationTag
Nella vostra entità, assicuratevi di aggiungere il trait:
- SonataClassificationTag.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;
}
}
- CategoriaClassificazioneSonata.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;
}
}
Usa le classi admin di tag e categorie fornite da Sonata Extra. NON USARE l'admin di tag e categoria del pacchetto sonataClassification. Non avranno i campi di tracciamento necessari per il multilingue.
- 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
Posto di controllo
Prima di aggiungere una traduzione, verificate che i siti Sonata Page abbiano le localizzazioni previste e che una sola voce del gruppo sia impostata come versione predefinita. Testate poi la creazione, la modifica e la navigazione tra le varianti con un utente dai diritti limitati.