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 |
add_modules.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\module\install_data\task;
015
016 use phpbb\install\exception\resource_limit_reached_exception;
017 use phpbb\install\helper\config;
018 use phpbb\install\helper\container_factory;
019 use phpbb\install\helper\iohandler\iohandler_interface;
020
021 class add_modules extends \phpbb\install\task_base
022 {
023 /**
024 * @var config
025 */
026 protected $config;
027
028 /**
029 * @var \phpbb\db\driver\driver_interface
030 */
031 protected $db;
032
033 /**
034 * @var \phpbb\extension\manager
035 */
036 protected $extension_manager;
037
038 /**
039 * @var iohandler_interface
040 */
041 protected $iohandler;
042
043 /**
044 * @var \phpbb\module\module_manager
045 */
046 protected $module_manager;
047
048 /**
049 * Define the module structure so that we can populate the database without
050 * needing to hard-code module_id values
051 *
052 * @var array
053 */
054 protected $module_categories = array(
055 'acp' => array(
056 'ACP_CAT_GENERAL' => array(
057 'ACP_QUICK_ACCESS',
058 'ACP_BOARD_CONFIGURATION',
059 'ACP_CLIENT_COMMUNICATION',
060 'ACP_SERVER_CONFIGURATION',
061 ),
062 'ACP_CAT_FORUMS' => array(
063 'ACP_MANAGE_FORUMS',
064 'ACP_FORUM_BASED_PERMISSIONS',
065 ),
066 'ACP_CAT_POSTING' => array(
067 'ACP_MESSAGES',
068 'ACP_ATTACHMENTS',
069 ),
070 'ACP_CAT_USERGROUP' => array(
071 'ACP_CAT_USERS',
072 'ACP_GROUPS',
073 'ACP_USER_SECURITY',
074 ),
075 'ACP_CAT_PERMISSIONS' => array(
076 'ACP_GLOBAL_PERMISSIONS',
077 'ACP_FORUM_BASED_PERMISSIONS',
078 'ACP_PERMISSION_ROLES',
079 'ACP_PERMISSION_MASKS',
080 ),
081 'ACP_CAT_CUSTOMISE' => array(
082 'ACP_STYLE_MANAGEMENT',
083 'ACP_EXTENSION_MANAGEMENT',
084 'ACP_LANGUAGE',
085 ),
086 'ACP_CAT_MAINTENANCE' => array(
087 'ACP_FORUM_LOGS',
088 'ACP_CAT_DATABASE',
089 ),
090 'ACP_CAT_SYSTEM' => array(
091 'ACP_AUTOMATION',
092 'ACP_GENERAL_TASKS',
093 'ACP_MODULE_MANAGEMENT',
094 ),
095 'ACP_CAT_DOT_MODS' => null,
096 ),
097 'mcp' => array(
098 'MCP_MAIN' => null,
099 'MCP_QUEUE' => null,
100 'MCP_REPORTS' => null,
101 'MCP_NOTES' => null,
102 'MCP_WARN' => null,
103 'MCP_LOGS' => null,
104 'MCP_BAN' => null,
105 ),
106 'ucp' => array(
107 'UCP_MAIN' => null,
108 'UCP_PROFILE' => null,
109 'UCP_PREFS' => null,
110 'UCP_PM' => null,
111 'UCP_USERGROUPS' => null,
112 'UCP_ZEBRA' => null,
113 ),
114 );
115
116 /**
117 * @var array
118 */
119 protected $module_categories_basenames = array(
120 'UCP_PM' => 'ucp_pm',
121 );
122
123 /**
124 * @var array
125 */
126 protected $module_extras = array(
127 'acp' => array(
128 'ACP_QUICK_ACCESS' => array(
129 'ACP_MANAGE_USERS',
130 'ACP_GROUPS_MANAGE',
131 'ACP_MANAGE_FORUMS',
132 'ACP_MOD_LOGS',
133 'ACP_BOTS',
134 'ACP_PHP_INFO',
135 ),
136 'ACP_FORUM_BASED_PERMISSIONS' => array(
137 'ACP_FORUM_PERMISSIONS',
138 'ACP_FORUM_PERMISSIONS_COPY',
139 'ACP_FORUM_MODERATORS',
140 'ACP_USERS_FORUM_PERMISSIONS',
141 'ACP_GROUPS_FORUM_PERMISSIONS',
142 ),
143 ),
144 );
145
146 /**
147 * Constructor
148 *
149 * @parma config $config Installer's config
150 * @param iohandler_interface $iohandler Installer's input-output handler
151 * @param container_factory $container Installer's DI container
152 */
153 public function __construct(config $config, iohandler_interface $iohandler, container_factory $container)
154 {
155 $this->config = $config;
156 $this->db = $container->get('dbal.conn');
157 $this->extension_manager = $container->get('ext.manager');
158 $this->iohandler = $iohandler;
159 $this->module_manager = $container->get('module.manager');
160
161 parent::__construct(true);
162 }
163
164 /**
165 * {@inheritdoc}
166 */
167 public function run()
168 {
169 $this->db->sql_return_on_error(true);
170
171 $module_classes = array('acp', 'mcp', 'ucp');
172 $total = count($module_classes);
173 $i = $this->config->get('module_class_index', 0);
174 $module_classes = array_slice($module_classes, $i);
175
176 foreach ($module_classes as $module_class)
177 {
178 $categories = $this->config->get('module_categories_array', array());
179
180 $k = $this->config->get('module_categories_index', 0);
181 $module_categories = array_slice($this->module_categories[$module_class], $k);
182 $timed_out = false;
183
184 foreach ($module_categories as $cat_name => $subs)
185 {
186 // Check if this sub-category has a basename. If it has, use it.
187 $basename = (isset($this->module_categories_basenames[$cat_name])) ? $this->module_categories_basenames[$cat_name] : '';
188
189 $module_data = array(
190 'module_basename' => $basename,
191 'module_enabled' => 1,
192 'module_display' => 1,
193 'parent_id' => 0,
194 'module_class' => $module_class,
195 'module_langname' => $cat_name,
196 'module_mode' => '',
197 'module_auth' => '',
198 );
199
200 $this->module_manager->update_module_data($module_data);
201
202 // Check for last sql error happened
203 if ($this->db->get_sql_error_triggered())
204 {
205 $error = $this->db->sql_error($this->db->get_sql_error_sql());
206 $this->iohandler->add_error_message('INST_ERR_DB', $error['message']);
207 }
208
209 $categories[$cat_name]['id'] = (int) $module_data['module_id'];
210 $categories[$cat_name]['parent_id'] = 0;
211
212 if (is_array($subs))
213 {
214 foreach ($subs as $level2_name)
215 {
216 // Check if this sub-category has a basename. If it has, use it.
217 $basename = (isset($this->module_categories_basenames[$level2_name])) ? $this->module_categories_basenames[$level2_name] : '';
218
219 $module_data = array(
220 'module_basename' => $basename,
221 'module_enabled' => 1,
222 'module_display' => 1,
223 'parent_id' => (int) $categories[$cat_name]['id'],
224 'module_class' => $module_class,
225 'module_langname' => $level2_name,
226 'module_mode' => '',
227 'module_auth' => '',
228 );
229
230 $this->module_manager->update_module_data($module_data);
231
232 // Check for last sql error happened
233 if ($this->db->get_sql_error_triggered())
234 {
235 $error = $this->db->sql_error($this->db->get_sql_error_sql());
236 $this->iohandler->add_error_message('INST_ERR_DB', $error['message']);
237 }
238
239 $categories[$level2_name]['id'] = (int) $module_data['module_id'];
240 $categories[$level2_name]['parent_id'] = (int) $categories[$cat_name]['id'];
241 }
242 }
243
244 $k++;
245
246 // Stop execution if resource limit is reached
247 if ($this->config->get_time_remaining() <= 0 || $this->config->get_memory_remaining() <= 0)
248 {
249 $timed_out = true;
250 break;
251 }
252 }
253
254 $this->config->set('module_categories_array', $categories);
255 $this->config->set('module_categories_index', $k);
256
257 if ($timed_out)
258 {
259 throw new resource_limit_reached_exception();
260 }
261
262 // Get the modules we want to add... returned sorted by name
263 $module_info = $this->module_manager->get_module_infos($module_class);
264
265 $k = $this->config->get('module_info_index', 0);
266 $module_info = array_slice($module_info, $k);
267
268 foreach ($module_info as $module_basename => $fileinfo)
269 {
270 foreach ($fileinfo['modes'] as $module_mode => $row)
271 {
272 foreach ($row['cat'] as $cat_name)
273 {
274 if (!isset($categories[$cat_name]))
275 {
276 continue;
277 }
278
279 $module_data = array(
280 'module_basename' => $module_basename,
281 'module_enabled' => 1,
282 'module_display' => (isset($row['display'])) ? (int) $row['display'] : 1,
283 'parent_id' => (int) $categories[$cat_name]['id'],
284 'module_class' => $module_class,
285 'module_langname' => $row['title'],
286 'module_mode' => $module_mode,
287 'module_auth' => $row['auth'],
288 );
289
290 $this->module_manager->update_module_data($module_data);
291
292 // Check for last sql error happened
293 if ($this->db->get_sql_error_triggered())
294 {
295 $error = $this->db->sql_error($this->db->get_sql_error_sql());
296 $this->iohandler->add_error_message('INST_ERR_DB', $error['message']);
297 }
298 }
299 }
300
301 $k++;
302
303 // Stop execution if resource limit is reached
304 if ($this->config->get_time_remaining() <= 0 || $this->config->get_memory_remaining() <= 0)
305 {
306 $timed_out = true;
307 break;
308 }
309 }
310
311 $this->config->set('module_info_index', $k);
312
313 // Stop execution if resource limit is reached
314 if ($timed_out)
315 {
316 throw new resource_limit_reached_exception();
317 }
318
319 // Move some of the modules around since the code above will put them in the wrong place
320 if (!$this->config->get('modules_ordered', false))
321 {
322 $this->order_modules($module_class);
323 $this->config->set('modules_ordered', true);
324
325 // Stop execution if resource limit is reached
326 if ($this->config->get_time_remaining() <= 0 || $this->config->get_memory_remaining() <= 0)
327 {
328 throw new resource_limit_reached_exception();
329 }
330 }
331
332 // And now for the special ones
333 // (these are modules which appear in multiple categories and thus get added manually
334 // to some for more control)
335 if (isset($this->module_extras[$module_class]))
336 {
337 $this->add_module_extras($module_class);
338 }
339
340 $this->module_manager->remove_cache_file($module_class);
341
342 $i++;
343
344 $this->config->set('module_class_index', $i);
345 $this->config->set('module_categories_index', 0);
346 $this->config->set('module_info_index', 0);
347 $this->config->set('added_extra_modules', false);
348 $this->config->set('modules_ordered', false);
349 $this->config->set('module_categories_array', array());
350
351 // Stop execution if resource limit is reached
352 if ($this->config->get_time_remaining() <= 0 || $this->config->get_memory_remaining() <= 0)
353 {
354 break;
355 }
356 }
357
358 if ($i < $total)
359 {
360 throw new resource_limit_reached_exception();
361 }
362 }
363
364 /**
365 * Move modules to their correct place
366 *
367 * @param string $module_class
368 */
369 protected function order_modules($module_class)
370 {
371 if ($module_class == 'acp')
372 {
373 // Move main module 4 up...
374 $sql = 'SELECT *
375 FROM ' . MODULES_TABLE . "
376 WHERE module_basename = 'acp_main'
377 AND module_class = 'acp'
378 AND module_mode = 'main'";
379 $result = $this->db->sql_query($sql);
380 $row = $this->db->sql_fetchrow($result);
381 $this->db->sql_freeresult($result);
382
383 $this->module_manager->move_module_by($row, 'acp', 'move_up', 4);
384
385 // Move permissions intro screen module 4 up...
386 $sql = 'SELECT *
387 FROM ' . MODULES_TABLE . "
388 WHERE module_basename = 'acp_permissions'
389 AND module_class = 'acp'
390 AND module_mode = 'intro'";
391 $result = $this->db->sql_query($sql);
392 $row = $this->db->sql_fetchrow($result);
393 $this->db->sql_freeresult($result);
394
395 $this->module_manager->move_module_by($row, 'acp', 'move_up', 4);
396
397 // Move manage users screen module 5 up...
398 $sql = 'SELECT *
399 FROM ' . MODULES_TABLE . "
400 WHERE module_basename = 'acp_users'
401 AND module_class = 'acp'
402 AND module_mode = 'overview'";
403 $result = $this->db->sql_query($sql);
404 $row = $this->db->sql_fetchrow($result);
405 $this->db->sql_freeresult($result);
406
407 $this->module_manager->move_module_by($row, 'acp', 'move_up', 5);
408
409 // Move extension management module 1 up...
410 $sql = 'SELECT *
411 FROM ' . MODULES_TABLE . "
412 WHERE module_langname = 'ACP_EXTENSION_MANAGEMENT'
413 AND module_class = 'acp'
414 AND module_mode = ''
415 AND module_basename = ''";
416 $result = $this->db->sql_query($sql);
417 $row = $this->db->sql_fetchrow($result);
418 $this->db->sql_freeresult($result);
419
420 $this->module_manager->move_module_by($row, 'acp', 'move_up', 1);
421 }
422
423 if ($module_class == 'mcp')
424 {
425 // Move pm report details module 3 down...
426 $sql = 'SELECT *
427 FROM ' . MODULES_TABLE . "
428 WHERE module_basename = 'mcp_pm_reports'
429 AND module_class = 'mcp'
430 AND module_mode = 'pm_report_details'";
431 $result = $this->db->sql_query($sql);
432 $row = $this->db->sql_fetchrow($result);
433 $this->db->sql_freeresult($result);
434
435 $this->module_manager->move_module_by($row, 'mcp', 'move_down', 3);
436
437 // Move closed pm reports module 3 down...
438 $sql = 'SELECT *
439 FROM ' . MODULES_TABLE . "
440 WHERE module_basename = 'mcp_pm_reports'
441 AND module_class = 'mcp'
442 AND module_mode = 'pm_reports_closed'";
443 $result = $this->db->sql_query($sql);
444 $row = $this->db->sql_fetchrow($result);
445 $this->db->sql_freeresult($result);
446
447 $this->module_manager->move_module_by($row, 'mcp', 'move_down', 3);
448
449 // Move open pm reports module 3 down...
450 $sql = 'SELECT *
451 FROM ' . MODULES_TABLE . "
452 WHERE module_basename = 'mcp_pm_reports'
453 AND module_class = 'mcp'
454 AND module_mode = 'pm_reports'";
455 $result = $this->db->sql_query($sql);
456 $row = $this->db->sql_fetchrow($result);
457 $this->db->sql_freeresult($result);
458
459 $this->module_manager->move_module_by($row, 'mcp', 'move_down', 3);
460 }
461
462 if ($module_class == 'ucp')
463 {
464 // Move attachment module 4 down...
465 $sql = 'SELECT *
466 FROM ' . MODULES_TABLE . "
467 WHERE module_basename = 'ucp_attachments'
468 AND module_class = 'ucp'
469 AND module_mode = 'attachments'";
470 $result = $this->db->sql_query($sql);
471 $row = $this->db->sql_fetchrow($result);
472 $this->db->sql_freeresult($result);
473
474 $this->module_manager->move_module_by($row, 'ucp', 'move_down', 4);
475
476 // Move notification options module 4 down...
477 $sql = 'SELECT *
478 FROM ' . MODULES_TABLE . "
479 WHERE module_basename = 'ucp_notifications'
480 AND module_class = 'ucp'
481 AND module_mode = 'notification_options'";
482 $result = $this->db->sql_query($sql);
483 $row = $this->db->sql_fetchrow($result);
484 $this->db->sql_freeresult($result);
485
486 $this->module_manager->move_module_by($row, 'ucp', 'move_down', 4);
487
488 // Move OAuth module 5 down...
489 $sql = 'SELECT *
490 FROM ' . MODULES_TABLE . "
491 WHERE module_basename = 'ucp_auth_link'
492 AND module_class = 'ucp'
493 AND module_mode = 'auth_link'";
494 $result = $this->db->sql_query($sql);
495 $row = $this->db->sql_fetchrow($result);
496 $this->db->sql_freeresult($result);
497
498 $this->module_manager->move_module_by($row, 'ucp', 'move_down', 5);
499 }
500 }
501
502 /**
503 * Add extra modules
504 *
505 * @param string $module_class
506 */
507 protected function add_module_extras($module_class)
508 {
509 foreach ($this->module_extras[$module_class] as $cat_name => $mods)
510 {
511 $sql = 'SELECT module_id, left_id, right_id
512 FROM ' . MODULES_TABLE . "
513 WHERE module_langname = '" . $this->db->sql_escape($cat_name) . "'
514 AND module_class = '" . $this->db->sql_escape($module_class) . "'";
515 $result = $this->db->sql_query_limit($sql, 1);
516 $row2 = $this->db->sql_fetchrow($result);
517 $this->db->sql_freeresult($result);
518
519 foreach ($mods as $mod_name)
520 {
521 $sql = 'SELECT *
522 FROM ' . MODULES_TABLE . "
523 WHERE module_langname = '" . $this->db->sql_escape($mod_name) . "'
524 AND module_class = '" . $this->db->sql_escape($module_class) . "'
525 AND module_basename <> ''";
526 $result = $this->db->sql_query_limit($sql, 1);
527 $row = $this->db->sql_fetchrow($result);
528 $this->db->sql_freeresult($result);
529
530 $module_data = array(
531 'module_basename' => $row['module_basename'],
532 'module_enabled' => (int) $row['module_enabled'],
533 'module_display' => (int) $row['module_display'],
534 'parent_id' => (int) $row2['module_id'],
535 'module_class' => $row['module_class'],
536 'module_langname' => $row['module_langname'],
537 'module_mode' => $row['module_mode'],
538 'module_auth' => $row['module_auth'],
539 );
540
541 $this->module_manager->update_module_data($module_data);
542
543 // Check for last sql error happened
544 if ($this->db->get_sql_error_triggered())
545 {
546 $error = $this->db->sql_error($this->db->get_sql_error_sql());
547 $this->iohandler->add_error_message('INST_ERR_DB', $error['message']);
548 }
549 }
550 }
551 }
552
553 /**
554 * {@inheritdoc}
555 */
556 static public function get_step_count()
557 {
558 return 1;
559 }
560
561 /**
562 * {@inheritdoc}
563 */
564 public function get_task_lang_name()
565 {
566 return 'TASK_ADD_MODULES';
567 }
568 }
569