dbxapp 4.1.3
CMS, Shop, Workflows und modulare Geschäftsanwendungen
Loading...
Searching...
No Matches
dbxDesignAdmin.class.php
Go to the documentation of this file.
1<?php
2namespace dbx\dbxDesign_admin;
3
11
13 private $designService;
14 private $texts;
15
16 public function __construct() {
17 $this->designService = dbx()->get_include_obj('dbxDesignService', 'dbxDesign_admin');
18 }
19
20 private function url(string $run1 = 'list', array $params = array()): string {
21 $url = '?dbx_modul=dbxDesign_admin&dbx_run1=' . rawurlencode($run1);
22 foreach ($params as $key => $value) {
23 if ($value !== '') {
24 $url .= '&' . rawurlencode((string)$key) . '=' . rawurlencode((string)$value);
25 }
26 }
27 return $url;
28 }
29
30 private function h($value): string {
31 return htmlspecialchars((string)$value, ENT_QUOTES, 'UTF-8');
32 }
33
34 private function texts() {
35 if ($this->texts) {
36 return $this->texts;
37 }
38 dbx()->get_system_obj('dbxForm', 'use');
39 $texts = new \dbxForm();
40 $texts->init('design-admin-texts');
41 $texts->_fd = 'dbxDesign_admin|design-admin';
42 $texts->load_fd_messages();
43 $texts->set_form_help_enabled(false);
44 $this->texts = $texts;
45 return $this->texts;
46 }
47
48 private function designOptions(): array {
49 $items = array();
50 foreach ($this->designService->listDesigns() as $name => $design) {
51 $items[$name] = $design['title'] . ' (' . $name . ')';
52 }
53 return $items;
54 }
55
59 public function renderList(): string {
60 $texts = $this->texts();
61 $cards = '';
62 $config = dbx()->get_config('dbx');
63 $defaultUser = is_array($config) ? (string)($config['default_design_user'] ?? '') : '';
64 $defaultAdmin = is_array($config) ? (string)($config['default_design_admin'] ?? '') : '';
65 foreach ($this->designService->listDesigns() as $name => $design) {
66 $badges = '';
67 if ($name === $defaultUser) {
68 $badges .= '<span class="badge text-bg-primary">' . $this->h($texts->get_fd_message('badge_frontend_default')) . '</span>';
69 }
70 if ($name === $defaultAdmin) {
71 $badges .= '<span class="badge text-bg-dark">' . $this->h($texts->get_fd_message('badge_admin_default')) . '</span>';
72 }
73 if (!empty($design['managed'])) {
74 $badges .= '<span class="badge text-bg-success">' . $this->h($texts->get_fd_message('badge_wizard')) . '</span>';
75 }
76 if (empty($design['valid'])) {
77 $badges .= '<span class="badge text-bg-warning">' . $this->h($texts->get_fd_message('badge_check')) . '</span>';
78 }
79 $cards .= dbx()->get_system_obj('dbxTPL')->get_tpl('dbxDesign_admin|design-card', array(
80 'name' => $this->h($name),
81 'title' => $this->h($design['title']),
82 'description' => $this->h($design['description'] !== '' ? $design['description'] : $texts->get_fd_message('description_fallback')),
83 'layout' => $this->h($design['layout']),
84 'badges' => $badges,
85 'preview_url' => $this->h('?dbx_design=' . rawurlencode($name)),
86 'wizard_url' => $this->h($this->url('wizard', array('source_design' => $name))),
87 'ki_url' => $this->h('?dbx_modul=dbxKi&dbx_run1=briefing_design&design=' . rawurlencode($name)),
88 'download_url' => $this->h($this->url('download', array('design' => $name))),
89 'action_personalize' => $this->h($texts->get_fd_message('action_personalize')),
90 'action_ai' => $this->h($texts->get_fd_message('action_ai')),
91 'action_preview' => $this->h($texts->get_fd_message('action_preview')),
92 'action_backup' => $this->h($texts->get_fd_message('action_backup')),
93 ));
94 }
95
96 return dbx()->get_system_obj('dbxTPL')->get_tpl('dbxDesign_admin|design-list', array(
97 'cards' => $cards,
98 'wizard_url' => $this->h($this->url('wizard')),
99 'ki_url' => $this->h('?dbx_modul=dbxKi&dbx_run1=briefing_design'),
100 'bar_title' => $texts->get_fd_message('list_title'),
101 'bar_subtitle' => $texts->get_fd_message('list_subtitle'),
102 'bar_icon' => 'bi-palette',
103 'bar_actions' => '<a class="btn btn-outline-primary btn-sm" href="' . $this->h('?dbx_modul=dbxKi&dbx_run1=briefing_design') . '"><i class="bi bi-stars"></i> ' . $this->h($texts->get_fd_message('action_ai_design')) . '</a> '
104 . '<a class="btn btn-primary btn-sm" href="' . $this->h($this->url('wizard')) . '"><i class="bi bi-magic"></i> ' . $this->h($texts->get_fd_message('action_wizard')) . '</a>',
105 'bar_class' => 'dbx-module-bar',
106 'bar_title_class' => 'dbx-module-bar-titleblock',
107 'bar_title_pre' => '',
108 'bar_title_heading_attrs' => '',
109 'bar_middle' => '',
110 'bar_extra' => '',
111 'bar_actions_class' => 'dbx-module-bar-actions',
112 ));
113 }
114
118 public function renderWizard(): string {
119 $texts = $this->texts();
120 $source = $this->designService->normalizeName((string)dbx()->get_request_var('source_design', 'dbxapp', 'parameter'));
121 if (!isset($this->designService->listDesigns()[$source])) {
122 $source = 'dbxapp';
123 }
124 $defaults = $this->designService->defaults($source);
125 $form = dbx()->get_system_obj('dbxForm');
126 $form->init('design-admin-wizard', 'design-wizard');
127 $form->_fd = 'dbxDesign_admin|design-admin';
128 $form->load_fd_messages();
129 $form->set_form_help_enabled(false);
130 $form->_action = $this->url('wizard');
131 $form->_msg_info = $texts->get_fd_message('wizard_info');
132 $form->_data = array_merge($form->_data, $defaults);
133
134 $form->add_rep('list_url', $this->h($this->url('list')));
135 $form->add_rep('ki_url', $this->h('?dbx_modul=dbxKi&dbx_run1=briefing_design&design=' . rawurlencode($source)));
136 $form->add_rep('bar_title', $texts->get_fd_message('wizard_title'));
137 $form->add_rep('bar_subtitle', $texts->get_fd_message('wizard_subtitle'));
138 $form->add_rep('bar_icon', 'bi-magic');
139 $form->add_rep('bar_actions', '<a class="btn btn-outline-primary btn-sm" href="' . $this->h('?dbx_modul=dbxKi&dbx_run1=briefing_design&design=' . rawurlencode($source)) . '"><i class="bi bi-stars"></i> ' . $this->h($texts->get_fd_message('action_with_ai')) . '</a> '
140 . '<a class="btn btn-outline-secondary btn-sm" href="' . $this->h($this->url('list')) . '"><i class="bi bi-arrow-left"></i> ' . $this->h($texts->get_fd_message('action_designs')) . '</a>');
141 foreach (array(
142 'bar_class' => 'dbx-module-bar',
143 'bar_title_class' => 'dbx-module-bar-titleblock',
144 'bar_title_pre' => '',
145 'bar_title_heading_attrs' => '',
146 'bar_middle' => '',
147 'bar_extra' => '',
148 'bar_actions_class' => 'dbx-module-bar-actions',
149 ) as $key => $value) {
150 $form->add_rep($key, $value);
151 }
152 $form->add_fld('source_design', 'select-single-label', label: $texts->get_fd_message('label_source_design'), rules: 'parameter|max=63', options: $this->designOptions(), dd: '');
153 $form->add_fld('target_design', 'text-label', label: $texts->get_fd_message('label_target_design'), rules: 'parameter+_-|min=2|max=63', placeholder: $texts->get_fd_message('placeholder_target_design'), tooltip: $texts->get_fd_message('tooltip_target_design'), dd: '');
154 $form->add_fld('title', 'text-label', label: $texts->get_fd_message('label_title'), rules: 'varchar|max=120', placeholder: $texts->get_fd_message('placeholder_title'), dd: '');
155 $form->add_fld('description', 'textarea-label', label: $texts->get_fd_message('label_description'), rules: 'varchar|max=500', data: 'rows=2', dd: '');
156 $form->add_fld('layout', 'select-single-label', label: $texts->get_fd_message('label_layout'), rules: 'parameter', options: array(
157 'top' => $texts->get_fd_message('layout_top'),
158 'sidebar' => $texts->get_fd_message('layout_sidebar'),
159 'hybrid' => $texts->get_fd_message('layout_hybrid'),
160 ), dd: '');
161 $form->add_fld('menu_style', 'select-single-label', label: $texts->get_fd_message('label_menu_style'), rules: 'parameter', options: array(
162 'tabs' => $texts->get_fd_message('menu_tabs'),
163 'pills' => $texts->get_fd_message('menu_pills'),
164 'compact' => $texts->get_fd_message('menu_compact'),
165 ), dd: '');
166 $form->add_fld('content_width', 'select-single-label', label: $texts->get_fd_message('label_content_width'), rules: 'parameter', options: array(
167 'compact' => $texts->get_fd_message('width_compact'),
168 'wide' => $texts->get_fd_message('width_wide'),
169 'full' => $texts->get_fd_message('width_full'),
170 ), dd: '');
171 $form->add_fld('footer_mode', 'select-single-label', label: $texts->get_fd_message('label_footer_mode'), rules: 'parameter', options: array(
172 'full' => $texts->get_fd_message('footer_full'),
173 'minimal' => $texts->get_fd_message('footer_minimal'),
174 'none' => $texts->get_fd_message('footer_none'),
175 ), dd: '');
176 $form->add_fld('brand_name', 'text-label', label: $texts->get_fd_message('label_brand_name'), rules: 'varchar|min=1|max=120', dd: '');
177 $form->add_fld('tagline', 'text-label', label: $texts->get_fd_message('label_tagline'), rules: 'varchar|max=160', dd: '');
178 $form->add_fld('logo_mode', 'select-single-label', label: $texts->get_fd_message('label_logo_mode'), rules: 'parameter', options: array(
179 'icon' => $texts->get_fd_message('logo_icon'),
180 'none' => $texts->get_fd_message('logo_none'),
181 ), dd: '');
182 $form->add_fld('logo_icon', 'text-label', label: $texts->get_fd_message('label_logo_icon'), rules: 'parameter|max=50', placeholder: 'bi-stars', dd: '');
183 $form->add_fld('primary_color', 'text-label', label: $texts->get_fd_message('label_primary_color'), rules: 'varchar|max=7', dd: '');
184 $form->add_fld('secondary_color', 'text-label', label: $texts->get_fd_message('label_secondary_color'), rules: 'varchar|max=7', dd: '');
185 $form->add_fld('accent_color', 'text-label', label: $texts->get_fd_message('label_accent_color'), rules: 'varchar|max=7', dd: '');
186 $form->add_fld('background_color', 'text-label', label: $texts->get_fd_message('label_background_color'), rules: 'varchar|max=7', dd: '');
187 $form->add_fld('surface_color', 'text-label', label: $texts->get_fd_message('label_surface_color'), rules: 'varchar|max=7', dd: '');
188 $form->add_fld('text_color', 'text-label', label: $texts->get_fd_message('label_text_color'), rules: 'varchar|max=7', dd: '');
189 $form->add_fld('font_family', 'select-single-label', label: $texts->get_fd_message('label_font_family'), rules: 'parameter', options: array(
190 'system' => $texts->get_fd_message('font_system'),
191 'modern' => $texts->get_fd_message('font_modern'),
192 'editorial' => $texts->get_fd_message('font_editorial'),
193 'rounded' => $texts->get_fd_message('font_rounded'),
194 ), dd: '');
195 $form->add_fld('radius', 'select-single-label', label: $texts->get_fd_message('label_radius'), rules: 'parameter', options: array(
196 'square' => $texts->get_fd_message('radius_square'),
197 'soft' => $texts->get_fd_message('radius_soft'),
198 'round' => $texts->get_fd_message('radius_round'),
199 ), dd: '');
200 $form->add_fld('footer_text', 'text-label', label: $texts->get_fd_message('label_footer_text'), rules: 'varchar|max=180', dd: '');
201 $form->add_fld('legal_links', 'checkbox-label', label: $texts->get_fd_message('label_legal_links'), rules: 'int', dd: '');
202 $form->add_fld('set_default', 'checkbox-label', label: $texts->get_fd_message('label_set_default'), rules: 'int', dd: '');
203
204 $resultHtml = '';
205 $hasPost = ($_SERVER['REQUEST_METHOD'] ?? '') === 'POST';
206 if ($form->submit()) {
207 $input = $this->collectFormInput($form);
208 try {
209 $result = $this->designService->createFromWizard($input, is_array($_FILES['logo_file'] ?? null) ? $_FILES['logo_file'] : array());
210 $form->_msg_success = $texts->get_fd_message('wizard_created');
211 $resultHtml = dbx()->get_system_obj('dbxTPL')->get_tpl('dbxDesign_admin|design-result', array(
212 'title' => $this->h($input['title'] !== '' ? $input['title'] : $result['name']),
213 'name' => $this->h($result['name']),
214 'preview_url' => $this->h('?dbx_design=' . rawurlencode($result['name'])),
215 'list_url' => $this->h($this->url('list')),
216 'ki_url' => $this->h('?dbx_modul=dbxKi&dbx_run1=briefing_design&design=' . rawurlencode($result['name']) . '&mode=update'),
217 'default_note' => !empty($result['default_changed']) ? '<span class="badge text-bg-primary">' . $this->h($texts->get_fd_message('wizard_default_set')) . '</span>' : '',
218 ));
219 } catch (\Throwable $e) {
220 $form->_msg_error = $e->getMessage();
221 }
222 } elseif ($hasPost) {
223 $form->_msg_error = $texts->get_fd_message('wizard_validation_error');
224 }
225
226 return $form->run() . $resultHtml;
227 }
228
232 public function sendDownload(): void {
233 $name = $this->designService->normalizeName((string)dbx()->get_request_var('design', '', 'parameter'));
234 $file = $this->designService->backupDesign($name);
235 header('Content-Type: application/zip');
236 header('Content-Disposition: attachment; filename="dbx-design-' . $name . '-' . date('Ymd-His') . '.zip"');
237 header('Content-Length: ' . filesize($file));
238 readfile($file);
239 exit;
240 }
241
242 private function collectFormInput($form): array {
243 $rules = array(
244 'source_design' => 'parameter|max=63',
245 'target_design' => 'parameter+_-|min=2|max=63',
246 'title' => 'varchar|max=120',
247 'description' => 'varchar|max=500',
248 'layout' => 'parameter',
249 'menu_style' => 'parameter',
250 'content_width' => 'parameter',
251 'footer_mode' => 'parameter',
252 'brand_name' => 'varchar|max=120',
253 'tagline' => 'varchar|max=160',
254 'logo_mode' => 'parameter',
255 'logo_icon' => 'parameter|max=50',
256 'primary_color' => 'varchar|max=7',
257 'secondary_color' => 'varchar|max=7',
258 'accent_color' => 'varchar|max=7',
259 'background_color' => 'varchar|max=7',
260 'surface_color' => 'varchar|max=7',
261 'text_color' => 'varchar|max=7',
262 'font_family' => 'parameter',
263 'radius' => 'parameter',
264 'footer_text' => 'varchar|max=180',
265 'legal_links' => 'int',
266 'set_default' => 'int',
267 );
268 $out = array();
269 foreach ($rules as $name => $rule) {
270 $out[$name] = $form->get_fld_value($name, '', $rule);
271 }
272 return $out;
273 }
274
279 public function run(): string {
280 $run1 = dbx()->get_modul_var('dbx_run1', 'list', 'parameter');
281 switch ($run1) {
282 case 'wizard':
283 case 'personalize':
284 return $this->renderWizard();
285 case 'download':
286 $this->sendDownload();
287 return '';
288 case 'list':
289 case 'start':
290 default:
291 return $this->renderList();
292 }
293 }
294}
295?>
UI-Controller für Designübersicht und geführte Design-Erstellung.
renderWizard()
Zeigt und verarbeitet den dbxForm-basierten Design-Wizard.
renderList()
Rendert die Designübersicht aus den dateibasierten Design-Metadaten.
sendDownload()
Sendet ein unverändertes ZIP-Backup eines Designs.
$_SERVER['REQUEST_METHOD']
if($resolved !==$expectedBase . 'files/test/') $config
if(trim($second) !=='second') $design
exit
Definition index.php:146
if( $demoId<=0) foreach(array('create_date', 'create_uid', 'update_date', 'update_uid', 'owner',) as $systemField) $items
DBX schema administration.