You are here

skinr_context_ui.edit.inc in Skinr 7.2

Same filename and directory in other branches
  1. 8.2 skinr_context/skinr_context_ui.edit.inc

Page callbacks for the Skinr Context UI module related to editing skins and groups.

File

skinr_context/skinr_context_ui.edit.inc
View source
<?php

/**
 * @file
 * Page callbacks for the Skinr Context UI module related to editing skins and groups.
 */

/**
 * Menu callback; prepares some variables and displays a Skinr edit form.
 *
 * @param $module
 *   The module that we're editing settings of.
 * @param $element
 *   The element of the object we're editing settings of.
 * @param $group
 *   Skinr settings group object.
 */
function skinr_context_ui_edit($module, $element, $group) {
  module_load_include('inc', 'skinr_ui', 'skinr_ui.edit');

  // Set defaults.
  $defaults = skinr_context_ui_form_get_defaults($module, $element, $group);
  return drupal_get_form('skinr_ui_form', array(
    'module' => $module,
    'element' => $element,
    'gid' => $group->gid,
  ), $defaults);
}

/**
 * Helper function to get the default values for the skinr edit form.
 *
 * @param $module
 *   The module that we're editing settings of.
 * @param $element
 *   The element of the object we're editing settings of.
 * @param $group
 *   Skinr settings group object.
 */
function skinr_context_ui_form_get_defaults($module, $element, $group) {

  // Set defaults.
  $defaults = array();
  $themes = list_themes();
  foreach ($themes as $theme) {
    if (!$theme->status) {
      continue;
    }
    $params = array(
      'theme' => $theme->name,
      'module' => $module,
      'element' => $element,
      'gid' => $group->gid,
    );

    // Don't nest the call to skinr_context_group_get_sids() in skinr_skin_load_multiple().
    // If the prior function returns no results, the second function will load
    // ALL skins.
    if ($sids = skinr_context_group_get_sids($params)) {
      $skins = skinr_skin_load_multiple($sids);
      foreach ($skins as $skin) {
        $defaults[$theme->name][$skin->skin] = $skin->options;
      }
    }
  }
  return $defaults;
}

/**
 * Menu callback; adds a skin settings group to an element.
 *
 * @param $module
 *   The module that we're adding a group to.
 * @param $element
 *   The element of the object we're adding a group to.
 */
function skinr_context_ui_group_add($module, $element) {
  return drupal_get_form('skinr_context_ui_group_add_form', $module, $element);
}
function skinr_context_ui_group_add_form($form, $form_state, $module, $element) {
  $form['module'] = array(
    '#type' => 'hidden',
    '#value' => $module,
  );
  $form['element'] = array(
    '#type' => 'hidden',
    '#value' => $element,
  );
  $form['title'] = array(
    '#type' => 'textfield',
    '#title' => t('Group title'),
    '#required' => TRUE,
    '#description' => t('Descriptive title for this skin settings group.'),
  );
  $form['gid'] = array(
    '#type' => 'machine_name',
    '#title' => t('Group name'),
    // '#maxlength' => MENU_MAX_MENU_NAME_LENGTH_UI,
    '#description' => t('A unique name to identify this group. It must only contain lowercase letters, numbers, hyphens and underscores.'),
    '#field_prefix' => $module . ':' . $element . ':',
    '#machine_name' => array(
      'exists' => 'skinr_context_ui_group_name_exists',
      'source' => array(
        'title',
      ),
      'replace_pattern' => '[^a-z0-9-_]+',
    ),
  );
  $form['description'] = array(
    '#type' => 'textfield',
    '#title' => t('Description'),
    '#description' => t('A description for this group.'),
  );
  $form['actions'] = array(
    '#tree' => FALSE,
    '#type' => 'actions',
  );
  $form['actions']['submit'] = array(
    '#type' => 'submit',
    '#value' => t('Add group'),
  );
  return $form;
}

/**
 * Menu callback; allows adding a new skin settings group.
 */
function skinr_context_ui_group_add_form_submit($form, $form_state) {
  $group = (object) array(
    'gid' => $form_state['values']['module'] . ':' . $form_state['values']['element'] . ':' . $form_state['values']['gid'],
    'module' => $form_state['values']['module'],
    'element' => $form_state['values']['element'],
    'title' => $form_state['values']['title'],
    'description' => $form_state['values']['description'],
    'conditions' => array(
      'sitewide' => array(
        'values' => array(
          1 => 1,
        ),
      ),
    ),
    'condition_mode' => CONTEXT_CONDITION_MODE_OR,
    'weight' => 0,
    'status' => 1,
  );
  skinr_context_group_save($group);
  drupal_goto('admin/structure/skinr/edit/' . $group->module . '/' . $group->element . '/' . $group->gid);
}

/**
 * Form builder for the skinr settings group delete confirmation form.
 *
 * @param $group
 *   Skinr settings group object.
 *
 * @ingroup forms
 */
function skinr_context_ui_group_delete_confirm($form, &$form_state, $group) {
  $form['#group'] = $group;
  $form['gid'] = array(
    '#type' => 'value',
    '#value' => $group->gid,
  );
  return confirm_form($form, t('Are you sure you want to delete this skin settings group?'), isset($_GET['destination']) ? $_GET['destination'] : 'admin/structure/skinr/edit/' . $group->module . '/' . $group->element, t('This action cannot be undone.<br />Module: %module<br />Element: %element<br />Group: %group', array(
    '%module' => $group->module,
    '%element' => $group->element,
    '%group' => $group->title,
  )), t('Delete'), t('Cancel'));
}

/**
 * Form submission handler for skinr_context_ui_group_delete_confirm().
 */
function skinr_context_ui_group_delete_confirm_submit($form, &$form_state) {
  if ($form_state['values']['confirm']) {
    skinr_context_group_delete($form_state['values']['gid']);
    watchdog('skinr', 'Deleted a skin settings group.');
    drupal_set_message(t('A skin settings group has been deleted.'));
  }
  $group = $form['#group'];
  $form_state['redirect'] = 'admin/structure/skinr/edit/' . $group->module . '/' . $group->element;
}

/**
 * Menu callback; lists skin settings groups for an element.
 *
 * @param $module
 *   The module that we're editing settings of.
 * @param $element
 *   The element of the object we're editing settings of.
 */
function skinr_context_ui_group_list($module, $element) {

  // Output list of groups.
  $gids = skinr_context_group_get_gids(array(
    'module' => $module,
    'element' => $element,
  ));
  $groups = skinr_context_group_load_multiple($gids);
  return drupal_get_form('skinr_context_ui_group_list_form', $groups);
}

/**
 * Form builder for the skin settings group listing.
 */
function skinr_context_ui_group_list_form($form, $form_state, $groups) {

  // Weights range from -delta to +delta, so delta should be at least half
  // of the amount of blocks present. This makes sure all blocks in the same
  // region get an unique weight.
  $weight_delta = round(count($groups) / 2);
  $form['groups'] = array();
  $form['#tree'] = TRUE;
  $form['#empty_text'] = t("You don't have any groups for this element.");
  foreach ($groups as $gid => $group) {
    $group = (array) $group;
    $form['groups'][$gid]['info'] = array(
      '#markup' => theme('skinr_context_ui_group_summary', array(
        'title' => $group['title'],
        'description' => $group['description'],
      )),
    );
    $form['groups'][$gid]['status'] = array(
      '#type' => 'checkbox',
      '#default_value' => $group['status'],
      '#title_display' => 'invisible',
      '#title' => t('Enable @group group', array(
        '@group' => $group['title'],
      )),
    );
    $form['groups'][$gid]['weight'] = array(
      '#type' => 'weight',
      '#default_value' => $group['weight'],
      '#delta' => $weight_delta,
      '#title_display' => 'invisible',
      '#title' => t('Weight for @group group', array(
        '@group' => $group['title'],
      )),
    );
    $destination = array();
    if (isset($_GET['destination'])) {
      $path = $_GET['q'];
      $query = drupal_http_build_query(drupal_get_query_parameters());
      if ($query != '') {
        $path .= '?' . $query;
      }
      $destination = array(
        'destination' => $path,
      );
    }
    $operations = array();
    $operations['edit'] = array(
      '#type' => 'link',
      '#title' => t('edit'),
      '#href' => 'admin/structure/skinr/edit/' . $group['module'] . '/' . $group['element'] . '/' . $group['gid'],
      '#options' => array(
        'query' => $destination,
      ),
    );
    $operations['delete'] = array(
      '#type' => 'link',
      '#title' => t('delete'),
      '#href' => 'admin/structure/skinr/edit/' . $group['module'] . '/' . $group['element'] . '/' . $group['gid'] . '/delete',
      '#options' => array(
        'query' => $destination,
      ),
    );
    $form['groups'][$gid]['operations'] = $operations;
  }

  // Prepare cancel link.
  if (isset($_GET['destination'])) {
    $options = drupal_parse_url(urldecode($_GET['destination']));
  }
  else {
    $options = array(
      'path' => 'admin/structure/skinr',
    );
  }
  $form['actions'] = array(
    '#tree' => FALSE,
    '#type' => 'actions',
  );
  $form['actions']['submit'] = array(
    '#type' => 'submit',
    '#value' => t('Save groups'),
  );
  $form['actions']['done'] = array(
    '#type' => 'link',
    '#title' => t('Done'),
    '#href' => $options['path'],
    '#options' => $options,
  );
  return $form;
}

/**
 * Form submission handler for skinr_context_ui_group_list_form().
 */
function skinr_context_ui_group_list_form_submit($form, $form_state) {
  foreach ($form_state['values']['groups'] as $gid => $data) {

    // Load an uncached version of the skin settings group object.
    $group = skinr_context_group_load_unchanged($gid);

    // Let's save some time in skinr_context_group_save() by setting $group->original here.
    $group->original = clone $group;

    // Update status and weight.
    $group->status = $data['status'];
    $group->weight = $data['weight'];
    skinr_context_group_save($group);
  }
}

// -----------------------------------------------------------------------
// Theme functions.

/**
 * Returns HTML for the menu overview form into a table.
 *
 * @param $variables
 *   An associative array containing:
 *   - form: A render element representing the form.
 *
 * @ingroup themeable
 */
function theme_skinr_context_ui_group_list_form($variables) {
  $form = $variables['form'];
  drupal_add_tabledrag('skinr-context-ui-group-list', 'order', 'sibling', 'skinr-context-ui-group-weight');
  $header = array(
    t('Skin settings group'),
    array(
      'data' => t('Enabled'),
      'class' => array(
        'checkbox',
      ),
    ),
    t('Weight'),
    array(
      'data' => t('Operations'),
      'colspan' => '2',
    ),
  );
  $rows = array();
  foreach (element_children($form['groups']) as $gid) {
    if (isset($form['groups'][$gid]['status'])) {
      $element =& $form['groups'][$gid];

      // Build a list of operations.
      $operations = array();
      foreach (element_children($element['operations']) as $op) {
        $operations[] = array(
          'data' => drupal_render($element['operations'][$op]),
          'class' => array(
            'skinr-context-ui-group-operations',
          ),
        );
      }

      // Add special classes to be used for tabledrag.js.
      $element['weight']['#attributes']['class'] = array(
        'skinr-context-ui-group-weight',
      );
      $row = array();
      $row[] = drupal_render($element['info']);
      $row[] = array(
        'data' => drupal_render($element['status']),
        'class' => array(
          'checkbox',
          'skinr-context-ui-group-enabled',
        ),
      );
      $row[] = drupal_render($element['weight']);
      $row = array_merge($row, $operations);
      $row = array_merge(array(
        'data' => $row,
      ), $element['#attributes']);
      $row['class'][] = 'draggable';
      $rows[] = $row;
    }
  }
  $output = '';
  if (empty($rows)) {
    $rows[] = array(
      array(
        'data' => $form['#empty_text'],
        'colspan' => '7',
      ),
    );
  }
  $output .= theme('table', array(
    'header' => $header,
    'rows' => $rows,
    'attributes' => array(
      'id' => 'skinr-context-ui-group-list',
    ),
  ));
  $output .= drupal_render_children($form);
  return $output;
}

/**
 * Returns HTML for title and descrition info for the skin settings groups listing.
 *
 * @param $variables
 *   An associative array containing:
 *   - title: The group's title.
 *   - description: The group's description.
 *
 * @ingroup themeable
 */
function theme_skinr_context_ui_group_summary($variables) {
  $info = '<strong class="title">' . $variables['title'] . '</strong>';
  if (!empty($variables['description'])) {
    $info .= '<div class="description">' . $variables['description'] . '</div>';
  }
  return '<div class="skin-group-summary">' . $info . '</div>';
}

Functions

Namesort descending Description
skinr_context_ui_edit Menu callback; prepares some variables and displays a Skinr edit form.
skinr_context_ui_form_get_defaults Helper function to get the default values for the skinr edit form.
skinr_context_ui_group_add Menu callback; adds a skin settings group to an element.
skinr_context_ui_group_add_form
skinr_context_ui_group_add_form_submit Menu callback; allows adding a new skin settings group.
skinr_context_ui_group_delete_confirm Form builder for the skinr settings group delete confirmation form.
skinr_context_ui_group_delete_confirm_submit Form submission handler for skinr_context_ui_group_delete_confirm().
skinr_context_ui_group_list Menu callback; lists skin settings groups for an element.
skinr_context_ui_group_list_form Form builder for the skin settings group listing.
skinr_context_ui_group_list_form_submit Form submission handler for skinr_context_ui_group_list_form().
theme_skinr_context_ui_group_list_form Returns HTML for the menu overview form into a table.
theme_skinr_context_ui_group_summary Returns HTML for title and descrition info for the skin settings groups listing.