You are here

admin_select.module in Administration Menu select 6

Same filename and directory in other branches
  1. 7 admin_select.module

Core functionality for Administration Menu select module.

File

admin_select.module
View source
<?php

/**
 * @file
 * Core functionality for Administration Menu select module.
 */

/**
 * Include additional files.
 */
foreach (module_list() as $module) {
  if (file_exists($file = dirname(__FILE__) . "/includes/{$module}.inc")) {
    require_once $file;
  }
}

/**
 * Implements hook_init().
 */
function admin_select_init() {
  $data = unserialize($GLOBALS['user']->data);
  $current = isset($data) && isset($data['admin_select']) ? $data['admin_select'] : _admin_select_default();
  $info = admin_select_get_admin_select_info();
  foreach ($info as $key => $item) {
    if ($key != $current) {
      admin_select_suppress_item($item);
    }
  }
}
function _admin_select_default() {
  $info = admin_select_get_admin_select_info();
  $settings = variable_get('admin_select_defaults', array());
  foreach ($settings as &$setting) {
    $setting['#weight'] = $setting['weight'];
  }
  uasort($settings, "element_sort");
  foreach ($settings as $rid => $setting) {
    if (isset($GLOBALS['user']->roles[$rid]) && (isset($info[$setting['admin_select_default']]) || empty($setting['admin_select_default']))) {
      return $setting['admin_select_default'];
    }
  }
  return '';
}

/**
 * Implements hook_perm().
 */
function admin_select_perm() {
  return array(
    'administer administration menu select',
    'select administration menu',
  );
}

/**
 * Implements hook_theme().
 */
function admin_select_theme() {
  $items = array();
  $items['admin_select_defaults'] = array(
    'arguments' => array(
      'form' => array(),
    ),
  );
  return $items;
}

/**
 * Administration Menu select deafults form.
 */
function admin_select_defaults(&$form_state) {
  $settings = variable_get('admin_select_defaults', array());
  $form = array();
  $info = admin_select_get_admin_select_info();
  foreach ($info as &$item) {
    $item = $item['title'];
  }
  $form['roles']['#tree'] = TRUE;
  foreach (user_roles(TRUE) as $rid => $role) {
    $form['roles'][$rid]['#weight'] = isset($settings[$rid]) ? $settings[$rid]['weight'] : 0;
    $form['roles'][$rid]["admin_select_default"] = array(
      '#type' => 'select',
      '#title' => ucwords($role),
      '#options' => array(
        '' => t('None'),
      ) + $info,
      '#default_value' => isset($settings[$rid]) ? $settings[$rid]['admin_select_default'] : '',
    );
    $form['roles'][$rid]['weight'] = array(
      '#type' => 'weight',
      '#delta' => count(user_roles(TRUE)),
      '#default_value' => isset($settings[$rid]) ? $settings[$rid]['weight'] : 0,
      '#attributes' => array(
        'class' => 'admin-select-weight',
      ),
    );
  }
  uasort($form['roles'], "element_sort");
  $form['submit'] = array(
    '#type' => 'submit',
    '#value' => t('Save configuration'),
  );
  return $form;
}

/**
 * Submit callback; Administration Menu select deafults form.
 */
function admin_select_defaults_submit($form, $form_state) {
  drupal_set_message('The defaults have been saved.');
  variable_set('admin_select_defaults', $form_state['values']['roles']);
}

/**
 * Implements hook_user().
 */
function admin_select_user($op, &$edit, &$account, $category = NULL) {
  if ($op == 'form' && $category == 'account' && user_access('select administration menu')) {
    $form = array();
    $data = unserialize($edit['data']);
    $info = admin_select_get_admin_select_info();
    $options = array();
    foreach ($info as $key => $item) {
      if (!empty($item['access'])) {
        $options[$key] = $item['title'];
      }
    }
    asort($options);
    $form['admin_select'] = array(
      '#type' => 'fieldset',
      '#title' => t('Administration Menu select settings'),
      '#collapsible' => TRUE,
      '#weight' => 10,
      '#access' => !empty($options),
    );
    $form['admin_select']['admin_select'] = array(
      '#type' => 'select',
      '#options' => array(
        '' => t('None'),
      ) + $options,
      '#default_value' => isset($data['admin_select']) ? $data['admin_select'] : '',
    );
    return $form;
  }
}

/**
 *
 */
function admin_select_get_admin_select_info($check_access = TRUE) {
  $info = module_invoke_all('admin_select_info');
  drupal_alter('admin_select_info', $info);
  if ($check_access) {
    $info = array_map('_admin_select_check_access', $info);
  }
  return $info;
}

/**
 * Suppress and admin item.
 */
function admin_select_suppress_item($item) {
  if (!empty($item['include'])) {
    include_once $item['include'];
  }
  if (!empty($item['suppress callback']) && function_exists($item['suppress callback'])) {
    $item['suppress callback']();
  }
}

/**
 * Check to see if the current user has access to an admin item.
 */
function _admin_select_check_access(&$item) {

  // Determine access callback, which will decide whether or not the current
  // user has access to this path.
  $item += array(
    'access callback' => 'user_access',
  );
  $callback = empty($item['access callback']) ? FALSE : trim($item['access callback']);

  // Check for a TRUE or FALSE value.
  if (is_bool($callback)) {
    $item['access'] = $callback;
  }
  else {
    $arguments = isset($item['access arguments']) ? $item['access arguments'] : array();

    // As call_user_func_array is quite slow and user_access is a very common
    // callback, it is worth making a special case for it.
    if ($callback == 'user_access') {
      $item['access'] = count($arguments) == 1 ? user_access($arguments[0]) : user_access($arguments[0], $arguments[1]);
    }
    elseif (function_exists($callback)) {
      $item['access'] = call_user_func_array($callback, $arguments);
    }
  }
  return $item;
}

/**
 * Theme callback; Administration Menu select deafults form.
 */
function theme_admin_select_defaults($form) {
  $header = array(
    t('Role'),
    t('Administration menu'),
    t('Weight'),
  );
  $rows = array();
  foreach (element_children($form['roles']) as $rid) {
    $title = $form['roles'][$rid]['admin_select_default']['#title'];
    unset($form['roles'][$rid]['admin_select_default']['#title']);
    $rows[] = array(
      'data' => array(
        $title,
        drupal_render($form['roles'][$rid]['admin_select_default']),
        drupal_render($form['roles'][$rid]['weight']),
      ),
      'class' => 'draggable',
    );
  }
  drupal_add_tabledrag('admin-select', 'order', 'sibling', 'admin-select-weight');
  $output = theme('table', $header, $rows, array(
    'id' => 'admin-select',
  ));
  $output .= drupal_render($form);
  return $output;
}

Functions

Namesort descending Description
admin_select_defaults Administration Menu select deafults form.
admin_select_defaults_submit Submit callback; Administration Menu select deafults form.
admin_select_get_admin_select_info
admin_select_init Implements hook_init().
admin_select_perm Implements hook_perm().
admin_select_suppress_item Suppress and admin item.
admin_select_theme Implements hook_theme().
admin_select_user Implements hook_user().
theme_admin_select_defaults Theme callback; Administration Menu select deafults form.
_admin_select_check_access Check to see if the current user has access to an admin item.
_admin_select_default