'themes', 'title' => t('theme previewer'), 'callback' => 'themeswitcher_page', 'access' => user_access('access content')); } return $items; } function themeswitcher_init() { global $custom_theme; if ($_GET['theme']) { $custom_theme = $_SESSION['theme_session'] = $_GET['theme']; } elseif ($_POST['edit']['theme_session']) { $path = pathinfo($_POST['edit']['theme_session']); $custom_theme = str_replace(array('themes/'), '', $path['dirname']); } else { $custom_theme = $_SESSION['theme_session']; } } function themeswitcher_cron() { $statistics_timestamp = variable_get('statistics_day_timestamp', ''); //if ((time() - $statistics_timestamp) >= 86400) { if (1) { //debugging $theme_default= variable_get('theme_default', 'bluemarine'); $res = db_query('SELECT * FROM {blocks} WHERE theme LIKE \'%s\'', $theme_default); db_query('DELETE FROM {blocks}'); while ($block = db_fetch_object($res)) { $defaults[$block->module .'-'. $block->delta] = $block; } foreach (list_themes() as $key => $theme) { foreach ($defaults as $block) { db_query("INSERT INTO {blocks} ( module, delta, theme, status, weight, region, custom, throttle, visibility, pages ) VALUES ( '%s', '%s', '%s', %d, %d, '%s', %d, %d, %d, '%s')", $block->module, $block->delta, $key, $block->status, $block->weight, $block->region, $block->custom, $block->throttle, $block->visibility, $block->pages ); } } variable_set('statistics_day_timestamp', time()); } } function themeswitcher_block($op = 'list', $delta = 0) { switch ($op) { case 'list': $blocks[0]['info'] = t('Random theme'); $blocks[1]['info'] = t('Theme browser'); return $blocks; break; case 'view': if ($delta == 0) { $block['subject'] = t('Random theme'); $block['content'] = themeswitcher_display_random_block(); } elseif ($delta == 1) { $block['subject'] = t('Browse themes'); $block['content'] = themeswitcher_display_nextprev_block(); } return $block; break; case 'default': break; } } function themeswitcher_display_random_block() { $themes = list_themes(); shuffle($themes); foreach ($themes as $key => $theme) { $theme->screenshot = dirname($theme->filename) . '/screenshot.png'; if (file_exists($theme->screenshot)) { //return the first one with a screenie $output = l("screenshot\" alt=\"preview of $theme->name\"/>", $_GET['q'], NULL, 'theme='.$theme->name, NULL, FALSE, TRUE); return $output; } } } function themeswitcher_display_nextprev_block() { global $custom_theme, $user; $themes = list_themes(); if (count($themes) > 1) { ksort($themes); $i = 0; foreach ($themes as $key => $theme) { $themes[$key]->screenshot = dirname($theme->filename) . '/screenshot.png'; // I need both a numerical and an associative array $sort[$i] = $themes[$key]; $themes[$key]->order = $i; $i++; } $count = count($themes) - 1; // offest for starting at zero // assign the current theme as value of $custom_theme $current = themeswitcher_get_current($themes); // derive the next and previous from the order of $current $pos = $current->order; $next = $pos + 1; $prev = $pos - 1; if ($pos == $count) { $next = 0; $prev = $pos - 1; } elseif ($pos == 0) { $next = $pos + 1; $prev = $count; } $next_theme = $sort[$next]; $prev_theme = $sort[$prev]; // add the themes to the output if (file_exists($prev_theme->screenshot)) { $output = '

' . t('Previous theme') . '
'; $output .= l("screenshot\" alt=\"preview of $prev_theme->name\" />", $_GET['q'], NULL, 'theme='. $prev_theme->name, NULL, FALSE, TRUE); } $output .= '
' . l('‹ '. $prev_theme->name, $_GET['q'], NULL, 'theme='. $prev_theme->name) . '

'; $output .= '

' . t('Next theme') . '
'; if (file_exists($next_theme->screenshot)) { $output .= l("screenshot\" alt=\"preview of $next_theme->name\" />", $_GET['q'], NULL, 'theme='. $next_theme->name, NULL, FALSE, TRUE); } $output .= '
' . l($next_theme->name . ' ›', $_GET['q'], NULL, 'theme='. $next_theme->name) . '

'; } else { $output = t('You must enable more than one theme.'); } return $output; } /** * Creates a browsable page showing all themes **/ function themeswitcher_page() { $output = t('

Select a theme below to see how it looks for this site.

'); $themes = list_themes(); if (count($themes) > 1) { ksort($themes); $current = themeswitcher_get_current($themes); $i = 0; foreach ($themes as $key => $theme) { $theme->picture = dirname($theme->filename) . '/screenshot.png'; if (file_exists(dirname($theme->filename) . '/screenshot.png')) { $themes[$key]->screenshot = dirname($theme->filename) . '/screenshot.png'; } // easier to handle as a numerical array $sort[$i] = $themes[$key]; $i++; } // this might all be rethemed, but it works this way. $page = floor($_GET['page']) - 1; if ($page < 0) { $page = 0; } $max = 24; $cells = ''; $count = count($themes) - 1; // offset for the zero $current_theme = $current->name; $start = $page * $max; $end = ($page + 1) * $max - 1; $pages = floor($count / $max) + 1; for ($i = $start; $i <= $end; $i++) { $key = $i; $theme = $sort[$i]; $row_open = 0; if (!empty($theme)) { if ($key == $start) { $cells .= ''; } if (fmod($key, 3) == 0 || $key == 0) { $cells .= ''; $row_open = 1; } $cells .= ''; if (fmod($key+1, 3) == 0) { $cells .= ''; $row_open = 0; } if ($key == $end || $key == $count) { if ($row_open == 1) { $cells .= ''; } $cells .= '
' . theme('themeswitcher', $theme, $current_theme) . '
'; } } } $output .= $cells; // pagination links if ($pages > 1) { $output .= l(t('first'), $_GET['q'], NULL, 'page=1'. '&theme='. $current_theme). ' | '; for ($i = 1; $i <= $pages; $i++) { $output .= l($i, $_GET['q'], NULL, 'page='. $i . '&theme='. $current_theme); $output .= ' | '; } $output .= l(t('last'), $_GET['q'], NULL, 'page=' . $pages. '&theme='. $current_theme); } } else { $output = t('You must enable more than one theme.'); } print theme('page', $output); } /** * Theme function for the themes overview **/ function theme_themeswitcher($theme, $current_theme) { if ($theme->name == $current_theme) { $cells = '
'; } else { $cells = '
'; } $cells .= '

' . l($theme->name, $_GET['q'], NULL, 'page='.$_GET['page'] . '&theme='. $theme->name); $cells .= '

'; $cells .= l("screenshot\" alt=\"preview of $theme->name\" />", $_GET['q'], NULL, 'page='.$_GET['page'] .'&theme='. $theme->name, NULL, FALSE, TRUE); $cells .= '

'; if ($theme->name == $current_theme) { $cells .= '
'; } $cells .= '
'; return $cells; } /** * Retrieve the active theme **/ function themeswitcher_get_current($themes) { global $custom_theme, $user; if (!empty($custom_theme)) { $current = $themes[$custom_theme]; } else { // if no theme, use the user default if (empty($user->theme)) { $conf = $GLOBALS['conf']['theme_default']; } else { $conf = $user->theme; } $current = $themes[$conf]; } return $current; }