You are here

function skinr_ui_form in Skinr 7.2

Same name and namespace in other branches
  1. 6.2 skinr_ui.module \skinr_ui_form()

Form builder for the skins configuration form.

Parameters

$module: The module that we're editing settings of.

$element: The element of the object we're editing settings of.

$defaults: An array of default values keyed by theme name.

2 string references to 'skinr_ui_form'
skinr_context_ui_edit in skinr_context/skinr_context_ui.edit.inc
Menu callback; prepares some variables and displays a Skinr edit form.
skinr_ui_edit in ./skinr_ui.edit.inc
Menu callback; prepares some variables and displays a Skinr edit form.

File

./skinr_ui.edit.inc, line 71
Page callbacks for the Skinr UI module related to editing skins.

Code

function skinr_ui_form($form, &$form_state, $arguments, $defaults) {
  if (!skinr_ui_access('edit skin settings')) {

    // Deny access.
    return;
  }

  // Set arguments.
  $module = $arguments['module'];
  $element = $arguments['element'];

  // Set default values.
  $form_state['values']['skinr_settings'] = $defaults;

  // Set form class.
  $form['#attributes'] = array(
    'class' => array(
      'skinr-form',
    ),
  );
  $form['actions'] = array(
    '#type' => 'actions',
  );
  $form['actions']['submit'] = array(
    '#type' => 'submit',
    '#value' => t('Save'),
    '#weight' => 50,
  );
  $form['skinr']['module'] = array(
    '#type' => 'hidden',
    '#value' => $module,
  );
  $form['skinr']['element'] = array(
    '#type' => 'hidden',
    '#value' => $element,
  );
  $groups = skinr_get_group_info();
  $skin_infos = skinr_get_skin_info();

  // Apply overridden status to skins.
  foreach ($skin_infos as $skin_name => $skin_info) {
    $skin_infos[$skin_name]['status'] = skinr_skin_info_status_get($skin_infos[$skin_name]);
  }

  // Invoke hook_skinr_theme_hooks() and hook_skinr_theme_hooks_alter().
  $theme_hooks = skinr_theme_hooks($module, $element);
  $form['skinr_settings'] = array(
    '#tree' => TRUE,
    '#type' => 'container',
    // Move settings to top.
    '#weight' => 0,
  );
  $themes = list_themes();
  ksort($themes);

  // Get current theme, but make sure it's not the admin theme when we're editing with AJAX.
  $current_theme = skinr_current_theme(TRUE);
  foreach ($themes as $theme) {
    if (!$theme->status) {
      continue;
    }

    // If this hook is a region, and the region does not exist for this
    // theme, don't bother outputting any of the settings.
    if (strpos($theme_hooks[0], 'region') === 0) {

      // Strip the region__ part off the region name.
      $region = substr($theme_hooks[0], 8);
      $regions = system_region_list($theme->name, REGIONS_VISIBLE);
      if (!isset($regions[$region])) {
        continue;
      }
    }

    // Load defaults for theme sub-form.
    $defaults = isset($form_state['values']['skinr_settings']) ? $form_state['values']['skinr_settings'] : array();

    // Build theme sub-form.
    $form['skinr_settings'][$theme->name] = array(
      '#type' => 'fieldset',
      '#title' => $theme->info['name'] . ($theme->name == $current_theme ? ' (' . t('enabled + default') . ')' : ''),
      '#collapsible' => TRUE,
      '#collapsed' => $theme->name == $current_theme ? FALSE : TRUE,
    );
    if ($theme->name == $current_theme) {

      // Current theme goes at the top.
      $form['skinr_settings'][$theme->name]['#attributes'] = array(
        'class' => array(
          'skinr-ui-current-theme',
        ),
      );
      $form['skinr_settings'][$theme->name]['#weight'] = -10;

      // Use vertical tabs.
      $form['skinr_settings'][$theme->name]['groups'] = array(
        '#type' => 'vertical_tabs',
      );
    }

    // Create individual widgets for each skin.
    foreach ($skin_infos as $skin_name => $skin_info) {

      // Check if this skin is disabled.
      if (empty($skin_info['status'][$theme->name])) {
        continue;
      }

      // Check if this skin applies to this hook.
      if (!is_array($skin_info['theme hooks']) || !in_array('*', $skin_info['theme hooks']) && !_skinr_is_featured($theme_hooks, $skin_info['theme hooks'])) {
        continue;
      }

      // Create widget.
      $field = array();
      if (!empty($skin_info['form callback'])) {

        // Process custom form callbacks.
        // Load include file.
        if (!empty($skin_info['source']['include file'])) {
          skinr_load_include($skin_info['source']['include file']);
        }

        // Execute form callback.
        if (function_exists($skin_info['form callback'])) {
          $context = array(
            'theme' => $theme->name,
            'skin_name' => $skin_name,
            'skin_info' => $skin_info,
            'value' => isset($defaults[$theme->name][$skin_name]) ? $defaults[$theme->name][$skin_name] : array(),
          );
          $field = $skin_info['form callback']($form, $form_state, $context);
        }
      }
      else {
        switch ($skin_info['type']) {
          case 'checkboxes':
            $field = array(
              '#type' => 'checkboxes',
              '#multiple' => TRUE,
              '#title' => t($skin_info['title']),
              '#options' => skinr_ui_info_options_to_form_options($skin_info['options']),
              '#default_value' => isset($defaults[$theme->name][$skin_name]) ? $defaults[$theme->name][$skin_name] : array(),
              '#description' => t($skin_info['description']),
              '#weight' => isset($skin_info['weight']) ? $skin_info['weight'] : NULL,
            );
            break;
          case 'radios':
            $field = array(
              '#type' => 'radios',
              '#title' => t($skin_info['title']),
              '#options' => array_merge(array(
                '' => '<none>',
              ), skinr_ui_info_options_to_form_options($skin_info['options'])),
              '#default_value' => isset($defaults[$theme->name][$skin_name]) ? $defaults[$theme->name][$skin_name] : '',
              '#description' => t($skin_info['description']),
              '#weight' => isset($skin_info['weight']) ? $skin_info['weight'] : NULL,
            );
            break;
          case 'select':
            $field = array(
              '#type' => 'select',
              '#title' => t($skin_info['title']),
              '#options' => array_merge(array(
                '' => '<none>',
              ), skinr_ui_info_options_to_form_options($skin_info['options'])),
              '#default_value' => isset($defaults[$theme->name][$skin_name]) ? $defaults[$theme->name][$skin_name] : '',
              '#description' => t($skin_info['description']),
              '#weight' => isset($skin_info['weight']) ? $skin_info['weight'] : NULL,
            );
            break;
          default:

            // Raise an error.
            drupal_set_message(t("Widget %name's type is invalid.", array(
              '%name' => $skin_name,
            )), 'error', FALSE);
            break;
        }
      }
      if (empty($skin_info['group']) || empty($groups[$skin_info['group']])) {
        $form['skinr_settings'][$theme->name][$skin_name] = $field;
      }
      else {
        if (!empty($field) && !isset($form['skinr_settings'][$theme->name]['groups'][$skin_info['group']])) {
          $group = $groups[$skin_info['group']];
          $form['skinr_settings'][$theme->name]['groups'][$skin_info['group']] = array(
            '#type' => 'fieldset',
            '#title' => t($group['title']),
            '#description' => t($group['description']),
            '#weight' => isset($group['weight']) ? $group['weight'] : NULL,
          );
        }
        $form['skinr_settings'][$theme->name]['groups'][$skin_info['group']][$skin_name] = $field;
      }
    }

    // Check for access.
    if (skinr_ui_access('edit advanced skin settings')) {
      $skin_name = '_additional';
      $form['skinr_settings'][$theme->name]['groups']['_additional'] = array(
        '#type' => 'fieldset',
        '#title' => t('Advanced'),
        '#weight' => 50,
      );
      $form['skinr_settings'][$theme->name]['groups']['_additional']['_additional'] = array(
        '#type' => 'textfield',
        '#title' => t('CSS classes'),
        '#size' => 40,
        '#description' => t('To add CSS classes manually, enter classes separated by a single space i.e. <code>first-class second-class</code>'),
        '#default_value' => isset($defaults[$theme->name][$skin_name]) ? $defaults[$theme->name][$skin_name] : '',
      );
    }
  }

  // Only add validation handler once.
  if (!isset($form['#validate']) || !in_array('skinr_ui_form_validate', $form['#validate'])) {
    $form['#validate'][] = 'skinr_ui_form_validate';
  }

  // Only add submit handler once.
  if (!isset($form['#submit']) || !in_array('skinr_ui_form_submit', $form['#submit'])) {
    $form['#submit'][] = 'skinr_ui_form_submit';
  }
  return $form;
}