This repository has been archived by the owner on Aug 13, 2022. It is now read-only.
/
EntityLifecycleListener.php
108 lines (90 loc) · 3.37 KB
/
EntityLifecycleListener.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
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
<?php
/**
* Content.
*
* @copyright Axel Guckelsberger (Zikula)
* @license http://www.gnu.org/licenses/lgpl.html GNU Lesser General Public License
* @author Axel Guckelsberger <info@ziku.la>.
*
* @see https://ziku.la
*
* @version Generated by ModuleStudio 1.5.0 (https://modulestudio.de).
*/
declare(strict_types=1);
namespace Zikula\ContentModule\Listener;
use Doctrine\Persistence\Event\LifecycleEventArgs;
use Zikula\ContentModule\Entity\Factory\EntityFactory;
use Zikula\ContentModule\Entity\PageEntity;
use Zikula\ContentModule\Helper\TranslatableHelper;
use Zikula\ContentModule\Listener\Base\AbstractEntityLifecycleListener;
/**
* Event subscriber implementation class for entity lifecycle events.
*/
class EntityLifecycleListener extends AbstractEntityLifecycleListener
{
public function postPersist(LifecycleEventArgs $args): void
{
$entity = $args->getObject();
if ($entity instanceof PageEntity) {
$this->fixTranslatedTreeSlugs($entity);
}
parent::postPersist($args);
}
public function postUpdate(LifecycleEventArgs $args): void
{
$entity = $args->getObject();
if ($entity instanceof PageEntity) {
$this->fixTranslatedTreeSlugs($entity);
}
parent::postUpdate($args);
}
/**
* Ugly but working fix for #309.
*/
private function fixTranslatedTreeSlugs(PageEntity $page): void
{
if (null === $page->getParent()) {
return;
}
$entityManager = $this->container->get(EntityFactory::class)->getEntityManager();
$connection = $entityManager->getConnection();
$translatableHelper = $this->container->get(TranslatableHelper::class);
$currentLocale = $translatableHelper->getCurrentLanguage();
$supportedLocales = $translatableHelper->getSupportedLanguages('page');
$parentSlugForCurrentLocale = $this->getTranslatedSlug($page->getParent()->getId(), $currentLocale);
foreach ($supportedLocales as $locale) {
if ($locale === $currentLocale) {
continue;
}
$parentSlugForLocale = $this->getTranslatedSlug($page->getParent()->getId(), $locale);
$slugForLocale = $this->getTranslatedSlug($page->getId(), $locale);
$slugForLocale = str_replace($parentSlugForCurrentLocale, $parentSlugForLocale, $slugForLocale);
$sql = '
UPDATE .`zikula_content_page_translation`
SET `content` = "' . $slugForLocale . '"
WHERE `foreign_key` = ' . $page->getId() . '
AND `field` = "slug"
AND `locale` = "' . $locale . '"
';
$stmt = $connection->prepare($sql);
$stmt->execute();
}
}
private function getTranslatedSlug(int $pageId, string $locale): string
{
$entityManager = $this->container->get(EntityFactory::class)->getEntityManager();
$connection = $entityManager->getConnection();
$slug = '';
$stmt = $connection->executeQuery('
SELECT `content`
FROM `zikula_content_page_translation`
WHERE `foreign_key` = ' . $pageId . '
AND `field` = "slug"
AND `locale` = "' . $locale . '"
');
while ($row = $stmt->fetch()) {
$slug = $row['content'];
}
return $slug;
}
}