'fieldset', '#title' => t('Update options'), '#prefix' => '
', '#suffix' => '
', ); $options = array(); foreach (module_invoke_all('skinr_operations') as $operation => $array) { $options[$operation] = $array['label']; } $form['options']['operation'] = array( '#type' => 'select', '#options' => $options, '#default_value' => 'approve', ); $form['options']['submit'] = array( '#type' => 'submit', '#value' => t('Update'), '#submit' => array('skinr_ui_admin_skins_submit'), ); $themes = list_themes(); ksort($themes); $skinr_settings = array(); $options = array(); $destination = drupal_get_destination(); $type = !empty($filters['type']) ? $filters['type'] : NULL; foreach ($themes as $theme) { if (!$theme->status || (!empty($filters['theme']) && $filters['theme'] != $theme->name)) { continue; } if (empty($type)) { $skinrs = skinr_get($theme->name); } else { $skinrs = array($type => skinr_get($theme->name, $type)); } foreach ($skinrs as $module => $elements) { foreach ($elements as $sid => $skin) { $key = $theme->name .'__'. $module .'__'. $sid; $skinr_settings[$key] = ''; if ($module == 'page') { $url_edit = 'admin/build/skinr/rules/edit/'. $sid; } else { $url_edit = 'admin/build/skinr/edit/nojs/'. $module .'/'. $sid; } $url_delete = 'admin/build/skinr/delete/'. $theme->name .'/'. $module .'/'. $sid; $operations = array( 'edit' => array( 'title' => t('edit'), 'href' => $url_edit, 'query' => $destination, ), 'delete' => array( 'title' => t('delete'), 'href' => $url_delete, 'query' => $destination, ), ); $options[$key] = array( 'theme' => $theme->info['name'], 'type' => $module, 'sid' => $sid, 'operations' => theme('links', $operations, array('class' => 'links inline')), ); } } } $form['rows'] = array('#type' => 'value', '#value' => $options); $form['skinr_settings'] = array('#type' => 'checkboxes', '#options' => $skinr_settings); $form['#theme'] = 'skinr_ui_admin_skins'; return $form; } /** * Validate skinr_ui_admin_skins form submissions. * * Check if any skinr settings have been selected to perform the chosen * 'Update option' on. */ function skinr_ui_admin_skins_validate($form, &$form_state) { $skinr_settings = array_filter($form_state['values']['skinr_settings']); if (count($skinr_settings) == 0) { form_set_error('', t('No items selected.')); } } /** * Process skinr_ui_admin_skins form submissions. * * Execute the chosen 'Update option' on the selected nodes. */ function skinr_ui_admin_skins_submit($form, &$form_state) { $operations = module_invoke_all('skinr_operations'); $operation = $operations[$form_state['values']['operation']]; // Filter out unchecked nodes $skinr_settings = array_filter($form_state['values']['skinr_settings']); if ($function = $operation['callback']) { // Add in callback arguments if present. if (isset($operation['callback arguments'])) { $args = array_merge(array($nodes), $operation['callback arguments']); } else { $args = array($skinr_settings); } call_user_func_array($function, $args); cache_clear_all(); } else { // We need to rebuild the form to go to a second step. For example, to // show the confirmation form for the deletion of nodes. $form_state['rebuild'] = TRUE; } } /** * Implementation of hook_skinr_operations(). */ function skinr_ui_skinr_operations() { $operations = array( 'delete' => array( 'label' => t('Delete'), 'callback' => NULL, ), ); return $operations; } /** * List skinr administration filters that can be applied. */ function skinr_ui_filters() { // Theme filter. $themes = list_themes(); ksort($themes); $options = array(); foreach ($themes as $theme) { if (!$theme->status) { continue; } $options[$theme->name] = $theme->info['name']; } $filters['theme'] = array( 'title' => t('theme'), 'options' => $options, ); // Type filter. $config = skinr_fetch_config(); $options = array(); foreach ($config as $type => $data) { $options[$type] = $type; } $filters['type'] = array( 'title' => t('type'), 'options' => $options, ); return $filters; } /** * Return form for skinr administration filters. */ function skinr_ui_filter_form() { $session = &$_SESSION['skinr_ui_overview_filter']; $session = is_array($session) ? $session : array(); $filters = skinr_ui_filters(); $i = 0; $form['filters'] = array( '#type' => 'fieldset', '#title' => t('Show only items where'), '#theme' => 'skinr_ui_filters', ); $form['#submit'][] = 'skinr_ui_filter_form_submit'; foreach ($session as $filter) { list($type, $value) = $filter; $value = $filters[$type]['options'][$value]; if ($i++) { $form['filters']['current'][] = array('#value' => t('and where %a is %b', array('%a' => $filters[$type]['title'], '%b' => $value))); } else { $form['filters']['current'][] = array('#value' => t('%a is %b', array('%a' => $filters[$type]['title'], '%b' => $value))); } if (in_array($type, array('theme', 'type'))) { // Remove the option if it is already being filtered on. unset($filters[$type]); } } foreach ($filters as $key => $filter) { $names[$key] = $filter['title']; $form['filters']['status'][$key] = array('#type' => 'select', '#options' => $filter['options']); } $form['filters']['filter'] = array('#type' => 'radios', '#options' => $names, '#default_value' => 'status'); if (count($filters)) { $form['filters']['buttons']['submit'] = array('#type' => 'submit', '#value' => (count($session) ? t('Refine') : t('Filter'))); } if (count($session)) { $form['filters']['buttons']['undo'] = array('#type' => 'submit', '#value' => t('Undo')); $form['filters']['buttons']['reset'] = array('#type' => 'submit', '#value' => t('Reset')); } drupal_add_js('misc/form.js', 'core'); return $form; } /** * Theme skinr administration filter form. * * @ingroup themeable */ function theme_skinr_ui_filter_form($form) { $output = ''; $output .= '
'; $output .= drupal_render($form['filters']); $output .= '
'; $output .= drupal_render($form); return $output; } /** * Theme skinr administration filter selector. * * @ingroup themeable */ function theme_skinr_ui_filters($form) { $output = ''; $output .= ''; return $output; } /** * Process result from node administration filter form. */ function skinr_ui_filter_form_submit($form, &$form_state) { $filters = skinr_ui_filters(); switch ($form_state['values']['op']) { case t('Filter'): case t('Refine'): if (isset($form_state['values']['filter'])) { $filter = $form_state['values']['filter']; // Flatten the options array to accommodate hierarchical/nested options. $flat_options = form_options_flatten($filters[$filter]['options']); if (isset($flat_options[$form_state['values'][$filter]])) { $_SESSION['skinr_ui_overview_filter'][] = array($filter, $form_state['values'][$filter]); } } break; case t('Undo'): array_pop($_SESSION['skinr_ui_overview_filter']); break; case t('Reset'): $_SESSION['skinr_ui_overview_filter'] = array(); break; } } /** * Menu callback; displays the skinr settings administration form. */ function skinr_ui_admin_form(&$form_state) { $form = array(); $form['overlay'] = array( '#type' => 'fieldset', '#title' => t('Overlay'), '#collapsible' => TRUE, ); $form['overlay']['skinr_overlay_width'] = array( '#type' => 'textfield', '#title' => t('Window width'), '#default_value' => variable_get('skinr_overlay_width', 600), '#description' => t('The width of the overlay window. Leave this field blank to allow the window to automatically resize itself to a minimal width.'), ); $form['overlay']['skinr_overlay_height'] = array( '#type' => 'textfield', '#title' => t('Window height'), '#default_value' => variable_get('skinr_overlay_height', NULL), '#description' => t('The height of the overlay window. Leave this field blank to allow the window to automatically resize itself to the height of your browser.'), ); return system_settings_form($form); } /** * Validation handler for skinr settings administration form. */ function skinr_ui_admin_form_validate(&$form, &$form_state) { if (empty($form_state['values']['skinr_overlay_width'])) { $form_state['values']['skinr_overlay_width'] = NULL; } if (empty($form_state['values']['skinr_overlay_height'])) { $form_state['values']['skinr_overlay_height'] = NULL; } } /** * Helper function to sort skinsets by the name in their .info file. */ function skinr_ui_sort_by_info_name($a, $b) { return strcasecmp($a->info['name'], $b->info['name']); } /** * Menu callback; displays a listing of all non-theme skinsets. * * @ingroup forms * @see skinr_ui_skinsets_form_submit() */ function skinr_ui_skinsets_form() { $skinsets = skinr_rebuild_skinset_data(); uasort($skinsets, 'skinr_ui_sort_by_info_name'); // Store module list for use in the theme function. $form['skinsets'] = array('#type' => 'value', '#value' => $skinsets); $options = array(); $status = array(); $incompatible_core = array(); $incompatible_php = array(); foreach ($skinsets as $skinset) { $screenshot = NULL; $skinset_keys = array($skinset->name); // Look for a screenshot in the current skinset. if (isset($skinsets[$skinset->name]) && file_exists($skinsets[$skinset->name]->info['screenshot'])) { $screenshot = $skinsets[$skinset->name]->info['screenshot']; } $screenshot = $screenshot ? theme('image', $screenshot, t('Screenshot for %theme theme', array('%theme' => $skinset->info['name'])), '', array('class' => 'screenshot'), FALSE) : t('no screenshot'); $form[$skinset->name]['screenshot'] = array('#value' => $screenshot); $form[$skinset->name]['info'] = array( '#type' => 'value', '#value' => $skinset->info, ); $options[$skinset->name] = ''; if (!empty($skinset->status)) { $status[] = $skinset->name; } else { // Ensure this theme is compatible with this version of core. if (!isset($skinset->info['core']) || $skinset->info['core'] != DRUPAL_CORE_COMPATIBILITY) { $incompatible_core[] = $skinset->name; } if (version_compare(phpversion(), $skinset->info['php']) < 0) { $incompatible_php[$skinset->name] = $skinset->info['php']; } } $form[$skinset->name]['operations'] = array( '#value' => l('configure', 'admin/build/skinr/skins/settings/'. $skinset->name), ); } $form['status'] = array( '#type' => 'checkboxes', '#options' => $options, '#default_value' => $status, '#incompatible_skinsets_core' => drupal_map_assoc($incompatible_core), '#incompatible_skinsets_php' => $incompatible_php, ); $form['buttons']['submit'] = array( '#type' => 'submit', '#value' => t('Save configuration'), ); $form['buttons']['reset'] = array( '#type' => 'submit', '#value' => t('Reset to defaults'), ); return $form; } /** * Menu callback; displays a listing of all skins in a skinsets, allowing you * to enable or disable them individually for each theme. * * @ingroup forms * @see skinr_ui_skinsets_settings_form_submit() */ function skinr_ui_skinsets_settings_form($form_state, $skinset_name) { $form = array( '#tree' => TRUE, ); $skinsets = skinr_skinsets('skinset'); if (!empty($skinsets[$skinset_name])) { $skinset = $skinsets[$skinset_name]; } $themes = list_themes(); ksort($themes); foreach ($skinset->skins as $skin_name => $skin) { $form[$skin_name]['info'] = array( '#type' => 'value', '#value' => $skin, ); $status = array(); $options = array(); foreach ($themes as $theme) { if (!$theme->status) { continue; } $options[$theme->name] = ''; if (!empty($skin['status'][$theme->name])) { $status[] = $theme->name; } } $form[$skin_name]['status'] = array( '#type' => 'checkboxes', '#options' => $options, '#default_value' => $status, ); } $form['skinset'] = array( '#type' => 'value', '#value' => $skinset_name, ); $form['buttons']['submit'] = array( '#type' => 'submit', '#value' => t('Save configuration'), ); $form['buttons']['reset'] = array( '#type' => 'submit', '#value' => t('Reset to defaults'), ); return $form; } /** * Process skinr_ui_skinsets_form form submissions. */ function skinr_ui_skinsets_form_submit($form, &$form_state) { // Store list of previously enabled themes and disable all themes $old_skinset_list = $new_skinset_list = array(); foreach (skinr_skinsets('skinset') as $skinset) { if ($skinset->status) { $old_skinset_list[] = $skinset->name; } } db_query("UPDATE {skinr_skinsets} SET status = 0"); if ($form_state['values']['op'] == t('Save configuration')) { if (is_array($form_state['values']['status'])) { foreach ($form_state['values']['status'] as $key => $choice) { if ($choice) { $new_theme_list[] = $key; db_query("UPDATE {skinr_skinsets} SET status = 1 WHERE name = '%s'", $key); } } } } else { // Revert to defaults: disable all skinsets. } // Refresh skinsets from DB. skinr_skinsets('skinset', TRUE); // @todo Disable any skins from skinsets that are now disabled. drupal_set_message(t('The configuration options have been saved.')); $form_state['redirect'] = 'admin/build/skinr/skins'; return; } /** * Process skinr_ui_skinsets_settings_form form submissions. */ function skinr_ui_skinsets_settings_form_submit($form, &$form_state) { if ($form_state['values']['op'] == t('Save configuration')) { foreach ($form_state['values'] as $skin_name => $skin) { if (is_array($form_state['values'][$skin_name]['status'])) { $skinr_skin = new StdClass(); $skinr_skin->name = $form_state['values']['skinset']; $skinr_skin->type = 'skinset'; $skinr_skin->skin = $skin_name; $skinr_skin->status = _skinr_array_strip_empty($form_state['values'][$skin_name]['status']); if (db_result(db_query("SELECT 1 FROM {skinr_skins} WHERE name = '%s' AND skin = '%s'", $skinr_skin->name, $skinr_skin->skin))) { // Record exists, so let's update. drupal_write_record('skinr_skins', $skinr_skin, array('name', 'skin')); } else { // Insert a new record. drupal_write_record('skinr_skins', $skinr_skin); } } } } else { // Revert to defaults: disable all skinsets. } drupal_set_message(t('The configuration options have been saved.')); $form_state['redirect'] = 'admin/build/skinr/skins'; return; } /** * Skinr settings export form. */ function skinr_ui_export_form(&$form_state, $theme = NULL) { $form = array(); $themes = list_themes(); if ($theme) { // Export an individual theme. $theme = str_replace('-', '_', $theme); $skinrs = skinr_get($theme); // Convert classes to arrays. foreach ($skinrs as $module => $data) { foreach ($data as $sid => $skinr) { $skinrs[$module][$sid] = (array) $skinrs[$module][$sid]; } } $code = '$skinrs = '. var_export($skinrs, TRUE) .';'; $lines = substr_count($code, "\n") + 1; $form['theme'] = array( '#type' => 'textfield', '#title' => t('Theme'), '#value' => $themes[$theme]->info['name'], '#disabled' => TRUE, ); $form['skinr_settings'] = array( '#type' => 'textarea', '#title' => t('Skinr settings'), '#default_value' => $code, '#rows' => min($lines, 150), ); } else { // Give the option for which theme to export. $options = array(); ksort($themes); $current_theme = skinr_current_theme(TRUE); // Put default theme at the top. $options[$current_theme] = $themes[$current_theme]->info['name'].' ['. t('default') .']'; foreach ($themes as $theme) { if ($theme->name == $current_theme) { // Do nothing. } elseif ($theme->status) { $options[$theme->name] = $theme->info['name'] .' ['. t('enabled') .']'; } else { $options[$theme->name] = $theme->info['name']; } } $form['theme'] = array( '#type' => 'select', '#title' => t('Theme'), '#description' => t('Theme to export the skinr settings for.'), '#options' => $options, '#required' => TRUE, ); $form['submit'] = array( '#type' => 'submit', '#value' => t('Export'), ); } return $form; } /** * Validation handler for skinr settings export form. */ function skinr_ui_export_form_validate(&$form, &$form_state) { if (!empty($form_state['values']['theme']) && preg_match('/[^a-zA-Z0-9_]/', $form_state['values']['theme'])) { form_error($form['theme'], t('The theme name must be alphanumeric and can contain underscores only.')); } } /** * Submit handler for skinr settings export form. */ function skinr_ui_export_form_submit(&$form, &$form_state) { drupal_goto('admin/build/skinr/export/'. str_replace('_', '-', $form_state['values']['theme'])); } /** * Skinr settings import form. */ function skinr_ui_import_form(&$form_state) { $form = array(); $options = array(); $themes = list_themes(); ksort($themes); $current_theme = skinr_current_theme(TRUE); // Put default theme at the top. $options[$current_theme] = $themes[$current_theme]->info['name'].' ['. t('default') .']'; foreach ($themes as $theme) { if ($theme->name == $current_theme) { // Do nothing. } elseif ($theme->status) { $options[$theme->name] = $theme->info['name'] .' ['. t('enabled') .']'; } else { $options[$theme->name] = $theme->info['name']; } } $form['theme'] = array( '#type' => 'select', '#title' => t('Theme'), '#options' => $options, '#required' => TRUE, ); $form['skinr_settings'] = array( '#type' => 'textarea', '#title' => t('Skinr settings'), '#description' => t('Paste skinr settings here.'), '#rows' => 16, ); $form['submit'] = array( '#type' => 'submit', '#value' => t('Import'), ); return $form; } /** * Validation handler for Skinr settings import form. */ function skinr_ui_import_form_validate(&$form, &$form_state) { if (empty($form_state['values']['skinr_settings'])) { // Error. form_error($form['skinr_settings'], t('These are not valid Skinr settings.')); return; } $skinrs = ''; ob_start(); eval($form_state['values']['skinr_settings']); ob_end_clean(); foreach ($skinrs as $module => $ignored) { if (!is_array($skinrs[$module])) { // Error. form_error($form['skinr_settings'], t('These are not valid Skinr settings.')); } foreach ($skinrs[$module] as $sid => $ignored) { if (!is_array($skinrs[$module][$sid])) { // Error. form_error($form['skinr_settings'], t('These are not valid Skinr settings.')); } // Cast skinr array to object so we can actually use it. $skinrs[$module][$sid] = (object) $skinrs[$module][$sid]; if (!skinr_validate($skinrs[$module][$sid])) { // Error. form_error($form['skinr_settings'], t('These are not valid Skinr settings.')); } } } if (!empty($form_state['values']['theme']) && preg_match('/[^a-zA-Z0-9_]/', $form_state['values']['theme'])) { form_error($form['theme'], t('The theme name must be alphanumeric and can contain underscores only.')); } $form_state['skinrs'] = &$skinrs; } /** * Submit handler for skinr settings import form. */ function skinr_ui_import_form_submit(&$form, &$form_state) { foreach ($form_state['skinrs'] as $module => $skinrs) { foreach ($skinrs as $sid => $skinr) { if (!skinr_set($skinr)) { drupal_set_message(t('Skinr settings for the theme %theme could not be saved!', array('%theme' => $form_state['values']['theme'])), 'error'); } } } drupal_set_message(t('Skinr settings for the theme %theme have been saved.', array('%theme' => $form_state['values']['theme']))); drupal_goto('admin/build/skinr'); } /** * Menu callback; displays the delete confirmation for a skinr page rule. */ function skinr_ui_delete_confirm(&$form_state, $theme, $module, $sid) { $form['theme'] = array( '#type' => 'value', '#value' => isset($form_state['theme']) ? $form_state['theme'] : $theme, ); $form['module'] = array( '#type' => 'value', '#value' => isset($form_state['module']) ? $form_state['module'] : $module, ); $form['sid'] = array( '#type' => 'value', '#value' => isset($form_state['sid']) ? $form_state['sid'] : $sid, ); $themes = list_themes(); return confirm_form($form, t('Are you sure you want to delete these Skinr settings?'), isset($_GET['destination']) ? $_GET['destination'] : 'admin/build/skinr', t('This action cannot be undone.
Theme: !theme
Module: !module
Skinr ID: !sid', array('!theme' => $themes[$theme]->info['name'], '!module' => $module, '!sid' => $sid)), t('Delete'), t('Cancel') ); } function skinr_ui_delete_confirm_submit($form, &$form_state) { if ($form_state['values']['confirm']) { $skinr = new stdClass(); $skinr->theme = $form_state['values']['theme']; $skinr->module = $form_state['values']['module']; $skinr->sid = $form_state['values']['sid']; $skinr->skins = array(); $skinr->settings = array(); skinr_set($skinr); } $form_state['redirect'] = 'admin/build/skinr'; } /** * Theme function for Skinr UI's list form. * * @param $form * An associative array containing the structure of the form. * @ingroup themeable */ function theme_skinr_ui_admin_skins($form) { $output = ''; $has_skins = isset($form['rows']['#value']) && is_array($form['rows']['#value']); $select_header = $has_skins ? theme('table_select_header_cell') : ''; $headers = array( $select_header, array('data' => t('Theme'), 'field' => 'theme'), array('data' => t('Type'), 'field' => 'type'), array('data' => t('Skinr ID'), 'field' => 'sid'), t('Operations'), ); $output .= drupal_render($form['options']); if ($has_skins) { $ts = tablesort_init($headers); $sort = SORT_DESC; if ($ts['sort'] == 'asc') { $sort = SORT_ASC; } switch ($ts['sql']) { case 'type': $sortby = 2; break; case 'sid': $sortby = 3; break; case 'theme': default: $sortby = 1; break; } $rows = array(); $sorts = array(); foreach ($form['rows']['#value'] as $key => $value) { $row = array(); $row[] = drupal_render($form['skinr_settings'][$key]); $row[] = $value['theme']; $row[] = $value['type']; $row[] = $value['sid']; $row[] = $value['operations']; $rows[$key] = $row; $sorts[] = strip_tags($rows[$key][$sortby]); } // Sort table. array_multisort($sorts, $sort, $rows); } else { $rows[] = array(array('data' => t('No skinr settings available.'), 'colspan' => '5')); } // Output table. $output .= theme('table', $headers, $rows); $output .= drupal_render($form); return $output; } /** * Theme function for Skinr UI's skinsets form. * * @param $form * An associative array containing the structure of the form. * @ingroup themeable */ function theme_skinr_ui_skinsets_form($form) { // Individual table headers. $header = array(t('Screenshot'), t('Name'), t('Version'), t('Enabled'), t('Operations')); // Pull package information from skinsets list and start grouping skinsets. $skinsets = $form['skinsets']['#value']; $packages = array(); foreach ($skinsets as $skinset) { if (!isset($skinset->info['package']) || !$skinset->info['package']) { $skinset->info['package'] = t('Other'); } $packages[$skinset->info['package']][$skinset->name] = $skinset->info; } ksort($packages); // Display packages. $output = ''; foreach ($packages as $package => $skinsets) { $rows = array(); foreach ($skinsets as $key => $skinset) { // Only look for skinsets. if (!isset($form[$key]['info'])) { continue; } // Fetch info. $info = $form[$key]['info']['#value']; // Localize skinset description. $description = t($info['description']); // Make sure it is compatible and render the checkbox if so. if (isset($form['status']['#incompatible_skinsets_core'][$key])) { unset($form['status'][$key]); $status = theme('image', 'misc/watchdog-error.png', t('incompatible'), t('Incompatible with this version of Drupal core')); $description .= '
'. t('This version is incompatible with the !core_version version of Drupal core.', array('!core_version' => VERSION)) .'
'; } elseif (isset($form['status']['#incompatible_skinsets_php'][$key])) { unset($form['status'][$key]); $status = theme('image', 'misc/watchdog-error.png', t('incompatible'), t('Incompatible with this version of PHP')); $php_required = $form['status']['#incompatible_themes_php'][$key]; if (substr_count($php_required, '.') < 2) { $php_required .= '.*'; } $description .= '
'. t('This skinset requires PHP version @php_required and is incompatible with PHP version !php_version.', array('@php_required' => $php_required, '!php_version' => phpversion())) .'
'; } else { $status = drupal_render($form['status'][$key]); } // Style theme info $content = '

'. $info['name'] .'

'. $description .'
'; // Build rows $row = array(); $row[] = drupal_render($form[$key]['screenshot']); $row[] = $content; $row[] = isset($info['version']) ? $info['version'] : ''; $row[] = array('data' => $status, 'align' => 'center'); $row[] = array('data' => drupal_render($form[$key]['operations']), 'align' => 'center'); $rows[] = $row; } $fieldset = array( '#title' => t($package), '#collapsible' => TRUE, '#collapsed' => FALSE, '#value' => theme('table', $header, $rows, array('class' => 'package')), ); $output .= theme('fieldset', $fieldset); } $output .= drupal_render($form); return $output; } /** * Theme function for Skinr UI's skinsets form. * * @param $form * An associative array containing the structure of the form. * @ingroup themeable */ function theme_skinr_ui_skinsets_settings_form($form) { // Individual table headers. $header = array(t('Enabled'), t('Name'), t('Operations')); // Display skins. $output = ''; // Get current theme, but make sure it's not the admin theme when we're editing with AJAX. $current_theme = skinr_current_theme(TRUE); $themes = list_themes(); ksort($themes); foreach ($themes as $theme) { if (!$theme->status) { continue; } $rows = array(); foreach ($form as $key => $skin) { // Only look for skins. if (!is_array($form[$key]) || !isset($form[$key]['info'])) { continue; } // Fetch info. $info = $form[$key]['info']['#value']; // Localize skinset title and description. $title = t($info['title']); $description = t($info['description']); // The hooks this skin is working with. $features = array(); foreach ($info['features'] as $feature) { $features[] = $feature == '*' ? t('all hooks') : $feature; } $features = t('Used by: !features', array('!features' => implode(', ', $features))); $status = drupal_render($form[$key]['status'][$theme->name]); // Style theme info $content = '

'. $title .'

'. $description .'
'. $features .'
'; // Build rows $row = array(); $row[] = array('data' => $status, 'align' => 'center'); $row[] = $content; $row[] = array('data' => drupal_render($form[$key]['operations']), 'align' => 'center'); $rows[] = $row; } $fieldset = array( '#title' => t($theme->info['name']), '#collapsible' => TRUE, '#collapsed' => $theme->name == $current_theme ? FALSE : TRUE, '#value' => theme('table', $header, $rows, array('class' => 'theme')), ); $output .= theme('fieldset', $fieldset); } $output .= drupal_render($form); return $output; } function skinr_ui_settings_multiple_delete_confirm(&$form_state, $skinr_settings) { $themes = list_themes(); $form['skinr_settings'] = array( '#prefix' => '', '#tree' => TRUE, ); // array_filter returns only elements with TRUE values foreach ($skinr_settings as $skinr_setting => $value) { $parts = explode('__', $skinr_setting, 3); $form['skinr_settings'][$skinr_setting] = array( '#type' => 'hidden', '#value' => $skinr_setting, '#prefix' => '
  • ', '#suffix' => t('Skinr ID %sid of type %type for theme %theme', array('%sid' => $parts[2], '%type' => $parts[1], '%theme' => $themes[$parts[0]]->info['name'])) ."
  • \n", ); } $form['operation'] = array('#type' => 'hidden', '#value' => 'delete'); $form['#submit'][] = 'skinr_ui_settings_multiple_delete_confirm_submit'; return confirm_form($form, t('Are you sure you want to delete these items?'), 'admin/build/skinr', t('This action cannot be undone.'), t('Delete all'), t('Cancel')); } function skinr_ui_settings_multiple_delete_confirm_submit($form, &$form_state) { if ($form_state['values']['confirm']) { foreach ($form_state['values']['skinr_settings'] as $skinr_setting => $value) { $parts = explode('__', $skinr_setting, 3); $skinr = new StdClass(); $skinr->theme = $parts[0]; $skinr->module = $parts[1]; $skinr->sid = $parts[2]; $skinr->skins = array(); skinr_set($skinr); } drupal_set_message(t('The items have been deleted.')); } $form_state['redirect'] = 'admin/build/skinr'; return; }