Verzeichnisstruktur phpBB-3.2.0
- Veröffentlicht
- 06.01.2017
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
190 if (isset($input_options['default']))
191 {
192 $default = $input_options['default'];
193 $default = preg_replace_callback('#\{L_([A-Z0-9\-_]*)\}#s', array($this, 'lang_replace_callback'), $default);
194 $tpl_ary['DEFAULT'] = $default;
195 }
196
197 if (isset($input_options['description']))
198 {
199 $tpl_ary['TITLE_EXPLAIN'] = $this->language->lang($input_options['description']);
200 $tpl_ary['S_EXPLAIN'] = true;
201 }
202
203 if (in_array($input_options['type'], array('select', 'radio'), true))
204 {
205 for ($i = 0, $total = sizeof($input_options['options']); $i < $total; $i++)
206 {
207 if (isset($input_options['options'][$i]['label']))
208 {
209 $input_options['options'][$i]['label'] = $this->language->lang($input_options['options'][$i]['label']);
210 }
211 }
212
213 $tpl_ary['OPTIONS'] = $input_options['options'];
214 }
215
216 $block_name = ($input_options['type'] === 'submit') ? 'submit_buttons' : 'options';
217 $this->template->assign_block_vars($block_name, $tpl_ary);
218 }
219
220 $this->template->assign_var('S_NOT_ONLY_BUTTON_FORM', $not_button_form);
221
222 $this->template->set_filenames(array(
223 'form_install' => 'installer_form.html',
224 ));
225
226 return $this->template->assign_display('form_install');
227 }
228
229 /**
230 * {@inheritdoc}
231 */
232 public function send_response($no_more_output = false)
233 {
234 $json_data_array = $this->prepare_json_array($no_more_output);
235
236 if (empty($json_data_array))
237 {
238 return;
239 }
240
241 $json_data = json_encode($json_data_array);
242
243 // Try to push content to the browser
244 print(str_pad(' ', 4096) . "\n");
245 print($json_data . "\n\n");
246 flush();
247 }
248
249 /**
250 * Prepares iohandler's data to be sent out to the client.
251 *
252 * @param bool $no_more_output Whether or not there will be more output in this response
253 *
254 * @return array
255 */
256 protected function prepare_json_array($no_more_output = false)
257 {
258 $json_array = array();
259
260 if (!empty($this->errors))
261 {
262 $json_array['errors'] = $this->errors;
263 $this->errors = array();
264 }
265
266 if (!empty($this->warnings))
267 {
268 $json_array['warnings'] = $this->warnings;
269 $this->warnings = array();
270 }
271
272 if (!empty($this->logs))
273 {
274 $json_array['logs'] = $this->logs;
275 $this->logs = array();
276 }
277
278 if (!empty($this->success))
279 {
280 $json_array['success'] = $this->success;
281 $this->success = array();
282 }
283
284 if (!empty($this->download))
285 {
286 $json_array['download'] = $this->download;
287 $this->download = array();
288 }
289
290 if (!empty($this->form))
291 {
292 $json_array['form'] = $this->form;
293 $this->form = '';
294 }
295
296 if (!empty($this->file_status))
297 {
298 $json_array['file_status'] = $this->file_status;
299 $this->file_status = '';
300 }
301
302 // If current task name is set, we push progress message to the client side
303 if (!empty($this->current_task_name))
304 {
305 $json_array['progress'] = array(
306 'task_name' => $this->current_task_name,
307 'task_num' => $this->current_task_progress,
308 'task_count' => $this->task_progress_count,
309 );
310
311 if ($this->restart_progress_bar)
312 {
313 $json_array['progress']['restart'] = 1;
314 $this->restart_progress_bar = false;
315 }
316 }
317
318 if (!empty($this->nav_data))
319 {
320 $json_array['nav'] = $this->nav_data;
321 $this->nav_data = array();
322 }
323
324 if ($this->request_client_refresh)
325 {
326 $json_array['refresh'] = true;
327 $this->request_client_refresh = false;
328 }
329
330 if (!empty($this->cookies))
331 {
332 $json_array['cookies'] = $this->cookies;
333 $this->cookies = array();
334 }
335
336 if (!empty($this->redirect_url))
337 {
338 $json_array['redirect'] = $this->redirect_url;
339 $this->redirect_url = array();
340 }
341
342 if ($no_more_output)
343 {
344 $json_array['over'] = true;
345 }
346
347 return $json_array;
348 }
349
350 /**
351 * {@inheritdoc}
352 */
353 public function set_progress($task_lang_key, $task_number)
354 {
355 parent::set_progress($task_lang_key, $task_number);
356 $this->send_response();
357 }
358
359 /**
360 * {@inheritdoc}
361 */
362 public function request_refresh()
363 {
364 $this->request_client_refresh = true;
365 }
366
367 /**
368 * {@inheritdoc}
369 */
370 public function set_active_stage_menu($menu_path)
371 {
372 $this->nav_data['active'] = $menu_path[sizeof($menu_path) - 1];
373 $this->send_response();
374 }
375
376 /**
377 * {@inheritdoc}
378 */
379 public function set_finished_stage_menu($menu_path)
380 {
381 $this->nav_data['finished'][] = $menu_path[sizeof($menu_path) - 1];
382 $this->send_response();
383 }
384
385 /**
386 * {@inheritdoc}
387 */
388 public function set_cookie($cookie_name, $cookie_value)
389 {
390 $this->cookies[] = array(
391 'name' => $cookie_name,
392 'value' => $cookie_value
393 );
394 }
395
396 /**
397 * {@inheritdoc}
398 */
399 public function add_download_link($route, $title, $msg = null)
400 {
401 $link_properties = array(
402 'href' => $this->router->generate($route),
403 'title' => $this->language->lang($title),
404 'download' => $this->language->lang('DOWNLOAD'),
405 );
406
407 if ($msg !== null)
408 {
409 $link_properties['msg'] = htmlspecialchars_decode($this->language->lang($msg));
410 }
411
412 $this->download[] = $link_properties;
413 }
414
415 /**
416 * {@inheritdoc}
417 */
418 public function render_update_file_status($status_array)
419 {
420 $this->template->assign_vars(array(
421 'T_IMAGE_PATH' => $this->path_helper->get_web_root_path() . 'adm/images/',
422 ));
423
424 foreach ($status_array as $block => $list)
425 {
426 foreach ($list as $filename)
427 {
428 $dirname = dirname($filename);
429
430 $this->template->assign_block_vars($block, array(
431 'STATUS' => $block,
432 'FILENAME' => $filename,
433 'DIR_PART' => (!empty($dirname) && $dirname !== '.') ? dirname($filename) . '/' : false,
434 'FILE_PART' => basename($filename),
435 ));
436 }
437 }
438
439 $this->template->set_filenames(array(
440 'file_status' => 'installer_update_file_status.html',
441 ));
442
443 $this->file_status = $this->template->assign_display('file_status');
444 }
445
446 /**
447 * {@inheritdoc}
448 */
449 public function redirect($url, $use_ajax = false)
450 {
451 $this->redirect_url = array('url' => $url, 'use_ajax' => $use_ajax);
452 $this->send_response(true);
453 }
454
455 /**
456 * Acquires a file lock
457 */
458 public function acquire_lock()
459 {
460 $lock_file = $this->phpbb_root_path . 'store/io_lock.lock';
461 $this->file_lock_pointer = @fopen($lock_file, 'w+');
462
463 if ($this->file_lock_pointer)
464 {
465 flock($this->file_lock_pointer, LOCK_EX);
466 }
467 }
468
469 /**
470 * Release file lock
471 */
472 public function release_lock()
473 {
474 if ($this->file_lock_pointer)
475 {
476 fwrite($this->file_lock_pointer, 'ok');
477 flock($this->file_lock_pointer, LOCK_UN);
478 fclose($this->file_lock_pointer);
479 }
480 }
481
482 /**
483 * Callback function for language replacing
484 *
485 * @param array $matches
486 * @return string
487 */
488 public function lang_replace_callback($matches)
489 {
490 if (!empty($matches[1]))
491 {
492 return $this->language->lang($matches[1]);
493 }
494
495 return '';
496 }
497 }
498