From 0423bfa69a9f1e8224074e511edaa33f4554ee94 Mon Sep 17 00:00:00 2001
From: Ben Jeavons <benjamin.jeavons@colorado.edu>
Date: Sun, 27 Feb 2011 13:41:25 -0500
Subject: [PATCH] Issue #1050472 by coltrane start of Override skin status

---
 skinr.module       |   17 +++++++++++++++++
 skinr_ui.admin.inc |   45 ++++++++++++++++++++++++++++++---------------
 2 files changed, 47 insertions(+), 15 deletions(-)

diff --git a/skinr.module b/skinr.module
index 972d910..c1dc9ca 100644
--- a/skinr.module
+++ b/skinr.module
@@ -1050,6 +1050,23 @@ function skinr_get_skin_info() {
 }
 
 /**
+ * Retrieve all saved skins and their status.
+ *
+ * @return
+ *   An array of arrays indexed by skin name.
+ */
+function skinr_get_skin_statuses() {
+  $skins = array();
+  $result = db_query("SELECT name, status FROM {skinr_skinsets}");
+  foreach ($result as $record) {
+    $skins[$record->name] = array(
+      'status' => $record->status,
+    );
+  }
+  return $skins;
+}
+
+/**
  * Retrieves all skin groups registered by modules and themes.
  *
  * @return
diff --git a/skinr_ui.admin.inc b/skinr_ui.admin.inc
index d464f1f..536d713 100644
--- a/skinr_ui.admin.inc
+++ b/skinr_ui.admin.inc
@@ -431,10 +431,17 @@ function skinr_ui_admin_skin_infos($form, $form_state) {
   uasort($skins, 'skinr_ui_sort_by_title');
   $form['skins'] = array('#tree' => TRUE);
 
+  // Retrieve any saved skin status.
+  $skin_status = skinr_get_skin_statuses();
+
   // Iterate through each of the skins.
   foreach ($skins as $name => $skin) {
     $extra = array();
 
+    if (isset($skin_status[$name])) {
+      $extra['enabled'] = $skin_status[$name]['status'];
+    }
+
     // Generate link for skin's configuration page
     $extra['links']['configure'] = array(
       '#type' => 'link',
@@ -484,7 +491,6 @@ function skinr_ui_admin_skin_infos($form, $form_state) {
 function _skinr_ui_admin_skin_infos_build_row($skin, $extra) {
   // Add in the defaults.
   $extra += array(
-    'enabled' => FALSE,
     'disabled' => FALSE,
     'links' => array(),
   );
@@ -499,7 +505,6 @@ function _skinr_ui_admin_skin_infos_build_row($skin, $extra) {
     '#markup' => t($skin['description']),
   );
 
-
   // Grab source info.
   $info = system_get_info($skin['source']['type'], $skin['source']['name']);
 
@@ -524,10 +529,16 @@ function _skinr_ui_admin_skin_infos_build_row($skin, $extra) {
     '#markup' => implode('<br />', $theme_hooks),
   );
 
+  // Whether the skin is enabled depends on the default value and if it's been
+  // overridden. Default to disabled.
+  $enabled = FALSE;
+  if (isset($extra['enabled'])) {
+    $enabled = $extra['enabled'];
+  }
   $form['enable'] = array(
     '#type' => 'checkbox',
     '#title' => t('Enable'),
-    '#default_value' => $extra['enabled'],
+    '#default_value' => $enabled,
   );
   if ($extra['disabled']) {
     $form['enable']['#disabled'] = TRUE;
@@ -563,28 +574,32 @@ function skinr_ui_sort_by_title($a, $b) {
 function skinr_ui_admin_skin_infos_submit($form, &$form_state) {
   // Store list of previously enabled themes and disable all themes.
   $old_skin_infos = $new_skin_infos = array();
-  foreach (skinr_get_skin_info() as $skin_info) {
-    if ($skin_info->status) {
-      $old_skin_infos[] = $skin_info->name;
+  $skins = skinr_get_skin_info();
+  foreach ($skins as $skin_info) {
+    if ($skin_info['status']) {
+      $old_skin_infos[] = $skin_info['name'];
     }
   }
-  db_query("UPDATE {skinr_skinsets} SET status = 0");
+  db_query("DELETE FROM {skinr_skinsets}");
 
   // Set status for all
-  foreach ($form_state['values']['skinsets'] as $category) {
+  foreach ($form_state['values']['skins'] as $category) {
     foreach ($category as $name => $choice) {
-      if ($choice['enable']) {
-        $new_theme_list[] = $name;
-        db_update('skinr_skinsets')
-          ->fields(array('status' => 1))
-          ->condition('name', $name)
-          ->execute();
-      }
+      $new_theme_list[] = $name;
+      db_insert('skinr_skinsets')
+        ->fields(array(
+          'filename' => $name,
+          'name' => $name,
+          'status' => $choice['enable'],
+          'info' => '',
+        ))
+        ->execute();
     }
   }
 
   // Refresh skinsets from DB.
   drupal_static_reset('skinr_get_skin_info');
+  cache_clear_all('skinr_skin_info', 'cache');
 
   drupal_set_message(t('The configuration options have been saved.'));
 
-- 
1.7.2

