Verzeichnisstruktur phpBB-3.3.15
- Veröffentlicht
- 28.08.2024
So funktioniert es
|
Auf das letzte Element klicken. Dies geht jeweils ein Schritt zurück |
Auf das Icon klicken, dies öffnet das Verzeichnis. Nochmal klicken schließt das Verzeichnis. |
|
(Beispiel Datei-Icons)
|
Auf das Icon klicken um den Quellcode anzuzeigen |
ajax_iohandler.php
001 <?php
002 /**
003 *
004 * This file is part of the phpBB Forum Software package.
005 *
006 * @copyright (c) phpBB Limited <https://www.phpbb.com>
007 * @license GNU General Public License, version 2 (GPL-2.0)
008 *
009 * For full copyright and license information, please see
010 * the docs/CREDITS.txt file.
011 *
012 */
013
014 namespace phpbb\install\helper\iohandler;
015
016 use phpbb\path_helper;
017 use phpbb\routing\router;
018
019 /**
020 * Input-Output handler for the AJAX frontend
021 */
022 class ajax_iohandler extends iohandler_base
023 {
024 /**
025 * @var path_helper
026 */
027 protected $path_helper;
028
029 /**
030 * @var \phpbb\request\request_interface
031 */
032 protected $request;
033
034 /**
035 * @var \phpbb\template\template
036 */
037 protected $template;
038
039 /**
040 * @var router
041 */
042 protected $router;
043
044 /**
045 * @var string
046 */
047 protected $phpbb_root_path;
048
049 /**
050 * @var string
051 */
052 protected $file_status;
053
054 /**
055 * @var string
056 */
057 protected $form;
058
059 /**
060 * @var bool
061 */
062 protected $request_client_refresh;
063
064 /**
065 * @var array
066 */
067 protected $nav_data;
068
069 /**
070 * @var array
071 */
072 protected $cookies;
073
074 /**
075 * @var array
076 */
077 protected $download;
078
079 /**
080 * @var array
081 */
082 protected $redirect_url;
083
084 /**
085 * @var resource
086 */
087 protected $file_lock_pointer;
088
089 /**
090 * Constructor
091 *
092 * @param path_helper $path_helper
093 * @param \phpbb\request\request_interface $request HTTP request interface
094 * @param \phpbb\template\template $template Template engine
095 * @param router $router Router
096 * @param string $root_path Path to phpBB's root
097 */
098 public function __construct(path_helper $path_helper, \phpbb\request\request_interface $request, \phpbb\template\template $template, router $router, $root_path)
099 {
100 $this->path_helper = $path_helper;
101 $this->request = $request;
102 $this->router = $router;
103 $this->template = $template;
104 $this->form = '';
105 $this->nav_data = array();
106 $this->cookies = array();
107 $this->download = array();
108 $this->redirect_url = array();
109 $this->file_status = '';
110 $this->phpbb_root_path = $root_path;
111
112 parent::__construct();
113 }
114
115 /**
116 * {@inheritdoc}
117 */
118 public function get_input($name, $default, $multibyte = false)
119 {
120 return $this->request->variable($name, $default, $multibyte);
121 }
122
123 /**
124 * {@inheritdoc}
125 */
126 public function get_raw_input($name, $default)
127 {
128 return $this->request->raw_variable($name, $default);
129 }
130
131 /**
132 * {@inheritdoc}
133 */
134 public function get_server_variable($name, $default = '')
135 {
136 return $this->request->server($name, $default);
137 }
138
139 /**
140 * {@inheritdoc}
141 */
142 public function get_header_variable($name, $default = '')
143 {
144 return $this->request->header($name, $default);
145 }
146
147 /**
148 * {@inheritdoc}
149 */
150 public function is_secure()
151 {
152 return $this->request->is_secure();
153 }
154
155 /**
156 * {@inheritdoc}
157 */
158 public function add_user_form_group($title, $form)
159 {
160 $this->form = $this->generate_form_render_data($title, $form);
161 }
162
163 /**
164 * {@inheritdoc}
165 */
166 public function generate_form_render_data($title, $form)
167 {
168 $this->template->assign_block_vars('options', array(
169 'LEGEND' => $this->language->lang($title),
170 'S_LEGEND' => true,
171 ));
172
173 $not_button_form = false;
174
175 foreach ($form as $input_name => $input_options)
176 {
177 if (!isset($input_options['type']))
178 {
179 continue;
180 }
181
182 $tpl_ary = array();
183 $not_button_form = ($input_options['type'] !== 'submit' || $not_button_form);
184
185 $tpl_ary['TYPE'] = $input_options['type'];
186 $tpl_ary['TITLE'] = $this->language->lang($input_options['label']);
187 $tpl_ary['KEY'] = $input_name;
188 $tpl_ary['S_EXPLAIN'] = false;
189 $tpl_ary['DISABLED'] = isset($input_options['disabled']) ? $input_options['disabled'] : false;
190 $tpl_ary['IS_SECONDARY'] = isset($input_options['is_secondary']) ? $input_options['is_secondary'] : false;
191
192 if (isset($input_options['default']))
193 {
194 $default = $input_options['default'];
195 $default = preg_replace_callback('#\{L_([A-Z0-9\-_]*)\}#s', array($this, 'lang_replace_callback'), $default);
196 $tpl_ary['DEFAULT'] = $default;
197 }
198
199 if (isset($input_options['description']))
200 {
201 $tpl_ary['TITLE_EXPLAIN'] = $this->language->lang($input_options['description']);
202 $tpl_ary['S_EXPLAIN'] = true;
203 }
204
205 if (in_array($input_options['type'], array('select', 'radio'), true))
206 {
207 for ($i = 0, $total = count($input_options['options']); $i < $total; $i++)
208 {
209 if (isset($input_options['options'][$i]['label']))
210 {
211 $input_options['options'][$i]['label'] = $this->language->lang($input_options['options'][$i]['label']);
212 }
213 }
214
215 $tpl_ary['OPTIONS'] = $input_options['options'];
216 }
217
218 $block_name = ($input_options['type'] === 'submit') ? 'submit_buttons' : 'options';
219 $this->template->assign_block_vars($block_name, $tpl_ary);
220 }
221
222 if (isset($form['database_update_submit']) && !$form['database_update_submit']['disabled'])
223 {
224 $this->template->assign_var('FORM_TITLE', $this->language->lang('UPDATE_CONTINUE_UPDATE_PROCESS'));
225 }
226
227 $this->template->assign_var('S_NOT_ONLY_BUTTON_FORM', $not_button_form);
228
229 if (!$not_button_form)
230 {
231 $this->template->destroy_block_vars('options');
232 }
233
234 $this->template->set_filenames(array(
235 'form_install' => 'installer_form.html',
236 ));
237
238 return $this->template->assign_display('form_install');
239 }
240
241 /**
242 * {@inheritdoc}
243 */
244 public function send_response($no_more_output = false)
245 {
246 $json_data_array = $this->prepare_json_array($no_more_output);
247
248 if (empty($json_data_array))
249 {
250 return;
251 }
252
253 $json_data = json_encode($json_data_array);
254
255 // Try to push content to the browser
256 print(str_pad(' ', 4096) . "\n");
257 print($json_data . "\n\n");
258 flush();
259 }
260
261 /**
262 * Prepares iohandler's data to be sent out to the client.
263 *
264 * @param bool $no_more_output Whether or not there will be more output in this response
265 *
266 * @return array
267 */
268 protected function prepare_json_array($no_more_output = false)
269 {
270 $json_array = array();
271
272 if (!empty($this->errors))
273 {
274 $json_array['errors'] = $this->errors;
275 $this->errors = array();
276 }
277
278 if (!empty($this->warnings))
279 {
280 $json_array['warnings'] = $this->warnings;
281 $this->warnings = array();
282 }
283
284 if (!empty($this->logs))
285 {
286 $json_array['logs'] = $this->logs;
287 $this->logs = array();
288 }
289
290 if (!empty($this->success))
291 {
292 $json_array['success'] = $this->success;
293 $this->success = array();
294 }
295
296 if (!empty($this->download))
297 {
298 $json_array['download'] = $this->download;
299 $this->download = array();
300 }
301
302 if (!empty($this->form))
303 {
304 $json_array['form'] = $this->form;
305 $this->form = '';
306 }
307
308 if (!empty($this->file_status))
309 {
310 $json_array['file_status'] = $this->file_status;
311 $this->file_status = '';
312 }
313
314 // If current task name is set, we push progress message to the client side
315 if (!empty($this->current_task_name))
316 {
317 $json_array['progress'] = array(
318 'task_name' => $this->current_task_name,
319 'task_num' => $this->current_task_progress,
320 'task_count' => $this->task_progress_count,
321 );
322
323 if ($this->restart_progress_bar)
324 {
325 $json_array['progress']['restart'] = 1;
326 $this->restart_progress_bar = false;
327 }
328 }
329
330 if (!empty($this->nav_data))
331 {
332 $json_array['nav'] = $this->nav_data;
333 $this->nav_data = array();
334 }
335
336 if ($this->request_client_refresh)
337 {
338 $json_array['refresh'] = true;
339 $this->request_client_refresh = false;
340 }
341
342 if (!empty($this->cookies))
343 {
344 $json_array['cookies'] = $this->cookies;
345 $this->cookies = array();
346 }
347
348 if (!empty($this->redirect_url))
349 {
350 $json_array['redirect'] = $this->redirect_url;
351 $this->redirect_url = array();
352 }
353
354 if ($no_more_output)
355 {
356 $json_array['over'] = true;
357 }
358
359 return $json_array;
360 }
361
362 /**
363 * {@inheritdoc}
364 */
365 public function set_progress($task_lang_key, $task_number)
366 {
367 parent::set_progress($task_lang_key, $task_number);
368 $this->send_response();
369 }
370
371 /**
372 * {@inheritdoc}
373 */
374 public function request_refresh()
375 {
376 $this->request_client_refresh = true;
377 }
378
379 /**
380 * {@inheritdoc}
381 */
382 public function set_active_stage_menu($menu_path)
383 {
384 $this->nav_data['active'] = $menu_path[count($menu_path) - 1];
385 $this->send_response();
386 }
387
388 /**
389 * {@inheritdoc}
390 */
391 public function set_finished_stage_menu($menu_path)
392 {
393 $this->nav_data['finished'][] = $menu_path[count($menu_path) - 1];
394 $this->send_response();
395 }
396
397 /**
398 * {@inheritdoc}
399 */
400 public function set_cookie($cookie_name, $cookie_value)
401 {
402 $this->cookies[] = array(
403 'name' => $cookie_name,
404 'value' => $cookie_value
405 );
406 }
407
408 /**
409 * {@inheritdoc}
410 */
411 public function add_download_link($route, $title, $msg = null)
412 {
413 $link_properties = array(
414 'href' => $this->router->generate($route),
415 'title' => $this->language->lang($title),
416 'download' => $this->language->lang('DOWNLOAD'),
417 );
418
419 if ($msg !== null)
420 {
421 $link_properties['msg'] = html_entity_decode($this->language->lang($msg), ENT_COMPAT);
422 }
423
424 $this->download[] = $link_properties;
425 }
426
427 /**
428 * {@inheritdoc}
429 */
430 public function render_update_file_status($status_array)
431 {
432 $this->template->assign_vars(array(
433 'T_IMAGE_PATH' => $this->path_helper->get_web_root_path() . 'adm/images/',
434 ));
435
436 foreach ($status_array as $block => $list)
437 {
438 foreach ($list as $filename)
439 {
440 $dirname = dirname($filename);
441
442 $this->template->assign_block_vars($block, array(
443 'STATUS' => $block,
444 'FILENAME' => $filename,
445 'DIR_PART' => (!empty($dirname) && $dirname !== '.') ? dirname($filename) . '/' : false,
446 'FILE_PART' => basename($filename),
447 ));
448 }
449 }
450
451 $this->template->set_filenames(array(
452 'file_status' => 'installer_update_file_status.html',
453 ));
454
455 $this->file_status = $this->template->assign_display('file_status');
456 }
457
458 /**
459 * {@inheritdoc}
460 */
461 public function redirect($url, $use_ajax = false)
462 {
463 $this->redirect_url = array('url' => $url, 'use_ajax' => $use_ajax);
464 $this->send_response(true);
465 }
466
467 /**
468 * Acquires a file lock
469 */
470 public function acquire_lock()
471 {
472 $lock_file = $this->phpbb_root_path . 'store/io_lock.lock';
473 $this->file_lock_pointer = @fopen($lock_file, 'w+');
474
475 if ($this->file_lock_pointer)
476 {
477 flock($this->file_lock_pointer, LOCK_EX);
478 }
479 }
480
481 /**
482 * Release file lock
483 */
484 public function release_lock()
485 {
486 if ($this->file_lock_pointer)
487 {
488 fwrite($this->file_lock_pointer, 'ok');
489 flock($this->file_lock_pointer, LOCK_UN);
490 fclose($this->file_lock_pointer);
491 }
492 }
493
494 /**
495 * Callback function for language replacing
496 *
497 * @param array $matches
498 * @return string
499 */
500 public function lang_replace_callback($matches)
501 {
502 if (!empty($matches[1]))
503 {
504 return $this->language->lang($matches[1]);
505 }
506
507 return '';
508 }
509 }
510