-
-
Save istvankis/0010cf0e318258146d4f203007aaf1e2 to your computer and use it in GitHub Desktop.
AppBundle\Entity\Lang: | |
lang_0: | |
lang: | |
en: French | |
fr: Français | |
lang_1: | |
lang: | |
en: English | |
fr: Anglais |
alice.processor.translatable: | |
class: AppBundle\DataFixtures\Processor\TranslatableProcessor | |
arguments: | |
- '@doctrine.orm.entity_manager' | |
- '@gedmo.listener.translatable' | |
tags: [ { name: hautelook_alice.alice.processor } ] |
<?php | |
namespace AppBundle\DataFixtures\Processor; | |
use Doctrine\ORM\EntityManager; | |
use Gedmo\Tool\Wrapper\AbstractWrapper; | |
use Gedmo\Translatable\Translatable; | |
use Gedmo\Translatable\TranslatableListener; | |
use Nelmio\Alice\ProcessorInterface; | |
class TranslatableProcessor implements ProcessorInterface | |
{ | |
/** | |
* @var EntityManager | |
*/ | |
private $entityManager; | |
/** | |
* @var TranslatableListener | |
*/ | |
private $translatableListener; | |
/** | |
* @var Translatable | |
*/ | |
private $translateRepository; | |
/** | |
* TranslatableProcessor constructor. | |
* @param EntityManager $entityManager | |
* @param TranslatableListener $translatableListener | |
*/ | |
public function __construct(EntityManager $entityManager, TranslatableListener $translatableListener) | |
{ | |
$this->entityManager = $entityManager; | |
$this->translatableListener = $translatableListener; | |
$this->translateRepository = $entityManager->getRepository("Gedmo\\Translatable\\Entity\\Translation"); | |
} | |
public function postProcess($object) | |
{ | |
} | |
public function preProcess($object) | |
{ | |
$translationConfig = $this->translatableListener | |
->getConfiguration($this->entityManager, get_class($object)); | |
if ($translationConfig && isset($translationConfig['fields'])) { | |
foreach ($translationConfig['fields'] as $field) { | |
$wrapped = AbstractWrapper::wrap($object, $this->entityManager); | |
$propertyValue = $wrapped->getPropertyValue($field); | |
if (is_array($propertyValue)) { | |
$wrapped->setPropertyValue($field, $propertyValue[$translationConfig['fallback'][$field]]); | |
foreach ($propertyValue as $local => $content) { | |
$this->translateRepository->translate($object, $field, $local, $content); | |
} | |
} | |
} | |
} | |
} | |
} |
Hi,
I am using API Platform with Symfony 4 and try to make fixtures. I use DoctrineExtensionsBundle to use Translatable.
When I do bin/console hautelook:fixtures:load
, my fixtures are created but the translations are not inserted in the ext_translations
table.
I tried to use the TranslatableProcessor proposed here, but it doesn't work. Here's my entity:
<?php
namespace App\Entity;
use Doctrine\ORM\Mapping as ORM;
use ApiPlatform\Core\Annotation\ApiResource;
use Symfony\Component\Serializer\Annotation\Groups;
use Gedmo\Mapping\Annotation as Gedmo;
use Gedmo\Translatable\Translatable;
/**
* @ApiResource(
* denormalizationContext={"groups"={"cloth"}},
* collectionOperations={
* "get"={"path"="/clothes"},
* "post"={"path"="/clothes"}
* },
* itemOperations={
* "get"={"path"="/clothes/{id}", "requirements"={"id"="\d+"}},
* "put"={"path"="/clothes/{id}", "requirements"={"id"="\d+"}},
* "delete"={"path"="/clothes/{id}", "requirements"={"id"="\d+"}}
* }
* )
* @ORM\Entity
* @ORM\Table(name="clothes")
*/
class Cloth implements Translatable
{
/**
* @ORM\Id
* @ORM\Column(type="integer", options={"check":"CONSTRAINT positive_cloth_id CHECK (id > 0)"})
* @ORM\GeneratedValue
*/
private $id;
/**
* @ORM\ManyToOne(targetEntity="Brand", inversedBy="clothes", cascade={"persist"})
* @ORM\JoinColumn(nullable=false)
* @Groups({"cloth"})
*/
public $brand;
/**
* @ORM\Column(type="string", length=40)
* @Groups({"cloth", "read_brand"})
* @Gedmo\Translatable
*/
public $name;
public function getId(): ?int
{
return $this->id;
}
}
And my fixtures file (if I remove the fr
keys and put the values for name
, the insertions work but my table ext_translations
remains empty):
App\Entity\Cloth:
coat:
name:
fr: Manteau croisé bleu
brand: '@suitsupply'
trousers:
name:
fr: Pantalon taille haute à pinces
brand: '@scavini'
knit:
name:
fr: Pull torsadé gris
brand: '@hircus'
I see Notice: Array to string conversion
when I do bin/console hautelook:fixtures:load
with the file. In the previous answer, you say to remove the type hinting, but I don't understand where I must remove it.
Thanks for your answer.
Hi,
Have a look on this https://gist.github.com/pitpit/ce6df260fea08e61a6e5c5e7cb668d59 for a way that does not require any code
Thank you @romain-pierre, removing the type hinting did the trick !