ILIAS  trunk Revision v11.0_alpha-2638-g80c1d007f79
CachedRepository.php
Go to the documentation of this file.
1 <?php
2 
19 declare(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
while($session_entry=$r->fetchRow(ilDBConstants::FETCHMODE_ASSOC)) return null