-
Notifications
You must be signed in to change notification settings - Fork 5
/
PanelHandler.php
76 lines (59 loc) · 2.28 KB
/
PanelHandler.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
<?php
declare(strict_types=1);
namespace Umanit\BlockBundle\TranslationHandler;
use Doctrine\Common\Collections\ArrayCollection;
use Doctrine\ORM\EntityManagerInterface;
use Umanit\BlockBundle\Entity\Panel;
use Umanit\BlockBundle\Model\BlockInterface;
use Umanit\TranslationBundle\Translation\Args\TranslationArgs;
use Umanit\TranslationBundle\Translation\EntityTranslator;
use Umanit\TranslationBundle\Translation\Handlers\TranslationHandlerInterface;
class PanelHandler implements TranslationHandlerInterface
{
/** @var EntityTranslator */
private $translator;
/** @var EntityManagerInterface */
private $em;
public function __construct(EntityTranslator $translator, EntityManagerInterface $em)
{
$this->translator = $translator;
$this->em = $em;
}
public function supports(TranslationArgs $args): bool
{
return $args->getDataToBeTranslated() instanceof Panel;
}
public function handleSharedAmongstTranslations(TranslationArgs $args)
{
// @fixme: should return something else.
return new Panel();
}
public function handleEmptyOnTranslate(TranslationArgs $args)
{
return new Panel();
}
public function translate(TranslationArgs $args)
{
/** @var Panel $source */
$source = $args->getDataToBeTranslated();
$translation = clone $source;
$newBlocks = new ArrayCollection();
// Clone all blocks into new entity
foreach ($source->getBlocks() as $sourceBlock) {
/** @var BlockInterface $translatedBlock */
// Temporary sets the panel as null to avoid infinite loop
$sourceBlock->setPanel(null);
$subTranslationArgs =
(new TranslationArgs($sourceBlock, $args->getSourceLocale(), $args->getTargetLocale()))
->setTranslatedParent($translation);
$translatedBlock = $this->translator->processTranslation($subTranslationArgs);
$translatedBlock->setPanel($translation);
// Re-set the panel of the source block
$sourceBlock->setPanel($source);
$newBlocks->add($translatedBlock);
$this->em->persist($translatedBlock);
}
$translation->setBlocks($newBlocks);
return $translation;
}
}