system.module 121 KB
Newer Older
Dries Buytaert's avatar
 
Dries Buytaert committed
1
<?php
2
// $Id$
Dries Buytaert's avatar
 
Dries Buytaert committed
3

Dries Buytaert's avatar
   
Dries Buytaert committed
4
5
6
7
8
/**
 * @file
 * Configuration system that lets administrators modify the workings of the site.
 */

9
10
11
/**
 * Maximum age of temporary files in seconds.
 */
12
define('DRUPAL_MAXIMUM_TEMP_FILE_AGE', 21600);
13

14
15
16
17
18
/**
 * Default interval for automatic cron executions in seconds.
 */
define('DRUPAL_CRON_DEFAULT_THRESHOLD', 10800);

19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
/**
 * New users will be set to the default time zone at registration.
 */
define('DRUPAL_USER_TIMEZONE_DEFAULT', 0);

/**
 * New users will get an empty time zone at registration.
 */
define('DRUPAL_USER_TIMEZONE_EMPTY', 1);

/**
 * New users will select their own timezone at registration.
 */
define('DRUPAL_USER_TIMEZONE_SELECT', 2);

34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
 /**
 * Disabled option on forms and settings
 */
define('DRUPAL_DISABLED', 0);

/**
 * Optional option on forms and settings
 */
define('DRUPAL_OPTIONAL', 1);

/**
 * Required option on forms and settings
 */
define('DRUPAL_REQUIRED', 2);

49
50
51
52
53
54
55
56
57
58
/**
 * Return only visible regions. @see system_region_list().
 */
define('REGIONS_VISIBLE', 'visible');

/**
 * Return all visible regions. @see system_region_list().
 */
define('REGIONS_ALL', 'all');

Dries Buytaert's avatar
   
Dries Buytaert committed
59
/**
60
 * Implements hook_help().
Dries Buytaert's avatar
   
Dries Buytaert committed
61
 */
62
function system_help($path, $arg) {
63
64
  global $base_url;

65
  switch ($path) {
66
    case 'admin/help#system':
67
68
      $output = '';
      $output .= '<h3>' . t('About') . '</h3>';
69
      $output .= '<p>' . t('The System module is integral to the site, and provides basic but extensible functionality for use by other modules and themes. Some integral elements of Drupal are contained in and managed by the System module, including caching, enabling and disabling modules and themes, preparing and displaying the administrative page, and configuring fundamental site settings. A number of key system maintenance operations are also part of the System module. For more information, see the online handbook entry for <a href="@system">System module</a>.', array('@system' => 'http://drupal.org/handbook/modules/system')) . '</p>';
70
71
72
      $output .= '<h3>' . t('Uses') . '</h3>';
      $output .= '<dl>';
      $output .= '<dt>' . t('Managing modules') . '</dt>';
73
      $output .= '<dd>' . t('The System module allows users with the appropriate permissions to enable and disable modules on the <a href="@modules">Modules administration page</a>. Drupal comes with a number of core modules, and each module provides a discrete set of features and may be enabled or disabled depending on the needs of the site. Many additional modules contributed by members of the Drupal community are available for download at the <a href="@drupal-modules">Drupal.org module page</a>.', array('@modules' => url('admin/modules'), '@drupal-modules' => 'http://drupal.org/project/modules')) . '</dd>';
74
75
76
77
78
      $output .= '<dt>' . t('Managing themes') . '</dt>';
      $output .= '<dd>' . t('The System module allows users with the appropriate permissions to enable and disable themes on the <a href="@themes">Appearance administration page</a>. Themes determine the design and presentation of your site. Drupal comes packaged with several core themes, and additional contributed themes are available at the <a href="@drupal-themes">Drupal.org theme page</a>.', array('@themes' => url('admin/appearance'), '@drupal-themes' => 'http://drupal.org/project/themes')) . '</dd>';
      $output .= '<dt>' . t('Managing caching') . '</dt>';
      $output .= '<dd>' . t("The System module allows users with the appropriate permissions to manage caching on the <a href='@cache-settings'>Performance settings page</a>. Drupal has a robust caching system that allows the efficient re-use of previously-constructed web pages and web page components. Pages requested by anonymous users are stored in a compressed format; depending on your site configuration and the amount of your web traffic tied to anonymous visitors, the caching system may significantly increase the speed of your site.", array('@cache-settings' => url('admin/config/development/performance'))) . '</dd>';
      $output .= '<dt>' . t('Performing system maintenance') . '</dt>';
79
      $output .= '<dd>' . t('In order for the site and its modules to continue to operate well, a set of routine administrative operations must run on a regular basis. The System module manages this task by making use of a system cron job. You can verify the status of cron tasks by visiting the <a href="@status">Status report page</a>. For more information, see the online handbook entry for <a href="@handbook">configuring cron jobs</a>.', array('@status' => url('admin/reports/status'), '@handbook' => 'http://drupal.org/cron')) . '</dd>';
80
81
      $output .= '<dt>' . t('Configuring basic site settings') . '</dt>';
      $output .= '<dd>' . t('The System module also handles basic configuration options for your site, including <a href="@date-time-settings">Date and time settings</a>, <a href="@file-system">File system settings</a>, <a href="@clean-url">Clean URL support</a>, <a href="@site-info">Site name and other information</a>, and a <a href="@maintenance-mode">Maintenance mode</a> for taking your site temporarily offline.', array('@date-time-settings' => url('admin/config/regional/date-time'), '@file-system' => url('admin/config/media/file-system'), '@clean-url' => url('admin/config/search/clean-urls'), '@site-info' => url('admin/config/system/site-information'), '@maintenance-mode' => url('admin/config/development/maintenance'))) . '</dd>';
82
83
      $output .= '<dt>' . t('Configuring actions') . '</dt>';
      $output .= '<dd>' . t('Actions are individual tasks that the system can do, such as unpublishing a piece of content or banning a user. Modules, such as the <a href="@trigger-help">Trigger module</a>, can fire these actions when certain system events happen; for example, when a new post is added or when a user logs in. Modules may also provide additional actions. Visit the <a href="@actions">Actions page</a> to configure actions.', array('@trigger-help' => url('admin/help/trigger'), '@actions' => url('admin/config/system/actions'))) . '</dd>';
84
      $output .= '</dl>';
85
      return $output;
86
    case 'admin/by-module':
87
      return '<p>' . t('This page shows you all available administration tasks for each module.') . '</p>';
88
    case 'admin/appearance':
89
      $output = '<p>' . t('Set and configure the default theme for your website.  Alternative <a href="@themes">themes</a> are available.', array('@themes' => 'http://drupal.org/project/themes')) . '</p>';
90
      return $output;
91
92
    case 'admin/appearance/settings/' . $arg[3]:
      $reference = explode('.', $arg[3], 2);
93
      $theme = array_pop($reference);
94
95
      return '<p>' . t('These options control the display settings for the <code>%template</code> theme. When your site is displayed using this theme, these settings will be used. By clicking "Reset to defaults," you can choose to use the <a href="@global">global settings</a> for this theme.', array('%template' => $theme, '@global' => url('admin/appearance/settings'))) . '</p>';
    case 'admin/appearance/settings':
96
      return '<p>' . t('These options control the default display settings for your entire site, across all themes. Unless they have been overridden by a specific theme, these settings will be used.') . '</p>';
97
    case 'admin/modules':
98
      $output = '<p>' . t('Download additional <a href="@modules">contributed modules</a> to extend Drupal\'s functionality.', array('@modules' => 'http://drupal.org/project/modules')) . '</p>';
99
100
      if (module_exists('update')) {
        if (update_manager_access()) {
101
          $output .= '<p>' . t('Regularly review and install <a href="@updates">available updates</a> to maintain a secure and current site. Always run the <a href="@update-php">update script</a> each time a module is updated.', array('@update-php' => $base_url . '/update.php', '@updates' => url('admin/reports/updates'))) . '</p>';
102
103
        }
        else {
104
          $output .= '<p>' . t('Regularly review <a href="@updates">available updates</a> to maintain a secure and current site. Always run the <a href="@update-php">update script</a> each time a module is updated.', array('@update-php' => $base_url . '/update.php', '@updates' => url('admin/reports/updates'))) . '</p>';
105
106
107
        }
      }
      else {
108
        $output .= '<p>' . t('Regularly review available updates to maintain a secure and current site. Always run the <a href="@update-php">update script</a> each time a module is updated. Enable the Update manager module to update and install modules and themes.', array('@update-php' => $base_url . '/update.php')) . '</p>';
109
      }
110
      return $output;
111
112
    case 'admin/modules/uninstall':
      return '<p>' . t('The uninstall process removes all data related to a module. To uninstall a module, you must first disable it on the main <a href="@modules">Modules page</a>. Not all modules support this feature.', array('@modules' => url('admin/modules'))) . '</p>';
113
    case 'admin/structure/block/manage':
114
      if ($arg[4] == 'system' && $arg[5] == 'powered-by') {
115
        return '<p>' . t('The <em>Powered by Drupal</em> block is an optional link to the home page of the Drupal project. While there is absolutely no requirement that sites feature this link, it may be used to show support for Drupal.') . '</p>';
116
      }
117
      break;
118
    case 'admin/config/development/maintenance':
119
120
      global $user;
      if ($user->uid == 1) {
121
        return '<p>' . t('If you are upgrading to a newer version of Drupal or upgrading contributed modules or themes, you may need to run the <a href="@update-php">update script</a>.', array('@update-php' => $base_url . '/update.php')) . '</p>';
122
      }
123
124
    case 'admin/config/system/actions':
    case 'admin/config/system/actions/manage':
125
      $output = '';
126
      $output .= '<p>' . t('There are two types of actions: simple and advanced. Simple actions do not require any additional configuration, and are listed here automatically. Advanced actions need to be created and configured before they can be used, because they have options that need to be specified; for example, sending an e-mail to a specified address, or unpublishing content containing certain words. To create an advanced action, select the action from the drop-down list in the advanced action section below and click the <em>Create</em> button.') . '</p>';
127
      if (module_exists('trigger')) {
128
        $output .= '<p>' . t('You may proceed to the <a href="@url">Triggers</a> page to assign these actions to system events.', array('@url' => url('admin/structure/trigger'))) . '</p>';
129
      }
130
      return $output;
131
    case 'admin/config/system/actions/configure':
132
      return t('An advanced action offers additional configuration options which may be filled out below. Changing the <em>Description</em> field is recommended, in order to better identify the precise action taking place. This description will be displayed in modules such as the Trigger module when assigning actions to system events, so it is best if it is as descriptive as possible (for example, "Send e-mail to Moderation Team" rather than simply "Send e-mail").');
133
    case 'admin/config/people/ip-blocking':
134
      return '<p>' . t('IP addresses listed here are blocked from your site before any modules are loaded. You may add IP addresses to the list, or delete existing entries.') . '</p>';
135
    case 'admin/reports/status':
136
      return '<p>' . t("Here you can find a short overview of your site's parameters as well as any problems detected with your installation. It may be useful to copy and paste this information into support requests filed on drupal.org's support forums and project issue queues.") . '</p>';
137
  }
Dries Buytaert's avatar
   
Dries Buytaert committed
138
139
}

140
/**
141
 * Implements hook_theme().
142
 */
143
function system_theme() {
144
  return array_merge(drupal_common_theme(), array(
145
146
    'system_themes_page' => array(
      'variables' => array('theme_groups' => NULL),
147
      'file' => 'system.admin.inc',
148
    ),
149
    'system_settings_form' => array(
150
      'render element' => 'form',
151
152
    ),
    'confirm_form' => array(
153
      'render element' => 'form',
154
    ),
155
    'system_modules_fieldset' => array(
156
      'render element' => 'form',
157
      'file' => 'system.admin.inc',
158
    ),
159
    'system_modules_incompatible' => array(
160
      'variables' => array('message' => NULL),
161
      'file' => 'system.admin.inc',
162
    ),
163
    'system_modules_uninstall' => array(
164
      'render element' => 'form',
165
      'file' => 'system.admin.inc',
166
167
    ),
    'status_report' => array(
168
      'render element' => 'requirements',
169
      'file' => 'system.admin.inc',
170
171
    ),
    'admin_page' => array(
172
      'variables' => array('blocks' => NULL),
173
      'file' => 'system.admin.inc',
174
175
    ),
    'admin_block' => array(
176
      'variables' => array('block' => NULL),
177
      'file' => 'system.admin.inc',
178
179
    ),
    'admin_block_content' => array(
180
      'variables' => array('content' => NULL),
181
      'file' => 'system.admin.inc',
182
183
    ),
    'system_admin_by_module' => array(
184
      'variables' => array('menu_items' => NULL),
185
      'file' => 'system.admin.inc',
186
    ),
187
    'system_powered_by' => array(
188
      'variables' => array(),
189
    ),
190
191
    'system_compact_link' => array(
      'variables' => array(),
192
    ),
193
    'system_date_time_settings' => array(
194
      'render element' => 'form',
195
196
      'file' => 'system.admin.inc',
    ),
197
198
  ));
}
199

Dries Buytaert's avatar
   
Dries Buytaert committed
200
/**
201
 * Implements hook_permission().
Dries Buytaert's avatar
   
Dries Buytaert committed
202
 */
203
function system_permission() {
204
  return array(
205
206
207
    'administer modules' => array(
      'title' => t('Administer modules'),
    ),
208
209
    'administer site configuration' => array(
      'title' => t('Administer site configuration'),
210
      'description' => drupal_placeholder(array('text' => t('Warning: Give to trusted roles only; this permission has security implications.'))),
211
    ),
212
213
214
    'administer themes' => array(
      'title' => t('Administer themes'),
    ),
215
    'administer software updates' => array(
216
      'title' => t('Run software updates'),
217
    ),
218
219
220
221
    'administer actions' => array(
      'title' => t('Administer actions'),
    ),
    'access administration pages' => array(
222
      'title' => t('Use the administration pages and help'),
223
    ),
224
    'access site in maintenance mode' => array(
225
      'title' => t('Use the site in maintenance mode'),
226
    ),
227
    'access site reports' => array(
228
      'title' => t('View site reports'),
229
230
231
232
    ),
    'block IP addresses' => array(
      'title' => t('Block IP addresses'),
    ),
233
  );
Dries Buytaert's avatar
   
Dries Buytaert committed
234
235
}

236
/**
237
 * Implements hook_hook_info().
238
239
240
241
242
 */
function system_hook_info() {
  $hooks['token_info'] = array(
    'group' => 'tokens',
  );
243
244
245
  $hooks['token_info_alter'] = array(
    'group' => 'tokens',
  );
246
247
248
249
250
251
  $hooks['tokens'] = array(
    'group' => 'tokens',
  );
  return $hooks;
}

252
/**
253
 * Implements hook_entity_info().
254
255
256
257
258
259
260
261
262
263
264
265
266
267
 */
function system_entity_info() {
  return array(
    'file' => array(
      'label' => t('File'),
      'base table' => 'file',
      'object keys' => array(
        'id' => 'fid',
      ),
      'static cache' => FALSE,
    ),
  );
}

268
/**
269
 * Implements hook_element_info().
270
 */
271
272
273
function system_element_info() {
  // Top level elements.
  $types['form'] = array(
274
275
    '#method' => 'post',
    '#action' => request_uri(),
276
    '#theme_wrappers' => array('form'),
277
  );
278
  $types['page'] = array(
279
280
    '#show_messages' => TRUE,
    '#theme' => 'page',
281
    '#theme_wrappers' => array('html'),
282
  );
283
  $types['list'] = array(
284
285
286
287
288
    '#title' => '',
    '#list_type' => 'ul',
    '#attributes' => array(),
    '#items' => array(),
  );
289
290
291
292
293
294
295
  // By default, we don't want AJAX commands being rendered in the context of an
  // HTML page, so we don't provide defaults for #theme or #theme_wrappers.
  // However, modules can set these properties (for example, to provide an HTML
  // debugging page that displays rather than executes AJAX commands).
  $types['ajax_commands'] = array(
    '#ajax_commands' => array(),
  );
296
297
  $types['html_tag'] = array(
    '#theme' => 'html_tag',
298
    '#pre_render' => array('drupal_pre_render_conditional_comments'),
299
300
301
    '#attributes' => array(),
    '#value' => NULL,
  );
302
303
304
305
306
307
  $types['styles'] = array(
    '#items' => array(),
    '#pre_render' => array('drupal_pre_render_styles'),
    '#group_callback' => 'drupal_group_css',
    '#aggregate_callback' => 'drupal_aggregate_css',
  );
308

309
310
  // Input elements.
  $types['submit'] = array(
311
312
313
314
    '#input' => TRUE,
    '#name' => 'op',
    '#button_type' => 'submit',
    '#executes_submit_callback' => TRUE,
315
    '#process' => array('ajax_process_form'),
316
    '#theme_wrappers' => array('button'),
317
  );
318
  $types['button'] = array(
319
320
321
322
    '#input' => TRUE,
    '#name' => 'op',
    '#button_type' => 'submit',
    '#executes_submit_callback' => FALSE,
323
    '#process' => array('ajax_process_form'),
324
    '#theme_wrappers' => array('button'),
325
  );
326
  $types['image_button'] = array(
327
328
329
    '#input' => TRUE,
    '#button_type' => 'submit',
    '#executes_submit_callback' => TRUE,
330
    '#process' => array('ajax_process_form'),
331
332
333
    '#return_value' => TRUE,
    '#has_garbage_value' => TRUE,
    '#src' => NULL,
334
    '#theme_wrappers' => array('image_button'),
335
  );
336
  $types['textfield'] = array(
337
338
339
340
    '#input' => TRUE,
    '#size' => 60,
    '#maxlength' => 128,
    '#autocomplete_path' => FALSE,
341
    '#process' => array('ajax_process_form'),
342
    '#theme' => 'textfield',
343
    '#theme_wrappers' => array('form_element'),
344
  );
345
  $types['password'] = array(
346
347
348
    '#input' => TRUE,
    '#size' => 60,
    '#maxlength' => 128,
349
    '#process' => array('ajax_process_form'),
350
    '#theme' => 'password',
351
    '#theme_wrappers' => array('form_element'),
352
  );
353
  $types['password_confirm'] = array(
354
    '#input' => TRUE,
355
    '#process' => array('form_process_password_confirm', 'user_form_process_password_confirm'),
356
    '#theme_wrappers' => array('form_element'),
357
  );
358
  $types['textarea'] = array(
359
360
361
362
    '#input' => TRUE,
    '#cols' => 60,
    '#rows' => 5,
    '#resizable' => TRUE,
363
    '#process' => array('ajax_process_form'),
364
    '#theme' => 'textarea',
365
    '#theme_wrappers' => array('form_element'),
366
  );
367
  $types['radios'] = array(
368
    '#input' => TRUE,
369
    '#process' => array('form_process_radios'),
370
    '#theme_wrappers' => array('radios'),
371
    '#pre_render' => array('form_pre_render_conditional_form_element'),
372
  );
373
  $types['radio'] = array(
374
375
    '#input' => TRUE,
    '#default_value' => NULL,
376
    '#process' => array('ajax_process_form'),
377
    '#theme' => 'radio',
378
    '#theme_wrappers' => array('form_element'),
379
    '#title_display' => 'after',
380
  );
381
  $types['checkboxes'] = array(
382
383
    '#input' => TRUE,
    '#tree' => TRUE,
384
    '#process' => array('form_process_checkboxes'),
385
    '#theme_wrappers' => array('checkboxes'),
386
    '#pre_render' => array('form_pre_render_conditional_form_element'),
387
  );
388
  $types['checkbox'] = array(
389
390
    '#input' => TRUE,
    '#return_value' => 1,
391
    '#process' => array('ajax_process_form'),
392
    '#theme' => 'checkbox',
393
    '#theme_wrappers' => array('form_element'),
394
    '#title_display' => 'after',
395
  );
396
  $types['select'] = array(
397
398
399
    '#input' => TRUE,
    '#size' => 0,
    '#multiple' => FALSE,
400
    '#process' => array('ajax_process_form'),
401
    '#theme' => 'select',
402
    '#theme_wrappers' => array('form_element'),
403
  );
404
  $types['weight'] = array(
405
406
407
    '#input' => TRUE,
    '#delta' => 10,
    '#default_value' => 0,
408
    '#process' => array('form_process_weight', 'ajax_process_form'),
409
  );
410
  $types['date'] = array(
411
412
    '#input' => TRUE,
    '#element_validate' => array('date_validate'),
413
    '#process' => array('form_process_date'),
414
    '#theme' => 'date',
415
    '#theme_wrappers' => array('form_element'),
416
  );
417
  $types['file'] = array(
418
419
    '#input' => TRUE,
    '#size' => 60,
420
    '#theme' => 'file',
421
    '#theme_wrappers' => array('form_element'),
422
  );
423
  $types['tableselect'] = array(
424
425
426
427
428
429
    '#input' => TRUE,
    '#js_select' => TRUE,
    '#multiple' => TRUE,
    '#process' => array('form_process_tableselect'),
    '#options' => array(),
    '#empty' => '',
430
    '#theme' => 'tableselect',
431
  );
432

433
434
  // Form structure.
  $types['item'] = array(
435
    '#markup' => '',
436
    '#pre_render' => array('drupal_pre_render_markup'),
437
    '#theme_wrappers' => array('form_element'),
438
  );
439
  $types['hidden'] = array(
440
    '#input' => TRUE,
441
    '#process' => array('ajax_process_form'),
442
    '#theme' => 'hidden',
443
  );
444
  $types['value'] = array(
445
446
    '#input' => TRUE,
  );
447
  $types['markup'] = array(
448
    '#markup' => '',
449
450
451
452
    '#pre_render' => array('drupal_pre_render_markup'),
  );
  $types['link'] = array(
    '#pre_render' => array('drupal_pre_render_link', 'drupal_pre_render_markup'),
453
  );
454
  $types['fieldset'] = array(
455
456
457
    '#collapsible' => FALSE,
    '#collapsed' => FALSE,
    '#value' => NULL,
458
    '#process' => array('form_process_fieldset', 'ajax_process_form'),
459
    '#pre_render' => array('form_pre_render_fieldset'),
460
    '#theme_wrappers' => array('fieldset'),
461
  );
462
  $types['vertical_tabs'] = array(
463
    '#theme_wrappers' => array('vertical_tabs'),
464
465
466
    '#default_tab' => '',
    '#process' => array('form_process_vertical_tabs'),
  );
467
468
469
470
471
472

  $types['container'] = array(
    '#theme_wrappers' => array('container'),
    '#process' => array('form_process_container'),
  );

473
  $types['token'] = array(
474
    '#input' => TRUE,
475
    '#theme' => 'hidden',
476
477
  );

478
  return $types;
479
480
}

Dries Buytaert's avatar
   
Dries Buytaert committed
481
/**
482
 * Implements hook_menu().
Dries Buytaert's avatar
   
Dries Buytaert committed
483
 */
484
485
function system_menu() {
  $items['system/files'] = array(
486
    'title' => 'File download',
487
    'page callback' => 'file_download',
488
489
490
491
492
493
494
495
    'page arguments' => array('private'),
    'access callback' => TRUE,
    'type' => MENU_CALLBACK,
  );
  $items['system/temporary'] = array(
    'title' => 'Temporary files',
    'page callback' => 'file_download',
    'page arguments' => array('temporary'),
496
    'access callback' => TRUE,
497
498
    'type' => MENU_CALLBACK,
  );
499
  $items['system/ajax'] = array(
500
    'title' => 'AHAH callback',
501
    'page callback' => 'ajax_form_callback',
502
    'delivery callback' => 'ajax_deliver',
503
    'access callback' => TRUE,
504
    'type' => MENU_CALLBACK,
505
506
    'file path' => 'includes',
    'file' => 'form.inc',
507
  );
508
509
510
511
512
  $items['system/timezone'] = array(
    'title' => 'Time zone',
    'page callback' => 'system_timezone',
    'access callback' => TRUE,
    'type' => MENU_CALLBACK,
513
    'file' => 'system.admin.inc',
514
  );
515
  $items['admin'] = array(
516
    'title' => 'Administer',
517
518
519
    'access arguments' => array('access administration pages'),
    'page callback' => 'system_main_admin_page',
    'weight' => 9,
520
    'menu_name' => 'management',
521
522
    'theme callback' => 'variable_get',
    'theme arguments' => array('admin_theme'),
523
    'file' => 'system.admin.inc',
524
525
  );
  $items['admin/compact'] = array(
526
    'title' => 'Compact mode',
527
    'page callback' => 'system_admin_compact_page',
528
    'access arguments' => array('access administration pages'),
529
    'type' => MENU_CALLBACK,
530
    'file' => 'system.admin.inc',
531
532
  );
  $items['admin/by-task'] = array(
533
    'title' => 'By task',
534
    'page callback' => 'system_main_admin_page',
535
    'access arguments' => array('access administration pages'),
536
    'type' => MENU_DEFAULT_LOCAL_TASK,
537
    'file' => 'system.admin.inc',
538
539
  );
  $items['admin/by-module'] = array(
540
    'title' => 'By module',
541
    'page callback' => 'system_admin_by_module',
542
    'access arguments' => array('access administration pages'),
543
544
    'type' => MENU_LOCAL_TASK,
    'weight' => 2,
545
    'file' => 'system.admin.inc',
546
  );
547

548
  // Menu items that are basically just menu blocks.
549
550
  $items['admin/structure'] = array(
    'title' => 'Structure',
551
    'description' => 'Administer blocks, content types, menus, etc.',
552
    'position' => 'right',
553
    'weight' => -8,
554
    'page callback' => 'system_admin_menu_block_page',
555
    'access arguments' => array('access administration pages'),
556
    'file' => 'system.admin.inc',
557
  );
558
559
560
  // Appearance.
  $items['admin/appearance'] = array(
    'title' => 'Appearance',
561
    'description' => 'Select and configure your themes',
562
    'page callback' => 'system_themes_page',
563
    'access arguments' => array('administer themes'),
564
    'position' => 'left',
565
    'weight' => -6,
566
    'file' => 'system.admin.inc',
567
  );
568
  $items['admin/appearance/list'] = array(
569
    'title' => 'List',
570
    'description' => 'Select and configure your theme',
571
572
    'type' => MENU_DEFAULT_LOCAL_TASK,
    'weight' => -1,
573
    'file' => 'system.admin.inc',
574
  );
575
576
577
  $items['admin/appearance/enable'] = array(
    'title' => 'Enable theme',
    'page callback' => 'system_theme_enable',
578
    'access arguments' => array('administer themes'),
579
580
581
582
583
584
    'type' => MENU_CALLBACK,
    'file' => 'system.admin.inc',
  );
  $items['admin/appearance/disable'] = array(
    'title' => 'Disable theme',
    'page callback' => 'system_theme_disable',
585
    'access arguments' => array('administer themes'),
586
587
588
589
590
591
    'type' => MENU_CALLBACK,
    'file' => 'system.admin.inc',
  );
  $items['admin/appearance/default'] = array(
    'title' => 'Set default theme',
    'page callback' => 'system_theme_default',
592
    'access arguments' => array('administer themes'),
593
594
595
    'type' => MENU_CALLBACK,
    'file' => 'system.admin.inc',
  );
596
  $items['admin/appearance/settings'] = array(
597
    'title' => 'Settings',
598
    'description' => 'Configure default and theme specific settings.',
599
    'page callback' => 'drupal_get_form',
600
    'page arguments' => array('system_theme_settings'),
601
    'access arguments' => array('administer themes'),
602
    'type' => MENU_LOCAL_TASK,
603
    'file' => 'system.admin.inc',
604
    'weight' => 20,
605
  );
606
  // Theme configuration subtabs.
607
  $items['admin/appearance/settings/global'] = array(
608
    'title' => 'Global settings',
609
610
611
    'type' => MENU_DEFAULT_LOCAL_TASK,
    'weight' => -1,
  );
Dries Buytaert's avatar
   
Dries Buytaert committed
612

613
  foreach (list_themes() as $theme) {
614
    $items['admin/appearance/settings/' . $theme->name] = array(
615
616
617
618
619
      'title' => $theme->info['name'],
      'page arguments' => array('system_theme_settings', $theme->name),
      'type' => MENU_LOCAL_TASK,
      'access callback' => '_system_themes_access',
      'access arguments' => array($theme),
620
      'file' => 'system.admin.inc',
621
    );
Dries Buytaert's avatar
   
Dries Buytaert committed
622
  }
623

624
  // Modules.
625
  $items['admin/modules'] = array(
626
    'title' => 'Modules',
627
    'description' => 'Enable or disable modules',
628
629
    'page callback' => 'drupal_get_form',
    'page arguments' => array('system_modules'),
630
    'access arguments' => array('administer modules'),
631
    'file' => 'system.admin.inc',
632
    'weight' => -2,
633
  );
634
  $items['admin/modules/list'] = array(
635
    'title' => 'List',
636
637
    'type' => MENU_DEFAULT_LOCAL_TASK,
  );
638
  $items['admin/modules/list/confirm'] = array(
639
    'title' => 'List',
640
    'access arguments' => array('administer modules'),
641
642
    'type' => MENU_CALLBACK,
  );
643
  $items['admin/modules/uninstall'] = array(
644
    'title' => 'Uninstall',
645
    'page arguments' => array('system_modules_uninstall'),
646
    'access arguments' => array('administer modules'),
647
    'type' => MENU_LOCAL_TASK,
648
    'file' => 'system.admin.inc',
649
    'weight' => 20,
650
  );
651
  $items['admin/modules/uninstall/confirm'] = array(
652
    'title' => 'Uninstall',
653
    'access arguments' => array('administer modules'),
654
    'type' => MENU_CALLBACK,
655
656
657
    'file' => 'system.admin.inc',
  );

658
  // Configuration.
659
660
  $items['admin/config'] = array(
    'title' => 'Configuration',
661
    'description' => 'Administer settings',
662
663
    'page callback' => 'system_admin_config_page',
    'access arguments' => array('access administration pages'),
664
    'file' => 'system.admin.inc',
665
666
  );

667
  // IP address blocking.
668
  $items['admin/config/people/ip-blocking'] = array(
669
670
671
672
    'title' => 'IP address blocking',
    'description' => 'Manage blocked IP addresses.',
    'page callback' => 'system_ip_blocking',
    'access arguments' => array('block IP addresses'),
673
    'file' => 'system.admin.inc',
674
  );
675
  $items['admin/config/people/ip-blocking/delete/%blocked_ip'] = array(
676
677
    'title' => 'Delete IP address',
    'page callback' => 'drupal_get_form',
678
    'page arguments' => array('system_ip_blocking_delete', 5),
679
680
    'access arguments' => array('block IP addresses'),
    'type' => MENU_CALLBACK,
681
    'file' => 'system.admin.inc',
682
683
  );

684
  // Media settings.
685
  $items['admin/config/media'] = array(
686
687
688
689
690
    'title' => 'Media',
    'description' => 'Media tools.',
    'position' => 'left',
    'weight' => 10,
    'page callback' => 'system_admin_menu_block_page',
691
    'access arguments' => array('access administration pages'),
692
    'file' => 'system.admin.inc',
693
694
  );
  $items['admin/config/media/file-system'] = array(
695
    'title' => 'File system',
696
    'description' => 'Tell Drupal where to store uploaded files and how they are accessed.',
697
    'page callback' => 'drupal_get_form',
698
    'page arguments' => array('system_file_system_settings'),
699
    'access arguments' => array('administer site configuration'),
700
    'weight' => 10,
701
    'file' => 'system.admin.inc',
702
  );
703
704
705
    $items['admin/config/media/image-toolkit'] = array(
    'title' => 'Image toolkit',
    'description' => 'Choose which image toolkit to use if you have installed optional toolkits.',
706
    'page callback' => 'drupal_get_form',
707
    'page arguments' => array('system_image_toolkit_settings'),
708
    'access arguments' => array('administer site configuration'),
709
    'weight' => 20,
710
711
    'file' => 'system.admin.inc',
  );
712
713

  // Service settings.
714
715
716
717
  $items['admin/config/services'] = array(
    'title' => 'Web services',
    'description' => 'Tools related to web services.',
    'page callback' => 'system_admin_menu_block_page',
718
    'access arguments' => array('access administration pages'),
719
720
    'file' => 'system.admin.inc',
  );
721
722
723
724
725
726
727
728
  $items['admin/config/services/rss-publishing'] = array(
    'title' => 'RSS publishing',
    'description' => 'Configure the site description, the number of items per feed and whether feeds should be titles/teasers/full-text.',
    'page callback' => 'drupal_get_form',
    'page arguments' => array('system_rss_feeds_settings'),
    'access arguments' => array('administer site configuration'),
    'file' => 'system.admin.inc',
  );
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745

  // Development settings.
  $items['admin/config/development'] = array(
    'title' => 'Development',
    'description' => 'Development tools.',
    'position' => 'left',
    'weight' => 10,
    'page callback' => 'system_admin_menu_block_page',
    'access arguments' => array('access administration pages'),
    'file' => 'system.admin.inc',
  );
  $items['admin/config/development/maintenance'] = array(
    'title' => 'Maintenance mode',
    'description' => 'Take the site offline for maintenance or bring it back online.',
    'page callback' => 'drupal_get_form',
    'page arguments' => array('system_site_maintenance_mode'),
    'access arguments' => array('administer site configuration'),
746
    'weight' => 50,
747
748
749
750
751
752
753
754
    'file' => 'system.admin.inc',
  );
  $items['admin/config/development/performance'] = array(
    'title' => 'Performance',
    'description' => 'Enable or disable page caching for anonymous users and set CSS and JS bandwidth optimization options.',
    'page callback' => 'drupal_get_form',
    'page arguments' => array('system_performance_settings'),
    'access arguments' => array('administer site configuration'),
755
    'weight' => -10,
756
757
    'file' => 'system.admin.inc',
  );
758
  $items['admin/config/development/logging'] = array(
759
760
    'title' => 'Logging and errors',
    'description' => "Settings for logging and alerts modules. Various modules can route Drupal's system events to different destinations, such as syslog, database, email, etc.",
761
    'page callback' => 'drupal_get_form',
762
    'page arguments' => array('system_logging_settings'),
763
    'access arguments' => array('administer site configuration'),
764
    'weight' => 60,
765
    'file' => 'system.admin.inc',
766
  );
767
768

  // Regional and date settings.
769
  $items['admin/config/regional'] = array(
770
771
772
773
774
    'title' => 'Regional and language',
    'description' => 'Regional settings, localization and translation.',
    'position' => 'left',
    'weight' => -7,
    'page callback' => 'system_admin_menu_block_page',
775
    'access arguments' => array('access administration pages'),
776
    'file' => 'system.admin.inc',
777
778
779
  );
  $items['admin/config/regional/settings'] = array(
    'title' => 'Regional settings',
780
    'description' => "Settings for the site's default time zone and country.",
781
782
783
    'page callback' => 'drupal_get_form',
    'page arguments' => array('system_regional_settings'),
    'access arguments' => array('administer site configuration'),
784
    'weight' => 50,
785
    'file' => 'system.admin.inc',
786
  );
787
788
789
790
791
792
  $items['admin/config/regional/date-time'] = array(
    'title' => 'Date and time',
    'description' => 'Configure display formats for date and time.',
    'page callback' => 'drupal_get_form',
    'page arguments' => array('system_date_time_settings'),
    'access arguments' => array('administer site configuration'),
793
    'weight' => 60,
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
    'file' => 'system.admin.inc',
  );
  $items['admin/config/regional/date-time/types'] = array(
    'title' => 'Types',
    'description' => 'Configure display formats for date and time.',
    'page callback' => 'drupal_get_form',
    'page arguments' => array('system_date_time_settings'),
    'access arguments' => array('administer site configuration'),
    'type' => MENU_DEFAULT_LOCAL_TASK,
    'weight' => -10,
    'file' => 'system.admin.inc',
  );
  $items['admin/config/regional/date-time/types/add'] = array(
    'title' => 'Add date type',
    'description' => 'Add new date type.',
    'page callback' => 'drupal_get_form',
    'page arguments' => array('system_add_date_format_type_form'),
    'access arguments' => array('administer site configuration'),
    'type' => MENU_LOCAL_ACTION,
    'weight' => -10,
    'file' => 'system.admin.inc',
  );
  $items['admin/config/regional/date-time/types/%/delete'] = array(
    'title' => 'Delete date type',
    'description' => 'Allow users to delete a configured date type.',
    'type' => MENU_CALLBACK,
    'page callback' => 'drupal_get_form',
    'page arguments' => array('system_delete_date_format_type_form', 5),
    'access arguments' => array('administer site configuration'),
    'file' => 'system.admin.inc',
  );
  $items['admin/config/regional/date-time/formats'] = array(
    'title' => 'Formats',
    'description' => 'Configure display format strings for date and time.',
    'page callback' => 'system_date_time_formats',
    'access arguments' => array('administer site configuration'),
    'type' => MENU_LOCAL_TASK,
    'weight' => -9,
    'file' => 'system.admin.inc',
  );
  $items['admin/config/regional/date-time/formats/add'] = array(
    'title' => 'Add format',
    'description' => 'Allow users to add additional date formats.',
    'type' => MENU_LOCAL_ACTION,
    'page callback' => 'drupal_get_form',
    'page arguments' => array('system_configure_date_formats_form'),
    'access arguments' => array('administer site configuration'),
    'weight' => -10,
    'file' => 'system.admin.inc',
  );
  $items['admin/config/regional/date-time/formats/%/edit'] = array(
    'title' => 'Edit date format',
    'description' => 'Allow users to edit a configured date format.',
    'type' => MENU_CALLBACK,
    'page callback' => 'drupal_get_form',
    'page arguments' => array('system_configure_date_formats_form', 5),
    'access arguments' => array('administer site configuration'),
    'file' => 'system.admin.inc',
  );
  $items['admin/config/regional/date-time/formats/%/delete'] = array(
    'title' => 'Delete date format',
    'description' => 'Allow users to delete a configured date format.',
    'type' => MENU_CALLBACK,
    'page callback' => 'drupal_get_form',
    'page arguments' => array('system_date_delete_format_form', 5),
    'access arguments' => array('administer site configuration'),
    'file' => 'system.admin.inc',
  );
  $items['admin/config/regional/date-time/formats/lookup'] = array(
863
864
865
866
    'title' => 'Date and time lookup',
    'type' => MENU_CALLBACK,
    'page callback' => 'system_date_time_lookup',
    'access arguments' => array('administer site configuration'),
867
    'file' => 'system.admin.inc',
868
  );
869
870

  // Search settings.
871
872
873
874
  $items['admin/config/search'] = array(
    'title' => 'Search and metadata',
    'description' => 'Local site search, metadata and SEO.',
    'page callback' => 'system_admin_menu_block_page',
875
    'access arguments' => array('access administration pages'),