cms/drupal/modules/user/user.admin.inc
changeset 541 e756a8c72c3d
equal deleted inserted replaced
540:07239de796bb 541:e756a8c72c3d
       
     1 <?php
       
     2 
       
     3 /**
       
     4  * @file
       
     5  * Admin page callback file for the user module.
       
     6  */
       
     7 
       
     8 /**
       
     9  * Page callback: Generates the appropriate user administration form.
       
    10  *
       
    11  * This function generates the user registration, multiple user cancellation,
       
    12  * or filtered user list admin form, depending on the argument and the POST
       
    13  * form values.
       
    14  *
       
    15  * @param string $callback_arg
       
    16  *   (optional) Indicates which form to build. Defaults to '', which will
       
    17  *   trigger the user filter form. If the POST value 'op' is present, this
       
    18  *   function uses that value as the callback argument.
       
    19  *
       
    20  * @return string
       
    21  *   A renderable form array for the respective request.
       
    22  */
       
    23 function user_admin($callback_arg = '') {
       
    24   $op = isset($_POST['op']) ? $_POST['op'] : $callback_arg;
       
    25 
       
    26   switch ($op) {
       
    27     case t('Create new account'):
       
    28     case 'create':
       
    29       $build['user_register'] = drupal_get_form('user_register_form');
       
    30       break;
       
    31     default:
       
    32       if (!empty($_POST['accounts']) && isset($_POST['operation']) && ($_POST['operation'] == 'cancel')) {
       
    33         $build['user_multiple_cancel_confirm'] = drupal_get_form('user_multiple_cancel_confirm');
       
    34       }
       
    35       else {
       
    36         $build['user_filter_form'] = drupal_get_form('user_filter_form');
       
    37         $build['user_admin_account'] = drupal_get_form('user_admin_account');
       
    38       }
       
    39   }
       
    40   return $build;
       
    41 }
       
    42 
       
    43 /**
       
    44  * Form builder; Return form for user administration filters.
       
    45  *
       
    46  * @ingroup forms
       
    47  * @see user_filter_form_submit()
       
    48  */
       
    49 function user_filter_form() {
       
    50   $session = isset($_SESSION['user_overview_filter']) ? $_SESSION['user_overview_filter'] : array();
       
    51   $filters = user_filters();
       
    52 
       
    53   $i = 0;
       
    54   $form['filters'] = array(
       
    55     '#type' => 'fieldset',
       
    56     '#title' => t('Show only users where'),
       
    57     '#theme' => 'exposed_filters__user',
       
    58   );
       
    59   foreach ($session as $filter) {
       
    60     list($type, $value) = $filter;
       
    61     if ($type == 'permission') {
       
    62       // Merge arrays of module permissions into one.
       
    63       // Slice past the first element '[any]' whose value is not an array.
       
    64       $options = call_user_func_array('array_merge', array_slice($filters[$type]['options'], 1));
       
    65       $value = $options[$value];
       
    66     }
       
    67     else {
       
    68       $value = $filters[$type]['options'][$value];
       
    69     }
       
    70     $t_args = array('%property' => $filters[$type]['title'], '%value' => $value);
       
    71     if ($i++) {
       
    72       $form['filters']['current'][] = array('#markup' => t('and where %property is %value', $t_args));
       
    73     }
       
    74     else {
       
    75       $form['filters']['current'][] = array('#markup' => t('%property is %value', $t_args));
       
    76     }
       
    77   }
       
    78 
       
    79   $form['filters']['status'] = array(
       
    80     '#type' => 'container',
       
    81     '#attributes' => array('class' => array('clearfix')),
       
    82     '#prefix' => ($i ? '<div class="additional-filters">' . t('and where') . '</div>' : ''),
       
    83   );
       
    84   $form['filters']['status']['filters'] = array(
       
    85     '#type' => 'container',
       
    86     '#attributes' => array('class' => array('filters')),
       
    87   );
       
    88   foreach ($filters as $key => $filter) {
       
    89     $form['filters']['status']['filters'][$key] = array(
       
    90       '#type' => 'select',
       
    91       '#options' => $filter['options'],
       
    92       '#title' => $filter['title'],
       
    93       '#default_value' => '[any]',
       
    94     );
       
    95   }
       
    96 
       
    97   $form['filters']['status']['actions'] = array(
       
    98     '#type' => 'actions',
       
    99     '#attributes' => array('class' => array('container-inline')),
       
   100   );
       
   101   $form['filters']['status']['actions']['submit'] = array(
       
   102     '#type' => 'submit',
       
   103     '#value' => (count($session) ? t('Refine') : t('Filter')),
       
   104   );
       
   105   if (count($session)) {
       
   106     $form['filters']['status']['actions']['undo'] = array(
       
   107       '#type' => 'submit',
       
   108       '#value' => t('Undo'),
       
   109     );
       
   110     $form['filters']['status']['actions']['reset'] = array(
       
   111       '#type' => 'submit',
       
   112       '#value' => t('Reset'),
       
   113     );
       
   114   }
       
   115 
       
   116   drupal_add_library('system', 'drupal.form');
       
   117 
       
   118   return $form;
       
   119 }
       
   120 
       
   121 /**
       
   122  * Process result from user administration filter form.
       
   123  */
       
   124 function user_filter_form_submit($form, &$form_state) {
       
   125   $op = $form_state['values']['op'];
       
   126   $filters = user_filters();
       
   127   switch ($op) {
       
   128     case t('Filter'):
       
   129     case t('Refine'):
       
   130       // Apply every filter that has a choice selected other than 'any'.
       
   131       foreach ($filters as $filter => $options) {
       
   132         if (isset($form_state['values'][$filter]) && $form_state['values'][$filter] != '[any]') {
       
   133           // Merge an array of arrays into one if necessary.
       
   134           $options = ($filter == 'permission') ? form_options_flatten($filters[$filter]['options']) : $filters[$filter]['options'];
       
   135           // Only accept valid selections offered on the dropdown, block bad input.
       
   136           if (isset($options[$form_state['values'][$filter]])) {
       
   137             $_SESSION['user_overview_filter'][] = array($filter, $form_state['values'][$filter]);
       
   138           }
       
   139         }
       
   140       }
       
   141       break;
       
   142     case t('Undo'):
       
   143       array_pop($_SESSION['user_overview_filter']);
       
   144       break;
       
   145     case t('Reset'):
       
   146       $_SESSION['user_overview_filter'] = array();
       
   147       break;
       
   148     case t('Update'):
       
   149       return;
       
   150   }
       
   151 
       
   152   $form_state['redirect'] = 'admin/people';
       
   153   return;
       
   154 }
       
   155 
       
   156 /**
       
   157  * Form builder; User administration page.
       
   158  *
       
   159  * @ingroup forms
       
   160  * @see user_admin_account_validate()
       
   161  * @see user_admin_account_submit()
       
   162  */
       
   163 function user_admin_account() {
       
   164 
       
   165   $header = array(
       
   166     'username' => array('data' => t('Username'), 'field' => 'u.name'),
       
   167     'status' => array('data' => t('Status'), 'field' => 'u.status'),
       
   168     'roles' => array('data' => t('Roles')),
       
   169     'member_for' => array('data' => t('Member for'), 'field' => 'u.created', 'sort' => 'desc'),
       
   170     'access' => array('data' => t('Last access'), 'field' => 'u.access'),
       
   171     'operations' => array('data' => t('Operations')),
       
   172   );
       
   173 
       
   174   $query = db_select('users', 'u');
       
   175   $query->condition('u.uid', 0, '<>');
       
   176   user_build_filter_query($query);
       
   177 
       
   178   $count_query = clone $query;
       
   179   $count_query->addExpression('COUNT(u.uid)');
       
   180 
       
   181   $query = $query->extend('PagerDefault')->extend('TableSort');
       
   182   $query
       
   183     ->fields('u', array('uid', 'name', 'status', 'created', 'access'))
       
   184     ->limit(50)
       
   185     ->orderByHeader($header)
       
   186     ->setCountQuery($count_query);
       
   187   $result = $query->execute();
       
   188 
       
   189   $form['options'] = array(
       
   190     '#type' => 'fieldset',
       
   191     '#title' => t('Update options'),
       
   192     '#attributes' => array('class' => array('container-inline')),
       
   193   );
       
   194   $options = array();
       
   195   foreach (module_invoke_all('user_operations') as $operation => $array) {
       
   196     $options[$operation] = $array['label'];
       
   197   }
       
   198   $form['options']['operation'] = array(
       
   199     '#type' => 'select',
       
   200     '#title' => t('Operation'),
       
   201     '#title_display' => 'invisible',
       
   202     '#options' => $options,
       
   203     '#default_value' => 'unblock',
       
   204   );
       
   205   $options = array();
       
   206   $form['options']['submit'] = array(
       
   207     '#type' => 'submit',
       
   208     '#value' => t('Update'),
       
   209   );
       
   210 
       
   211   $destination = drupal_get_destination();
       
   212 
       
   213   $status = array(t('blocked'), t('active'));
       
   214   $roles = array_map('check_plain', user_roles(TRUE));
       
   215   $accounts = array();
       
   216   foreach ($result as $account) {
       
   217     $users_roles = array();
       
   218     $roles_result = db_query('SELECT rid FROM {users_roles} WHERE uid = :uid', array(':uid' => $account->uid));
       
   219     foreach ($roles_result as $user_role) {
       
   220       $users_roles[] = $roles[$user_role->rid];
       
   221     }
       
   222     asort($users_roles);
       
   223 
       
   224     $options[$account->uid] = array(
       
   225       'username' => theme('username', array('account' => $account)),
       
   226       'status' =>  $status[$account->status],
       
   227       'roles' => theme('item_list', array('items' => $users_roles)),
       
   228       'member_for' => format_interval(REQUEST_TIME - $account->created),
       
   229       'access' =>  $account->access ? t('@time ago', array('@time' => format_interval(REQUEST_TIME - $account->access))) : t('never'),
       
   230       'operations' => array('data' => array('#type' => 'link', '#title' => t('edit'), '#href' => "user/$account->uid/edit", '#options' => array('query' => $destination))),
       
   231     );
       
   232   }
       
   233 
       
   234   $form['accounts'] = array(
       
   235     '#type' => 'tableselect',
       
   236     '#header' => $header,
       
   237     '#options' => $options,
       
   238     '#empty' => t('No people available.'),
       
   239   );
       
   240   $form['pager'] = array('#markup' => theme('pager'));
       
   241 
       
   242   return $form;
       
   243 }
       
   244 
       
   245 /**
       
   246  * Submit the user administration update form.
       
   247  */
       
   248 function user_admin_account_submit($form, &$form_state) {
       
   249   $operations = module_invoke_all('user_operations', $form, $form_state);
       
   250   $operation = $operations[$form_state['values']['operation']];
       
   251   // Filter out unchecked accounts.
       
   252   $accounts = array_filter($form_state['values']['accounts']);
       
   253   if ($function = $operation['callback']) {
       
   254     // Add in callback arguments if present.
       
   255     if (isset($operation['callback arguments'])) {
       
   256       $args = array_merge(array($accounts), $operation['callback arguments']);
       
   257     }
       
   258     else {
       
   259       $args = array($accounts);
       
   260     }
       
   261     call_user_func_array($function, $args);
       
   262 
       
   263     drupal_set_message(t('The update has been performed.'));
       
   264   }
       
   265 }
       
   266 
       
   267 function user_admin_account_validate($form, &$form_state) {
       
   268   $form_state['values']['accounts'] = array_filter($form_state['values']['accounts']);
       
   269   if (count($form_state['values']['accounts']) == 0) {
       
   270     form_set_error('', t('No users selected.'));
       
   271   }
       
   272 }
       
   273 
       
   274 /**
       
   275  * Form builder; Configure user settings for this site.
       
   276  *
       
   277  * @ingroup forms
       
   278  * @see system_settings_form()
       
   279  */
       
   280 function user_admin_settings() {
       
   281   // Settings for anonymous users.
       
   282   $form['anonymous_settings'] = array(
       
   283     '#type' => 'fieldset',
       
   284     '#title' => t('Anonymous users'),
       
   285   );
       
   286   $form['anonymous_settings']['anonymous'] = array(
       
   287     '#type' => 'textfield',
       
   288     '#title' => t('Name'),
       
   289     '#default_value' => variable_get('anonymous', t('Anonymous')),
       
   290     '#description' => t('The name used to indicate anonymous users.'),
       
   291     '#required' => TRUE,
       
   292   );
       
   293 
       
   294   // Administrative role option.
       
   295   $form['admin_role'] = array(
       
   296     '#type' => 'fieldset',
       
   297     '#title' => t('Administrator role'),
       
   298   );
       
   299 
       
   300   // Do not allow users to set the anonymous or authenticated user roles as the
       
   301   // administrator role.
       
   302   $roles = user_roles();
       
   303   unset($roles[DRUPAL_ANONYMOUS_RID]);
       
   304   unset($roles[DRUPAL_AUTHENTICATED_RID]);
       
   305   $roles[0] = t('disabled');
       
   306 
       
   307   $form['admin_role']['user_admin_role'] = array(
       
   308     '#type' => 'select',
       
   309     '#title' => t('Administrator role'),
       
   310     '#default_value' => variable_get('user_admin_role', 0),
       
   311     '#options' => $roles,
       
   312     '#description' => t('This role will be automatically assigned new permissions whenever a module is enabled. Changing this setting will not affect existing permissions.'),
       
   313   );
       
   314 
       
   315   // User registration settings.
       
   316   $form['registration_cancellation'] = array(
       
   317     '#type' => 'fieldset',
       
   318     '#title' => t('Registration and cancellation'),
       
   319   );
       
   320   $form['registration_cancellation']['user_register'] = array(
       
   321     '#type' => 'radios',
       
   322     '#title' => t('Who can register accounts?'),
       
   323     '#default_value' => variable_get('user_register', USER_REGISTER_VISITORS_ADMINISTRATIVE_APPROVAL),
       
   324     '#options' => array(
       
   325       USER_REGISTER_ADMINISTRATORS_ONLY => t('Administrators only'),
       
   326       USER_REGISTER_VISITORS => t('Visitors'),
       
   327       USER_REGISTER_VISITORS_ADMINISTRATIVE_APPROVAL => t('Visitors, but administrator approval is required'),
       
   328     )
       
   329   );
       
   330   $form['registration_cancellation']['user_email_verification'] = array(
       
   331     '#type' => 'checkbox',
       
   332     '#title' => t('Require e-mail verification when a visitor creates an account.'),
       
   333     '#default_value' => variable_get('user_email_verification', TRUE),
       
   334     '#description' => t('New users will be required to validate their e-mail address prior to logging into the site, and will be assigned a system-generated password. With this setting disabled, users will be logged in immediately upon registering, and may select their own passwords during registration.')
       
   335   );
       
   336   module_load_include('inc', 'user', 'user.pages');
       
   337   $form['registration_cancellation']['user_cancel_method'] = array(
       
   338     '#type' => 'item',
       
   339     '#title' => t('When cancelling a user account'),
       
   340     '#description' => t('Users with the %select-cancel-method or %administer-users <a href="@permissions-url">permissions</a> can override this default method.', array('%select-cancel-method' => t('Select method for cancelling account'), '%administer-users' => t('Administer users'), '@permissions-url' => url('admin/people/permissions'))),
       
   341   );
       
   342   $form['registration_cancellation']['user_cancel_method'] += user_cancel_methods();
       
   343   foreach (element_children($form['registration_cancellation']['user_cancel_method']) as $element) {
       
   344     // Remove all account cancellation methods that have #access defined, as
       
   345     // those cannot be configured as default method.
       
   346     if (isset($form['registration_cancellation']['user_cancel_method'][$element]['#access'])) {
       
   347       $form['registration_cancellation']['user_cancel_method'][$element]['#access'] = FALSE;
       
   348     }
       
   349     // Remove the description (only displayed on the confirmation form).
       
   350     else {
       
   351       unset($form['registration_cancellation']['user_cancel_method'][$element]['#description']);
       
   352     }
       
   353   }
       
   354 
       
   355   // Account settings.
       
   356   $form['personalization'] = array(
       
   357     '#type' => 'fieldset',
       
   358     '#title' => t('Personalization'),
       
   359   );
       
   360   $form['personalization']['user_signatures'] = array(
       
   361     '#type' => 'checkbox',
       
   362     '#title' => t('Enable signatures.'),
       
   363     '#default_value' => variable_get('user_signatures', 0),
       
   364   );
       
   365   // If picture support is enabled, check whether the picture directory exists.
       
   366   if (variable_get('user_pictures', 0)) {
       
   367     $picture_path =  file_default_scheme() . '://' . variable_get('user_picture_path', 'pictures');
       
   368     if (!file_prepare_directory($picture_path, FILE_CREATE_DIRECTORY)) {
       
   369       form_set_error('user_picture_path', t('The directory %directory does not exist or is not writable.', array('%directory' => $picture_path)));
       
   370       watchdog('file system', 'The directory %directory does not exist or is not writable.', array('%directory' => $picture_path), WATCHDOG_ERROR);
       
   371     }
       
   372   }
       
   373   $picture_support = variable_get('user_pictures', 0);
       
   374   $form['personalization']['user_pictures'] = array(
       
   375     '#type' => 'checkbox',
       
   376     '#title' => t('Enable user pictures.'),
       
   377     '#default_value' => $picture_support,
       
   378   );
       
   379   drupal_add_js(drupal_get_path('module', 'user') . '/user.js');
       
   380   $form['personalization']['pictures'] = array(
       
   381     '#type' => 'container',
       
   382     '#states' => array(
       
   383       // Hide the additional picture settings when user pictures are disabled.
       
   384       'invisible' => array(
       
   385         'input[name="user_pictures"]' => array('checked' => FALSE),
       
   386       ),
       
   387     ),
       
   388   );
       
   389   $form['personalization']['pictures']['user_picture_path'] = array(
       
   390     '#type' => 'textfield',
       
   391     '#title' => t('Picture directory'),
       
   392     '#default_value' => variable_get('user_picture_path', 'pictures'),
       
   393     '#size' => 30,
       
   394     '#maxlength' => 255,
       
   395     '#description' => t('Subdirectory in the file upload directory where pictures will be stored.'),
       
   396   );
       
   397   $form['personalization']['pictures']['user_picture_default'] = array(
       
   398     '#type' => 'textfield',
       
   399     '#title' => t('Default picture'),
       
   400     '#default_value' => variable_get('user_picture_default', ''),
       
   401     '#size' => 30,
       
   402     '#maxlength' => 255,
       
   403     '#description' => t('URL of picture to display for users with no custom picture selected. Leave blank for none.'),
       
   404   );
       
   405   if (module_exists('image')) {
       
   406     $form['personalization']['pictures']['settings']['user_picture_style'] = array(
       
   407       '#type' => 'select',
       
   408       '#title' => t('Picture display style'),
       
   409       '#options' => image_style_options(TRUE, PASS_THROUGH),
       
   410       '#default_value' => variable_get('user_picture_style', ''),
       
   411       '#description' => t('The style selected will be used on display, while the original image is retained. Styles may be configured in the <a href="!url">Image styles</a> administration area.', array('!url' => url('admin/config/media/image-styles'))),
       
   412     );
       
   413   }
       
   414   $form['personalization']['pictures']['user_picture_dimensions'] = array(
       
   415     '#type' => 'textfield',
       
   416     '#title' => t('Picture upload dimensions'),
       
   417     '#default_value' => variable_get('user_picture_dimensions', '85x85'),
       
   418     '#size' => 10,
       
   419     '#maxlength' => 10,
       
   420     '#field_suffix' => ' ' . t('pixels'),
       
   421     '#description' => t('Pictures larger than this will be scaled down to this size.'),
       
   422   );
       
   423   $form['personalization']['pictures']['user_picture_file_size'] = array(
       
   424     '#type' => 'textfield',
       
   425     '#title' => t('Picture upload file size'),
       
   426     '#default_value' => variable_get('user_picture_file_size', '30'),
       
   427     '#size' => 10,
       
   428     '#maxlength' => 10,
       
   429     '#field_suffix' => ' ' . t('KB'),
       
   430     '#description' => t('Maximum allowed file size for uploaded pictures. Upload size is normally limited only by the PHP maximum post and file upload settings, and images are automatically scaled down to the dimensions specified above.'),
       
   431     '#element_validate' => array('element_validate_integer_positive'),
       
   432   );
       
   433   $form['personalization']['pictures']['user_picture_guidelines'] = array(
       
   434     '#type' => 'textarea',
       
   435     '#title' => t('Picture guidelines'),
       
   436     '#default_value' => variable_get('user_picture_guidelines', ''),
       
   437     '#description' => t("This text is displayed at the picture upload form in addition to the default guidelines. It's useful for helping or instructing your users."),
       
   438   );
       
   439 
       
   440   $form['email_title'] = array(
       
   441     '#type' => 'item',
       
   442     '#title' => t('E-mails'),
       
   443   );
       
   444   $form['email'] = array(
       
   445     '#type' => 'vertical_tabs',
       
   446   );
       
   447   // These email tokens are shared for all settings, so just define
       
   448   // the list once to help ensure they stay in sync.
       
   449   $email_token_help = t('Available variables are: [site:name], [site:url], [user:name], [user:mail], [site:login-url], [site:url-brief], [user:edit-url], [user:one-time-login-url], [user:cancel-url].');
       
   450 
       
   451   $form['email_admin_created'] = array(
       
   452     '#type' => 'fieldset',
       
   453     '#title' => t('Welcome (new user created by administrator)'),
       
   454     '#collapsible' => TRUE,
       
   455     '#collapsed' => (variable_get('user_register', USER_REGISTER_VISITORS_ADMINISTRATIVE_APPROVAL) != USER_REGISTER_ADMINISTRATORS_ONLY),
       
   456     '#description' => t('Edit the welcome e-mail messages sent to new member accounts created by an administrator.') . ' ' . $email_token_help,
       
   457     '#group' => 'email',
       
   458   );
       
   459   $form['email_admin_created']['user_mail_register_admin_created_subject'] = array(
       
   460     '#type' => 'textfield',
       
   461     '#title' => t('Subject'),
       
   462     '#default_value' => _user_mail_text('register_admin_created_subject', NULL, array(), FALSE),
       
   463     '#maxlength' => 180,
       
   464   );
       
   465   $form['email_admin_created']['user_mail_register_admin_created_body'] = array(
       
   466     '#type' => 'textarea',
       
   467     '#title' => t('Body'),
       
   468     '#default_value' => _user_mail_text('register_admin_created_body', NULL, array(), FALSE),
       
   469     '#rows' => 15,
       
   470   );
       
   471 
       
   472   $form['email_pending_approval'] = array(
       
   473     '#type' => 'fieldset',
       
   474     '#title' => t('Welcome (awaiting approval)'),
       
   475     '#collapsible' => TRUE,
       
   476     '#collapsed' => (variable_get('user_register', USER_REGISTER_VISITORS_ADMINISTRATIVE_APPROVAL) != USER_REGISTER_VISITORS_ADMINISTRATIVE_APPROVAL),
       
   477     '#description' => t('Edit the welcome e-mail messages sent to new members upon registering, when administrative approval is required.') . ' ' . $email_token_help,
       
   478     '#group' => 'email',
       
   479   );
       
   480   $form['email_pending_approval']['user_mail_register_pending_approval_subject'] = array(
       
   481     '#type' => 'textfield',
       
   482     '#title' => t('Subject'),
       
   483     '#default_value' => _user_mail_text('register_pending_approval_subject', NULL, array(), FALSE),
       
   484     '#maxlength' => 180,
       
   485   );
       
   486   $form['email_pending_approval']['user_mail_register_pending_approval_body'] = array(
       
   487     '#type' => 'textarea',
       
   488     '#title' => t('Body'),
       
   489     '#default_value' => _user_mail_text('register_pending_approval_body', NULL, array(), FALSE),
       
   490     '#rows' => 8,
       
   491   );
       
   492 
       
   493   $form['email_no_approval_required'] = array(
       
   494     '#type' => 'fieldset',
       
   495     '#title' => t('Welcome (no approval required)'),
       
   496     '#collapsible' => TRUE,
       
   497     '#collapsed' => (variable_get('user_register', USER_REGISTER_VISITORS_ADMINISTRATIVE_APPROVAL) != USER_REGISTER_VISITORS),
       
   498     '#description' => t('Edit the welcome e-mail messages sent to new members upon registering, when no administrator approval is required.') . ' ' . $email_token_help,
       
   499     '#group' => 'email',
       
   500   );
       
   501   $form['email_no_approval_required']['user_mail_register_no_approval_required_subject'] = array(
       
   502     '#type' => 'textfield',
       
   503     '#title' => t('Subject'),
       
   504     '#default_value' => _user_mail_text('register_no_approval_required_subject', NULL, array(), FALSE),
       
   505     '#maxlength' => 180,
       
   506   );
       
   507   $form['email_no_approval_required']['user_mail_register_no_approval_required_body'] = array(
       
   508     '#type' => 'textarea',
       
   509     '#title' => t('Body'),
       
   510     '#default_value' => _user_mail_text('register_no_approval_required_body', NULL, array(), FALSE),
       
   511     '#rows' => 15,
       
   512   );
       
   513 
       
   514   $form['email_password_reset'] = array(
       
   515     '#type' => 'fieldset',
       
   516     '#title' => t('Password recovery'),
       
   517     '#collapsible' => TRUE,
       
   518     '#collapsed' => TRUE,
       
   519     '#description' => t('Edit the e-mail messages sent to users who request a new password.') . ' ' . $email_token_help,
       
   520     '#group' => 'email',
       
   521     '#weight' => 10,
       
   522   );
       
   523   $form['email_password_reset']['user_mail_password_reset_subject'] = array(
       
   524     '#type' => 'textfield',
       
   525     '#title' => t('Subject'),
       
   526     '#default_value' => _user_mail_text('password_reset_subject', NULL, array(), FALSE),
       
   527     '#maxlength' => 180,
       
   528   );
       
   529   $form['email_password_reset']['user_mail_password_reset_body'] = array(
       
   530     '#type' => 'textarea',
       
   531     '#title' => t('Body'),
       
   532     '#default_value' => _user_mail_text('password_reset_body', NULL, array(), FALSE),
       
   533     '#rows' => 12,
       
   534   );
       
   535 
       
   536   $form['email_activated'] = array(
       
   537     '#type' => 'fieldset',
       
   538     '#title' => t('Account activation'),
       
   539     '#collapsible' => TRUE,
       
   540     '#collapsed' => TRUE,
       
   541     '#description' => t('Enable and edit e-mail messages sent to users upon account activation (when an administrator activates an account of a user who has already registered, on a site where administrative approval is required).') . ' ' . $email_token_help,
       
   542     '#group' => 'email',
       
   543   );
       
   544   $form['email_activated']['user_mail_status_activated_notify'] = array(
       
   545     '#type' => 'checkbox',
       
   546     '#title' => t('Notify user when account is activated.'),
       
   547     '#default_value' => variable_get('user_mail_status_activated_notify', TRUE),
       
   548   );
       
   549   $form['email_activated']['settings'] = array(
       
   550     '#type' => 'container',
       
   551     '#states' => array(
       
   552       // Hide the additional settings when this email is disabled.
       
   553       'invisible' => array(
       
   554         'input[name="user_mail_status_activated_notify"]' => array('checked' => FALSE),
       
   555       ),
       
   556     ),
       
   557   );
       
   558   $form['email_activated']['settings']['user_mail_status_activated_subject'] = array(
       
   559     '#type' => 'textfield',
       
   560     '#title' => t('Subject'),
       
   561     '#default_value' => _user_mail_text('status_activated_subject', NULL, array(), FALSE),
       
   562     '#maxlength' => 180,
       
   563   );
       
   564   $form['email_activated']['settings']['user_mail_status_activated_body'] = array(
       
   565     '#type' => 'textarea',
       
   566     '#title' => t('Body'),
       
   567     '#default_value' => _user_mail_text('status_activated_body', NULL, array(), FALSE),
       
   568     '#rows' => 15,
       
   569   );
       
   570 
       
   571   $form['email_blocked'] = array(
       
   572     '#type' => 'fieldset',
       
   573     '#title' => t('Account blocked'),
       
   574     '#collapsible' => TRUE,
       
   575     '#collapsed' => TRUE,
       
   576     '#description' => t('Enable and edit e-mail messages sent to users when their accounts are blocked.') . ' ' . $email_token_help,
       
   577     '#group' => 'email',
       
   578   );
       
   579   $form['email_blocked']['user_mail_status_blocked_notify'] = array(
       
   580     '#type' => 'checkbox',
       
   581     '#title' => t('Notify user when account is blocked.'),
       
   582     '#default_value' => variable_get('user_mail_status_blocked_notify', FALSE),
       
   583   );
       
   584   $form['email_blocked']['settings'] = array(
       
   585     '#type' => 'container',
       
   586     '#states' => array(
       
   587       // Hide the additional settings when the blocked email is disabled.
       
   588       'invisible' => array(
       
   589         'input[name="user_mail_status_blocked_notify"]' => array('checked' => FALSE),
       
   590       ),
       
   591     ),
       
   592   );
       
   593   $form['email_blocked']['settings']['user_mail_status_blocked_subject'] = array(
       
   594     '#type' => 'textfield',
       
   595     '#title' => t('Subject'),
       
   596     '#default_value' => _user_mail_text('status_blocked_subject', NULL, array(), FALSE),
       
   597     '#maxlength' => 180,
       
   598   );
       
   599   $form['email_blocked']['settings']['user_mail_status_blocked_body'] = array(
       
   600     '#type' => 'textarea',
       
   601     '#title' => t('Body'),
       
   602     '#default_value' => _user_mail_text('status_blocked_body', NULL, array(), FALSE),
       
   603     '#rows' => 3,
       
   604   );
       
   605 
       
   606   $form['email_cancel_confirm'] = array(
       
   607     '#type' => 'fieldset',
       
   608     '#title' => t('Account cancellation confirmation'),
       
   609     '#collapsible' => TRUE,
       
   610     '#collapsed' => TRUE,
       
   611     '#description' => t('Edit the e-mail messages sent to users when they attempt to cancel their accounts.') . ' ' . $email_token_help,
       
   612     '#group' => 'email',
       
   613   );
       
   614   $form['email_cancel_confirm']['user_mail_cancel_confirm_subject'] = array(
       
   615     '#type' => 'textfield',
       
   616     '#title' => t('Subject'),
       
   617     '#default_value' => _user_mail_text('cancel_confirm_subject', NULL, array(), FALSE),
       
   618     '#maxlength' => 180,
       
   619   );
       
   620   $form['email_cancel_confirm']['user_mail_cancel_confirm_body'] = array(
       
   621     '#type' => 'textarea',
       
   622     '#title' => t('Body'),
       
   623     '#default_value' => _user_mail_text('cancel_confirm_body', NULL, array(), FALSE),
       
   624     '#rows' => 3,
       
   625   );
       
   626 
       
   627   $form['email_canceled'] = array(
       
   628     '#type' => 'fieldset',
       
   629     '#title' => t('Account canceled'),
       
   630     '#collapsible' => TRUE,
       
   631     '#collapsed' => TRUE,
       
   632     '#description' => t('Enable and edit e-mail messages sent to users when their accounts are canceled.') . ' ' . $email_token_help,
       
   633     '#group' => 'email',
       
   634   );
       
   635   $form['email_canceled']['user_mail_status_canceled_notify'] = array(
       
   636     '#type' => 'checkbox',
       
   637     '#title' => t('Notify user when account is canceled.'),
       
   638     '#default_value' => variable_get('user_mail_status_canceled_notify', FALSE),
       
   639   );
       
   640   $form['email_canceled']['settings'] = array(
       
   641     '#type' => 'container',
       
   642     '#states' => array(
       
   643       // Hide the settings when the cancel notify checkbox is disabled.
       
   644       'invisible' => array(
       
   645         'input[name="user_mail_status_canceled_notify"]' => array('checked' => FALSE),
       
   646       ),
       
   647     ),
       
   648   );
       
   649   $form['email_canceled']['settings']['user_mail_status_canceled_subject'] = array(
       
   650     '#type' => 'textfield',
       
   651     '#title' => t('Subject'),
       
   652     '#default_value' => _user_mail_text('status_canceled_subject', NULL, array(), FALSE),
       
   653     '#maxlength' => 180,
       
   654   );
       
   655   $form['email_canceled']['settings']['user_mail_status_canceled_body'] = array(
       
   656     '#type' => 'textarea',
       
   657     '#title' => t('Body'),
       
   658     '#default_value' => _user_mail_text('status_canceled_body', NULL, array(), FALSE),
       
   659     '#rows' => 3,
       
   660   );
       
   661 
       
   662   return system_settings_form($form);
       
   663 }
       
   664 
       
   665 /**
       
   666  * Menu callback: administer permissions.
       
   667  *
       
   668  * @ingroup forms
       
   669  * @see user_admin_permissions_submit()
       
   670  * @see theme_user_admin_permissions()
       
   671  */
       
   672 function user_admin_permissions($form, $form_state, $rid = NULL) {
       
   673 
       
   674   // Retrieve role names for columns.
       
   675   $role_names = user_roles();
       
   676   if (is_numeric($rid)) {
       
   677     $role_names = array($rid => $role_names[$rid]);
       
   678   }
       
   679   // Fetch permissions for all roles or the one selected role.
       
   680   $role_permissions = user_role_permissions($role_names);
       
   681 
       
   682   // Store $role_names for use when saving the data.
       
   683   $form['role_names'] = array(
       
   684     '#type' => 'value',
       
   685     '#value' => $role_names,
       
   686   );
       
   687   // Render role/permission overview:
       
   688   $options = array();
       
   689   $module_info = system_get_info('module');
       
   690   $hide_descriptions = system_admin_compact_mode();
       
   691 
       
   692   // Get a list of all the modules implementing a hook_permission() and sort by
       
   693   // display name.
       
   694   $modules = array();
       
   695   foreach (module_implements('permission') as $module) {
       
   696     $modules[$module] = $module_info[$module]['name'];
       
   697   }
       
   698   asort($modules);
       
   699 
       
   700   foreach ($modules as $module => $display_name) {
       
   701     if ($permissions = module_invoke($module, 'permission')) {
       
   702       $form['permission'][] = array(
       
   703         '#markup' => $module_info[$module]['name'],
       
   704         '#id' => $module,
       
   705       );
       
   706       foreach ($permissions as $perm => $perm_item) {
       
   707         // Fill in default values for the permission.
       
   708         $perm_item += array(
       
   709           'description' => '',
       
   710           'restrict access' => FALSE,
       
   711           'warning' => !empty($perm_item['restrict access']) ? t('Warning: Give to trusted roles only; this permission has security implications.') : '',
       
   712         );
       
   713         $options[$perm] = '';
       
   714         $form['permission'][$perm] = array(
       
   715           '#type' => 'item',
       
   716           '#markup' => $perm_item['title'],
       
   717           '#description' => theme('user_permission_description', array('permission_item' => $perm_item, 'hide' => $hide_descriptions)),
       
   718         );
       
   719         foreach ($role_names as $rid => $name) {
       
   720           // Builds arrays for checked boxes for each role
       
   721           if (isset($role_permissions[$rid][$perm])) {
       
   722             $status[$rid][] = $perm;
       
   723           }
       
   724         }
       
   725       }
       
   726     }
       
   727   }
       
   728 
       
   729   // Have to build checkboxes here after checkbox arrays are built
       
   730   foreach ($role_names as $rid => $name) {
       
   731     $form['checkboxes'][$rid] = array(
       
   732       '#type' => 'checkboxes',
       
   733       '#options' => $options,
       
   734       '#default_value' => isset($status[$rid]) ? $status[$rid] : array(),
       
   735       '#attributes' => array('class' => array('rid-' . $rid)),
       
   736     );
       
   737     $form['role_names'][$rid] = array('#markup' => check_plain($name), '#tree' => TRUE);
       
   738   }
       
   739 
       
   740   $form['actions'] = array('#type' => 'actions');
       
   741   $form['actions']['submit'] = array('#type' => 'submit', '#value' => t('Save permissions'));
       
   742 
       
   743   $form['#attached']['js'][] = drupal_get_path('module', 'user') . '/user.permissions.js';
       
   744 
       
   745   return $form;
       
   746 }
       
   747 
       
   748 /**
       
   749  * Save permissions selected on the administer permissions page.
       
   750  *
       
   751  * @see user_admin_permissions()
       
   752  */
       
   753 function user_admin_permissions_submit($form, &$form_state) {
       
   754   foreach ($form_state['values']['role_names'] as $rid => $name) {
       
   755     user_role_change_permissions($rid, $form_state['values'][$rid]);
       
   756   }
       
   757 
       
   758   drupal_set_message(t('The changes have been saved.'));
       
   759 
       
   760   // Clear the cached pages and blocks.
       
   761   cache_clear_all();
       
   762 }
       
   763 
       
   764 /**
       
   765  * Returns HTML for the administer permissions page.
       
   766  *
       
   767  * @param $variables
       
   768  *   An associative array containing:
       
   769  *   - form: A render element representing the form.
       
   770  *
       
   771  * @ingroup themeable
       
   772  */
       
   773 function theme_user_admin_permissions($variables) {
       
   774   $form = $variables['form'];
       
   775 
       
   776   $roles = user_roles();
       
   777   foreach (element_children($form['permission']) as $key) {
       
   778     $row = array();
       
   779     // Module name
       
   780     if (is_numeric($key)) {
       
   781       $row[] = array('data' => drupal_render($form['permission'][$key]), 'class' => array('module'), 'id' => 'module-' . $form['permission'][$key]['#id'], 'colspan' => count($form['role_names']['#value']) + 1);
       
   782     }
       
   783     else {
       
   784       // Permission row.
       
   785       $row[] = array(
       
   786         'data' => drupal_render($form['permission'][$key]),
       
   787         'class' => array('permission'),
       
   788       );
       
   789       foreach (element_children($form['checkboxes']) as $rid) {
       
   790         $form['checkboxes'][$rid][$key]['#title'] = $roles[$rid] . ': ' . $form['permission'][$key]['#markup'];
       
   791         $form['checkboxes'][$rid][$key]['#title_display'] = 'invisible';
       
   792         $row[] = array('data' => drupal_render($form['checkboxes'][$rid][$key]), 'class' => array('checkbox'));
       
   793       }
       
   794     }
       
   795     $rows[] = $row;
       
   796   }
       
   797   $header[] = (t('Permission'));
       
   798   foreach (element_children($form['role_names']) as $rid) {
       
   799     $header[] = array('data' => drupal_render($form['role_names'][$rid]), 'class' => array('checkbox'));
       
   800   }
       
   801   $output = theme('system_compact_link');
       
   802   $output .= theme('table', array('header' => $header, 'rows' => $rows, 'attributes' => array('id' => 'permissions')));
       
   803   $output .= drupal_render_children($form);
       
   804   return $output;
       
   805 }
       
   806 
       
   807 /**
       
   808  * Returns HTML for an individual permission description.
       
   809  *
       
   810  * @param $variables
       
   811  *   An associative array containing:
       
   812  *   - permission_item: An associative array representing the permission whose
       
   813  *     description is being themed. Useful keys include:
       
   814  *     - description: The text of the permission description.
       
   815  *     - warning: A security-related warning message about the permission (if
       
   816  *       there is one).
       
   817  *   - hide: A boolean indicating whether or not the permission description was
       
   818  *     requested to be hidden rather than shown.
       
   819  *
       
   820  * @ingroup themeable
       
   821  */
       
   822 function theme_user_permission_description($variables) {
       
   823   if (!$variables['hide']) {
       
   824     $description = array();
       
   825     $permission_item = $variables['permission_item'];
       
   826     if (!empty($permission_item['description'])) {
       
   827       $description[] = $permission_item['description'];
       
   828     }
       
   829     if (!empty($permission_item['warning'])) {
       
   830       $description[] = '<em class="permission-warning">' . $permission_item['warning'] . '</em>';
       
   831     }
       
   832     if (!empty($description)) {
       
   833       return implode(' ', $description);
       
   834     }
       
   835   }
       
   836 }
       
   837 
       
   838 /**
       
   839  * Form to re-order roles or add a new one.
       
   840  *
       
   841  * @ingroup forms
       
   842  * @see theme_user_admin_roles()
       
   843  */
       
   844 function user_admin_roles($form, $form_state) {
       
   845   $roles = user_roles();
       
   846 
       
   847   $form['roles'] = array(
       
   848     '#tree' => TRUE,
       
   849   );
       
   850   $order = 0;
       
   851   foreach ($roles as $rid => $name) {
       
   852     $form['roles'][$rid]['#role'] = (object) array(
       
   853       'rid' => $rid,
       
   854       'name' => $name,
       
   855       'weight' => $order,
       
   856     );
       
   857     $form['roles'][$rid]['#weight'] = $order;
       
   858     $form['roles'][$rid]['weight'] = array(
       
   859       '#type' => 'textfield',
       
   860       '#title' => t('Weight for @title', array('@title' => $name)),
       
   861       '#title_display' => 'invisible',
       
   862       '#size' => 4,
       
   863       '#default_value' => $order,
       
   864       '#attributes' => array('class' => array('role-weight')),
       
   865     );
       
   866     $order++;
       
   867   }
       
   868 
       
   869   $form['name'] = array(
       
   870     '#type' => 'textfield',
       
   871     '#title' => t('Name'),
       
   872     '#title_display' => 'invisible',
       
   873     '#size' => 32,
       
   874     '#maxlength' => 64,
       
   875   );
       
   876   $form['add'] = array(
       
   877     '#type' => 'submit',
       
   878     '#value' => t('Add role'),
       
   879     '#validate' => array('user_admin_role_validate'),
       
   880     '#submit' => array('user_admin_role_submit'),
       
   881   );
       
   882   $form['actions'] = array('#type' => 'actions');
       
   883   $form['actions']['submit'] = array(
       
   884     '#type' => 'submit',
       
   885     '#value' => t('Save order'),
       
   886     '#submit' => array('user_admin_roles_order_submit'),
       
   887   );
       
   888 
       
   889   return $form;
       
   890 }
       
   891 
       
   892 /**
       
   893  * Form submit function. Update the role weights.
       
   894  */
       
   895 function user_admin_roles_order_submit($form, &$form_state) {
       
   896   foreach ($form_state['values']['roles'] as $rid => $role_values) {
       
   897     $role = $form['roles'][$rid]['#role'];
       
   898     $role->weight = $role_values['weight'];
       
   899     user_role_save($role);
       
   900   }
       
   901   drupal_set_message(t('The role settings have been updated.'));
       
   902 }
       
   903 
       
   904 /**
       
   905  * Returns HTML for the role order and new role form.
       
   906  *
       
   907  * @param $variables
       
   908  *   An associative array containing:
       
   909  *   - form: A render element representing the form.
       
   910  *
       
   911  * @ingroup themeable
       
   912  */
       
   913 function theme_user_admin_roles($variables) {
       
   914   $form = $variables['form'];
       
   915 
       
   916   $header = array(t('Name'), t('Weight'), array('data' => t('Operations'), 'colspan' => 2));
       
   917   foreach (element_children($form['roles']) as $rid) {
       
   918     $name = $form['roles'][$rid]['#role']->name;
       
   919     $row = array();
       
   920     if (in_array($rid, array(DRUPAL_ANONYMOUS_RID, DRUPAL_AUTHENTICATED_RID))) {
       
   921       $row[] = t('@name <em>(locked)</em>', array('@name' => $name));
       
   922       $row[] = drupal_render($form['roles'][$rid]['weight']);
       
   923       $row[] = '';
       
   924       $row[] = l(t('edit permissions'), 'admin/people/permissions/' . $rid);
       
   925     }
       
   926     else {
       
   927       $row[] = check_plain($name);
       
   928       $row[] = drupal_render($form['roles'][$rid]['weight']);
       
   929       $row[] = l(t('edit role'), 'admin/people/permissions/roles/edit/' . $rid);
       
   930       $row[] = l(t('edit permissions'), 'admin/people/permissions/' . $rid);
       
   931     }
       
   932     $rows[] = array('data' => $row, 'class' => array('draggable'));
       
   933   }
       
   934   $rows[] = array(array('data' => drupal_render($form['name']) . drupal_render($form['add']), 'colspan' => 4, 'class' => 'edit-name'));
       
   935 
       
   936   drupal_add_tabledrag('user-roles', 'order', 'sibling', 'role-weight');
       
   937 
       
   938   $output = theme('table', array('header' => $header, 'rows' => $rows, 'attributes' => array('id' => 'user-roles')));
       
   939   $output .= drupal_render_children($form);
       
   940 
       
   941   return $output;
       
   942 }
       
   943 
       
   944 /**
       
   945  * Form to configure a single role.
       
   946  *
       
   947  * @ingroup forms
       
   948  * @see user_admin_role_validate()
       
   949  * @see user_admin_role_submit()
       
   950  */
       
   951 function user_admin_role($form, $form_state, $role) {
       
   952   if ($role->rid == DRUPAL_ANONYMOUS_RID || $role->rid == DRUPAL_AUTHENTICATED_RID) {
       
   953     drupal_goto('admin/people/permissions/roles');
       
   954   }
       
   955 
       
   956   // Display the edit role form.
       
   957   $form['name'] = array(
       
   958     '#type' => 'textfield',
       
   959     '#title' => t('Role name'),
       
   960     '#default_value' => $role->name,
       
   961     '#size' => 30,
       
   962     '#required' => TRUE,
       
   963     '#maxlength' => 64,
       
   964     '#description' => t('The name for this role. Example: "moderator", "editorial board", "site architect".'),
       
   965   );
       
   966   $form['rid'] = array(
       
   967     '#type' => 'value',
       
   968     '#value' => $role->rid,
       
   969   );
       
   970   $form['weight'] = array(
       
   971     '#type' => 'value',
       
   972     '#value' => $role->weight,
       
   973   );
       
   974   $form['actions'] = array('#type' => 'actions');
       
   975   $form['actions']['submit'] = array(
       
   976     '#type' => 'submit',
       
   977     '#value' => t('Save role'),
       
   978   );
       
   979   $form['actions']['delete'] = array(
       
   980     '#type' => 'submit',
       
   981     '#value' => t('Delete role'),
       
   982     '#submit' => array('user_admin_role_delete_submit'),
       
   983   );
       
   984 
       
   985   return $form;
       
   986 }
       
   987 
       
   988 /**
       
   989  * Form validation handler for the user_admin_role() form.
       
   990  */
       
   991 function user_admin_role_validate($form, &$form_state) {
       
   992   if (!empty($form_state['values']['name'])) {
       
   993     if ($form_state['values']['op'] == t('Save role')) {
       
   994       $role = user_role_load_by_name($form_state['values']['name']);
       
   995       if ($role && $role->rid != $form_state['values']['rid']) {
       
   996         form_set_error('name', t('The role name %name already exists. Choose another role name.', array('%name' => $form_state['values']['name'])));
       
   997       }
       
   998     }
       
   999     elseif ($form_state['values']['op'] == t('Add role')) {
       
  1000       if (user_role_load_by_name($form_state['values']['name'])) {
       
  1001         form_set_error('name', t('The role name %name already exists. Choose another role name.', array('%name' => $form_state['values']['name'])));
       
  1002       }
       
  1003     }
       
  1004   }
       
  1005   else {
       
  1006     form_set_error('name', t('You must specify a valid role name.'));
       
  1007   }
       
  1008 }
       
  1009 
       
  1010 /**
       
  1011  * Form submit handler for the user_admin_role() form.
       
  1012  */
       
  1013 function user_admin_role_submit($form, &$form_state) {
       
  1014   $role = (object) $form_state['values'];
       
  1015   if ($form_state['values']['op'] == t('Save role')) {
       
  1016     user_role_save($role);
       
  1017     drupal_set_message(t('The role has been renamed.'));
       
  1018   }
       
  1019   elseif ($form_state['values']['op'] == t('Add role')) {
       
  1020     user_role_save($role);
       
  1021     drupal_set_message(t('The role has been added.'));
       
  1022   }
       
  1023   $form_state['redirect'] = 'admin/people/permissions/roles';
       
  1024   return;
       
  1025 }
       
  1026 
       
  1027 /**
       
  1028  * Form submit handler for the user_admin_role() form.
       
  1029  */
       
  1030 function user_admin_role_delete_submit($form, &$form_state) {
       
  1031   $form_state['redirect'] = 'admin/people/permissions/roles/delete/' . $form_state['values']['rid'];
       
  1032 }
       
  1033 
       
  1034 /**
       
  1035  * Form to confirm role delete operation.
       
  1036  */
       
  1037 function user_admin_role_delete_confirm($form, &$form_state, $role) {
       
  1038   $form['rid'] = array(
       
  1039     '#type' => 'value',
       
  1040     '#value' => $role->rid,
       
  1041   );
       
  1042   return confirm_form($form, t('Are you sure you want to delete the role %name ?', array('%name' => $role->name)), 'admin/people/permissions/roles', t('This action cannot be undone.'), t('Delete'));
       
  1043 }
       
  1044 
       
  1045 /**
       
  1046  * Form submit handler for user_admin_role_delete_confirm().
       
  1047  */
       
  1048 function user_admin_role_delete_confirm_submit($form, &$form_state) {
       
  1049   user_role_delete((int) $form_state['values']['rid']);
       
  1050   drupal_set_message(t('The role has been deleted.'));
       
  1051   $form_state['redirect'] = 'admin/people/permissions/roles';
       
  1052 }
       
  1053