dbXapp 2.0
RAD, CMS, Module und Runtime-IDE fuer dbXapp
Loading...
Searching...
No Matches
dbxConfig_dbxContent.class.php
Go to the documentation of this file.
1<?php
2namespace dbx\dbxAdmin;
3
4require_once dirname(__DIR__, 2) . '/dbxContent/include/dbxContentTranslate.class.php';
5
6use dbx\dbxContent\dbxContentTranslate;
7
9
10 private const LNG_FD = 'fd:dbxContent|config-lng';
11
12 private const TRANSLATE_KEYS = array(
13 'lng_translate_provider',
14 'lng_translate_api_key',
15 'lng_translate_api_url',
16 'lng_translate_model',
17 );
18
19 private function addLngFld($oForm, string $name): void {
20 $oForm->add_fld($name, 'fd::', 'fd::', 'fd::', 'fd::', 'fd::', 'fd::', 'fd::', 'fd::', 'fd::', self::LNG_FD);
21 }
22
26 private function buildFormData(): array {
27 $contentCfg = dbx()->get_config('dbxContent');
28 if (!is_array($contentCfg)) {
29 $contentCfg = array();
30 }
31
32 $data = array(
33 'lng_translate_provider' => strtolower(trim((string) ($contentCfg['lng_translate_provider'] ?? 'copy'))),
34 'lng_translate_api_key' => (string) ($contentCfg['lng_translate_api_key'] ?? ''),
35 'lng_translate_api_url' => (string) ($contentCfg['lng_translate_api_url'] ?? ''),
36 'lng_translate_model' => (string) ($contentCfg['lng_translate_model'] ?? 'gpt-4o-mini'),
37 );
38
39 if ($data['lng_translate_provider'] === '' || $data['lng_translate_provider'] === 'undef') {
40 $data['lng_translate_provider'] = 'copy';
41 }
42 if ($data['lng_translate_model'] === '' || $data['lng_translate_model'] === 'undef') {
43 $data['lng_translate_model'] = 'gpt-4o-mini';
44 }
45
46 $dbxCfg = dbx()->get_config('dbx');
47 if (!is_array($dbxCfg)) {
48 $dbxCfg = array();
49 }
50
51 $data['default_lng'] = strtolower(trim((string) ($dbxCfg['default_lng'] ?? 'de')));
52 if ($data['default_lng'] === '' || $data['default_lng'] === 'undef') {
53 $data['default_lng'] = 'de';
54 }
55
56 $accessible = $dbxCfg['accessible_lng'] ?? 'de';
57 if (is_array($accessible)) {
58 $data['accessible_lng'] = implode(',', $accessible);
59 } else {
60 $data['accessible_lng'] = trim((string) $accessible);
61 }
62 if ($data['accessible_lng'] === '' || $data['accessible_lng'] === 'undef') {
63 $data['accessible_lng'] = $data['default_lng'];
64 }
65
66 $homeCfg = dbx()->get_config('dbxHome');
67 $data['home_cid'] = is_array($homeCfg) ? (string) ($homeCfg['cid'] ?? '1') : '1';
68 if ($data['home_cid'] === '' || $data['home_cid'] === 'undef') {
69 $data['home_cid'] = '1';
70 }
71
72 return $data;
73 }
74
78 private function normalizeAccessibleLng($raw, string $defaultLng): array {
79 $out = array();
80 if (is_array($raw)) {
81 foreach ($raw as $val) {
82 $val = strtolower(trim((string) $val));
83 if ($val !== '' && preg_match('/^[a-z]{2,3}$/', $val)) {
84 $out[] = $val;
85 }
86 }
87 } else {
88 $parts = preg_split('/\s*,\s*/', (string) $raw, -1, PREG_SPLIT_NO_EMPTY);
89 if (is_array($parts)) {
90 foreach ($parts as $val) {
91 $val = strtolower(trim((string) $val));
92 if ($val !== '' && preg_match('/^[a-z]{2,3}$/', $val)) {
93 $out[] = $val;
94 }
95 }
96 }
97 }
98
99 $out = array_values(array_unique($out));
100 if ($defaultLng !== '' && !in_array($defaultLng, $out, true)) {
101 array_unshift($out, $defaultLng);
102 }
103 if (!count($out)) {
104 $out = array($defaultLng !== '' ? $defaultLng : 'de');
105 }
106
107 return $out;
108 }
109
110 private function saveLngConfig(array $config): void {
111 $defaultLng = strtolower(trim((string) ($config['default_lng'] ?? 'de')));
112 if ($defaultLng === '' || !preg_match('/^[a-z]{2,3}$/', $defaultLng)) {
113 $defaultLng = 'de';
114 }
115
116 $accessibleList = $this->normalizeAccessibleLng($config['accessible_lng'] ?? $defaultLng, $defaultLng);
117
118 $dbxCfg = dbx()->get_config('dbx');
119 if (!is_array($dbxCfg)) {
120 $dbxCfg = array();
121 }
122 $dbxCfg['default_lng'] = $defaultLng;
123 $dbxCfg['accessible_lng'] = implode(',', $accessibleList);
124 dbx()->set_config('dbx', $dbxCfg);
125
126 $homeCid = trim((string) ($config['home_cid'] ?? '1'));
127 if ($homeCid === '' || !ctype_digit($homeCid)) {
128 $homeCid = '1';
129 }
130
131 $homeCfg = dbx()->get_config('dbxHome');
132 if (!is_array($homeCfg)) {
133 $homeCfg = array();
134 }
135 $homeCfg['cid'] = $homeCid;
136 dbx()->set_config('dbxHome', $homeCfg);
137 }
138
139 private function saveTranslateConfig(array $config): void {
140 $contentCfg = dbx()->get_config('dbxContent');
141 if (!is_array($contentCfg)) {
142 $contentCfg = array();
143 }
144
145 foreach (self::TRANSLATE_KEYS as $key) {
146 if (!array_key_exists($key, $config)) {
147 continue;
148 }
149 $contentCfg[$key] = $config[$key];
150 }
151
152 if (!isset($contentCfg['dbxConfig_modul']) || $contentCfg['dbxConfig_modul'] === '') {
153 $contentCfg['dbxConfig_modul'] = 'secure';
154 }
155
156 dbx()->set_config('dbxContent', $contentCfg);
157 }
158
159 public function run($action = '') {
160 $data = $this->buildFormData();
161
162 $oForm = dbx()->get_system_obj('dbxForm');
163 $oForm->init('form-dbxContent-config', 'config-dbxContent-shell');
164 $oForm->_action = $action !== ''
165 ? $action
166 : '?dbx_modul=dbxAdmin&dbx_run1=config&dbx_run2=edit&xmodul=dbxContent';
167 $oForm->_dd = self::LNG_FD;
168 $oForm->_data = $data;
169 $oForm->_fld_change_state = '*';
170
171 $help = dbx()->get_include_obj('dbxAdminHelp', 'dbxAdmin');
172 $help->attachForm($oForm, 'content_lng');
173
174 $oForm->add_rep('section_languages', 'Sprachen');
175 $oForm->add_rep('languages_hint', 'Master- und Zielsprachen steuern CMS-Tabellen, Tree-Badges und Startseiten-Aufloesung.');
176 $oForm->add_rep('section_translate', 'Uebersetzung (API)');
177 $oForm->add_rep('translate_hint', 'Provider und API-Zugang fuer automatische Uebersetzung bei Sync und Provision.');
178
179 $this->addLngFld($oForm, 'default_lng');
180 $this->addLngFld($oForm, 'accessible_lng');
181 $this->addLngFld($oForm, 'home_cid');
182
183 $this->addLngFld($oForm, 'lng_translate_provider');
184 $this->addLngFld($oForm, 'lng_translate_api_key');
185 $this->addLngFld($oForm, 'lng_translate_api_url');
186 $this->addLngFld($oForm, 'lng_translate_model');
187
188 $saveBtn = dbx()->get_system_obj('dbxTPL')->get_tpl('dbx|button-submit', array(
189 'label' => 'Sprach-Config speichern',
190 ));
191 $oForm->add_obj('button', 'obj-value', $saveBtn);
192 $oForm->add_obj('bar_actions', 'obj-value', $saveBtn);
193
194 if ($oForm->submit() && !$oForm->errors()) {
195 $config = is_array($oForm->_post) ? $oForm->_post : array();
196 foreach (array('button', 'bar_actions') as $skip) {
197 unset($config[$skip]);
198 }
199
200 $this->saveLngConfig($config);
201 $this->saveTranslateConfig($config);
202
203 dbx()->sys_msg(
204 'info',
205 'dbxContent',
206 'config',
207 'Sprach-Config gespeichert',
208 'master=' . (string) ($config['default_lng'] ?? '') . '; provider=' . (string) ($config['lng_translate_provider'] ?? '')
209 );
210
211 $oForm->_data = $this->buildFormData();
212 }
213
214 $this->applyBarReps($oForm);
215
216 return $oForm->run();
217 }
218
219 private function applyBarReps($oForm): void {
220 $provider = dbxContentTranslate::provider();
221 $oForm->add_rep('bar_title', 'CMS — Sprachen & Uebersetzung');
222 $oForm->add_rep(
223 'bar_subtitle',
224 'Aktiver Uebersetzungs-Provider: ' . $provider . ' (nach Speichern neu geladen)'
225 );
226 $oForm->add_rep('bar_icon', 'bi-translate');
227 $oForm->add_rep('bar_class', 'dbx-module-bar');
228 $oForm->add_rep('bar_title_class', 'dbx-module-bar-titleblock');
229 $oForm->add_rep('bar_actions_class', 'dbx-module-bar-actions');
230 $oForm->add_rep('current_provider', $provider);
231 }
232}
$config['version']
Definition config.php:2
DBX schema administration.