ILIAS  trunk Revision v11.0_alpha-3011-gc6b235a2e85
CachedRepository.php
Go to the documentation of this file.
1<?php
2
19declare(strict_types=1);
20
22
24{
25 private const OBJECT_TRANSLATIONS_TABLE = 'object_translation';
26 private const COPAGE_TRANSLATIONS_TABLE = 'obj_content_master_lng';
27
28 public static array $data_cache = [];
29
30 public function __construct(
31 private readonly \ilDBInterface $db
32 ) {
33 }
34
35 public function getFor(int $object_id): Translations
36 {
37 if (!isset(self::$data_cache[$object_id])) {
38 self::$data_cache[$object_id] = $this->buildDataForObjectId($object_id);
39 }
40
41 return self::$data_cache[$object_id];
42 }
43
44 private function buildDataForObjectId(int $object_id): Translations
45 {
46 if ($this->db->tableExists(self::COPAGE_TRANSLATIONS_TABLE)) {
47 return $this->buildDataForObjectIdForLegacySetup($object_id);
48 }
49
50 $result = $this->db->query(
51 'SELECT title, description, lang_code, lang_default, lang_base' . PHP_EOL
52 . 'FROM ' . self::OBJECT_TRANSLATIONS_TABLE . PHP_EOL
53 . 'WHERE obj_id = ' . $this->db->quote($object_id, 'integer') . PHP_EOL
54 );
55
56 $languages = [];
57 $default_language = '';
58 $base_language = null;
59 while ($row = $this->db->fetchAssoc($result)) {
60 $languages[$row['lang_code']] = new Language(
61 $row['lang_code'],
62 $row['title'] ?? '',
63 $row['description'] ?? '',
64 $row['lang_default'] === 1,
65 $row['lang_base'] === 1
66 );
67 if ($row['lang_default'] === 1) {
68 $default_language = $row['lang_code'];
69 }
70
71 if ($row['lang_base'] === 1) {
72 $base_language = $row['lang_code'];
73 }
74 }
75
76 return new Translations(
77 $object_id,
78 $languages,
79 $default_language,
80 $base_language
81 );
82 }
83
87 private function buildDataForObjectIdForLegacySetup(int $object_id): Translations
88 {
89 $master_lang = $this->db->fetchAssoc(
90 $this->db->query(
91 'SELECT obj_id, master_lang, fallback_lang' . PHP_EOL
92 . 'FROM ' . self::COPAGE_TRANSLATIONS_TABLE . PHP_EOL
93 . 'WHERE obj_id = ' . $this->db->quote($object_id, 'integer') . PHP_EOL
94 )
95 );
96
97 $result = $this->db->query(
98 'SELECT title, description, lang_code, lang_default' . PHP_EOL
99 . 'FROM ' . self::OBJECT_TRANSLATIONS_TABLE . PHP_EOL
100 . 'WHERE obj_id = ' . $this->db->quote($object_id, 'integer') . PHP_EOL
101 );
102
103 $languages = [];
104 $object_translation_default_language = '';
105 while ($row = $this->db->fetchAssoc($result)) {
106 $languages[$row['lang_code']] = new Language(
107 $row['lang_code'],
108 $row['title'] ?? '',
109 $row['description'] ?? '',
110 $row['lang_code'] === ($master_lang['fallback_lang'] ?? '')
111 || $row['lang_default'] === 1 && $this->determineDefaultLanguage($row['lang_code'], $master_lang) === $row['lang_code'],
112 isset($master_lang['master_lang']) && $master_lang['master_lang'] === $row['lang_code']
113 );
114 if ($row['lang_default'] === 1) {
115 $object_translation_default_language = $row['lang_code'];
116 }
117 }
118
119 return new Translations(
120 $object_id,
121 $languages,
122 $this->determineDefaultLanguage($object_translation_default_language, $master_lang),
123 $master_lang['master_lang'] ?? null,
124 true
125 );
126 }
127
131 private function determineDefaultLanguage(
132 string $object_translation_default_language,
133 ?array $base_lang
134 ): string {
135 if (empty($base_lang['fallback_lang'])) {
136 return $object_translation_default_language;
137 }
138 return $base_lang['fallback_lang'];
139 }
140
141 public function delete(int $obj_id): void
142 {
143 $this->db->manipulate(
144 'DELETE FROM ' . self::OBJECT_TRANSLATIONS_TABLE . PHP_EOL
145 . 'WHERE obj_id = ' . $this->db->quote($obj_id, 'integer')
146 );
147 }
148
149 public function store(
150 Translations $translations
151 ): Translations {
152 $this->delete($translations->getObjId());
153
154 if ($translations->getLanguages() === []) {
155 self::$data_cache[$translations->getObjId()] = $translations;
156 return $translations;
157 }
158
159 $values = array_reduce(
160 $translations->getLanguages(),
161 function (string $c, Language $v) use ($translations): string {
162 if ($c !== '') {
163 $c .= ',';
164 }
165
166 return "{$c}("
167 . $this->db->quote($translations->getObjId(), \ilDBConstants::T_INTEGER) . ','
168 . $this->db->quote($v->getTitle(), \ilDBConstants::T_TEXT) . ','
169 . $this->db->quote($v->getDescription(), \ilDBConstants::T_TEXT) . ','
170 . $this->db->quote($v->getLanguageCode(), \ilDBConstants::T_TEXT) . ','
171 . $this->db->quote($v->isDefault() ? 1 : 0, \ilDBConstants::T_INTEGER) . ','
172 . $this->db->quote($v->isBase() ? 1 : 0, \ilDBConstants::T_INTEGER)
173 . ')';
174 },
175 ''
176 );
177
178 $this->db->manipulate(
179 'INSERT INTO ' . self::OBJECT_TRANSLATIONS_TABLE . PHP_EOL
180 . '(obj_id, title, description, lang_code, lang_default, lang_base)' . PHP_EOL
181 . 'VALUES ' . $values
182 );
183
184 self::$data_cache[$translations->getObjId()] = $translations;
185 return $translations;
186 }
187}
determineDefaultLanguage(string $object_translation_default_language, ?array $base_lang)
Class handles translation mode for an object.
$c
Definition: deliver.php:25
Interface ilDBInterface.
if(!file_exists('../ilias.ini.php'))