domain_theme.admin.inc in Domain Access 6.2
Same filename and directory in other branches
Include file to handle theme configration screen
File
domain_theme/domain_theme.admin.incView source
<?php
/**
* @file
* Include file to handle theme configration screen
*
* @ingroup domain_theme
*/
/**
* The domain theme page callback router.
*
* @param $domain
* The $domain object created by domain_lookup().
*/
function domain_theme_page($domain) {
global $custom_theme;
if (isset($domain['domain_id'])) {
// Set the custom theme, for display.
$custom_theme = variable_get('theme_default', 'garland');
$theme = domain_theme_lookup($domain['domain_id']);
// The above returns -1 on failure.
if ($theme != -1) {
$custom_theme = $theme['theme'];
drupal_set_message(t('You are viewing the active theme for %domain.', array(
'%domain' => $domain['sitename'],
)));
}
// Load the system form file.
include_once drupal_get_path('module', 'system') . '/system.admin.inc';
drupal_set_title(t('@site : Domain theme settings', array(
'@site' => $domain['sitename'],
)));
$output = theme_domain_theme_reset($domain);
return $output . drupal_get_form('system_themes_form');
}
else {
return t('Invalid domain request.');
}
}
/**
* Implement hook_form_alter().
*
* Since we have this in an include file, it is only called
* by our module's invocation of this form.
*/
function domain_theme_form_system_themes_form_alter(&$form, &$form_state) {
$domain_id = arg(4);
$domain = domain_load($domain_id);
if ($domain == -1) {
return drupal_access_denied();
}
// Get the current $theme for this domain, if available.
$theme = domain_theme_lookup($domain['domain_id']);
if ($theme['theme']) {
$form['theme_default']['#default_value'] = $theme['theme'];
}
else {
$form['theme_default']['#default_value'] = '';
if (empty($_POST)) {
drupal_set_message(t('No theme has been set for this domain.'));
}
}
// Unset options that are not allowed.
$available = $form['status']['#options'];
$allowed = $form['status']['#default_value'];
foreach ($available as $key => $value) {
if (!in_array($key, $allowed)) {
// If the theme was disabled, then we have to set a new default
if ($key == $theme['theme']) {
$form['theme_default']['#default_value'] = '';
if (empty($_POST)) {
drupal_set_message(t('The chosen theme is no longer available for this domain.'), 'status', FALSE);
}
}
unset($form[$key]);
unset($form['status']['#options'][$key]);
unset($form['theme_default']['#options'][$key]);
}
else {
$form['status']['#disabled'] = TRUE;
}
if (isset($form[$key]) && isset($form[$key]['operations'])) {
$form[$key]['operations'] = array(
'#value' => l(t('configure'), 'admin/build/domain/theme/' . $key . '/' . $domain['domain_id'] . '/theme-settings'),
);
}
}
// Use our own submit buttons.
$unset = array(
'buttons',
'#submit',
);
foreach ($unset as $key) {
unset($form[$key]);
}
// Message to users.
$form['intro'] = array(
'#value' => t('<p>Select the default theme for this domain.</p>'),
);
// Which domain are we editing?
$form['domain_id'] = array(
'#type' => 'value',
'#value' => $domain['domain_id'],
);
// Our submit handlers.
$form['#submit'][] = 'domain_theme_submit';
$form['submit'] = array(
'#type' => 'submit',
'#value' => t('Set domain theme'),
);
}
/**
* Implement hook_form_alter().
*
* This function is a helper to a normal hook_form_alter implementation,
* where we add additonal form elemtns if we are dealing with domain-specific
* form settings.
*/
function domain_theme_form_alter(&$form, &$form_state, $form_id) {
// We cannot use a named form_alter here because of color module.
// Color submit must happen first, and a named function destroys that.
if ($form_id != 'system_theme_settings') {
return;
}
$theme = arg(4);
$domain_id = arg(5);
$themes = list_themes();
$domain = domain_load($domain_id);
if ($domain == -1 || !array_key_exists($theme, $themes)) {
return drupal_access_denied();
}
drupal_set_title(t('@site : %theme settings', array(
'@site' => $domain['sitename'],
'%theme' => $theme,
)));
// Which domain are we editing?
$form['domain_id'] = array(
'#type' => 'value',
'#value' => $domain['domain_id'],
);
$form['theme'] = array(
'#type' => 'value',
'#value' => $theme,
);
// We have to remove the core submit handler, but keep other handlers.
$form['#submit'][100] = 'domain_theme_settings_submit';
foreach ($form['#submit'] as $key => $value) {
if ($value == 'system_theme_settings_submit') {
unset($form['#submit'][$key]);
}
}
ksort($form['#submit']);
// Check for the presence of color.module.
$color_info = NULL;
if (module_exists('color') && ($color_info = color_get_info($theme))) {
// This just sets the proper $color_info variable.
}
else {
return;
}
// Color module will reset the values in {variable}. which we don't
// want to happen. So we have to grab the existing values and store
// them so that we can set the {variable} table correctly.
// TODO: Make this work with Domain Prefix.
$vars = array(
'palette',
'stylesheets',
'logo',
'files',
'screenshot',
);
foreach ($vars as $variable) {
$name = 'color_' . $theme . '_' . $variable;
$value = db_result(db_query("SELECT value FROM {variable} WHERE name = '%s'", $name));
$color_settings[$name] = isset($value) ? $value : NULL;
}
$form['domain_color_defaults'] = array(
'#type' => 'value',
'#value' => $color_settings,
);
}
/**
* FormsAPI submit handler for the theme settings
*/
function domain_theme_submit($form, &$form_state) {
$theme = $form_state['values']['theme_default'];
$domain_id = $form_state['values']['domain_id'];
$settings = NULL;
// This is a placeholder for advanced functions.
db_query("UPDATE {domain_theme} SET status = 0 WHERE domain_id = %d", $domain_id);
$check = domain_theme_lookup($domain_id, $theme);
if ($check == -1) {
db_query("INSERT INTO {domain_theme} (domain_id, theme, settings, status) VALUES (%d, '%s', %b, 1)", $domain_id, $theme, $settings);
}
else {
db_query("UPDATE {domain_theme} SET status = 1 WHERE domain_id = %d AND theme = '%s'", $domain_id, $theme);
}
// Return to the correct page.
$form_state['redirect'] = 'admin/build/domain/theme/' . $domain_id;
// Clear the cache.
cache_clear_all();
}
/**
* Resets theme settings by removing the domain row from {domain_theme}.
*
* @param $domain
* The $domain object created by domain_lookup().
* @return
* A confirmation form.
*/
function domain_theme_reset($domain) {
if ($domain == -1) {
return t('An invalid request has been made.');
}
return drupal_get_form('domain_theme_reset_form', $domain);
}
/**
* FormsAPI for resetting a domain themes.
*
* @param $domain
* The $domain object for the selected domain.
* @return
* Themed HTML form.
*/
function domain_theme_reset_form($form_state, $domain) {
$extra['domain_id'] = array(
'#type' => 'value',
'#value' => $domain['domain_id'],
);
$form = confirm_form($extra, t('Are you sure you wish to reset the theme for %name?', array(
'%name' => $domain['sitename'],
)), 'admin/build/domain/theme/' . $domain['domain_id'], t('Submitting this form will restore default theme for this domain.'));
return $form;
}
/**
* FormsAPI for domain_theme_reset_form.
*/
function domain_theme_reset_form_submit($form, &$form_state) {
db_query("DELETE FROM {domain_theme} WHERE domain_id = %d", $form_state['values']['domain_id']);
drupal_set_message(t('Domain theme settings have been reset.'));
$form_state['redirect'] = 'admin/build/domain/theme/' . $form_state['values']['domain_id'];
// Clear the cache.
cache_clear_all();
}
/**
* Theme a message at the top of domain theme pages.
*
* @param $domain
* The $domain object for the selected domain.
* @return
* Themed HTML messages.
*/
function theme_domain_theme_reset($domain) {
$output = '';
$output .= '<p>' . t('These settings will replace your default site theme when %name is the active domain.', array(
'%name' => $domain['sitename'],
)) . '</p>';
$data = db_fetch_array(db_query("SELECT theme FROM {domain_theme} WHERE domain_id = %d", $domain['domain_id']));
if (!empty($data)) {
$output .= '<p>' . t('You may <a href="!url">erase these settings</a> to restore the default behavior.', array(
'!url' => url('admin/build/domain/theme-reset/' . $domain['domain_id']),
)) . '</p>';
}
return $output;
}
/**
* The domain theme page callback router.
*
* @param $theme
* The theme being configured.
* @param $domain
* The $domain object created by domain_lookup().
*/
function domain_theme_settings($theme, $domain) {
// Load the system form file.
include_once drupal_get_path('module', 'system') . '/system.admin.inc';
$settings = db_fetch_array(db_query("SELECT theme, settings FROM {domain_theme} WHERE domain_id = %d AND theme = '%s'", $domain['domain_id'], $theme));
drupal_set_message(t('You are viewing the %theme settings for %domain.', array(
'%theme' => $theme,
'%domain' => $domain['sitename'],
)));
// Write uploads to the proper directory.
if ($domain['domain_id'] > 0) {
global $conf;
$conf['file_directory_path'] = file_directory_path() . '/domain-' . $domain['domain_id'];
}
// If there are settings, we have to load ours.
if (!empty($settings)) {
domain_theme_set_variables($settings);
return drupal_get_form('system_theme_settings', $settings['theme']);
}
else {
return drupal_get_form('system_theme_settings', $theme);
}
}
/**
* Process domain_theme_settings form submissions.
*/
function domain_theme_settings_submit($form, &$form_state) {
$values = $form_state['values'];
$filepath = NULL;
$reset = FALSE;
$form_state['redirect'] = 'admin/build/domain/theme/' . $values['domain_id'];
$domain = domain_lookup($values['domain_id']);
if ($values['op'] == $values['reset']) {
db_query("DELETE FROM {domain_theme} WHERE domain_id = %d AND theme = '%s'", $values['domain_id'], $values['theme']);
drupal_set_message(t('The %theme settings for %domain have been reset.', array(
'%theme' => $values['theme'],
'%domain' => $domain['sitename'],
)));
$reset = TRUE;
}
$vars = array(
'palette',
'stylesheets',
'logo',
'files',
'screenshot',
);
foreach ($vars as $variable) {
$preset = variable_get('color_' . $values['theme'] . '_' . $variable, '');
if (!empty($preset)) {
$values['color_' . $values['theme'] . '_' . $variable] = $preset;
}
}
// If our domain uses different schemes, we have to ensure that the {variable} table stays accurate
// for the primary domain.
if (isset($values['domain_color_defaults'])) {
foreach ($values['domain_color_defaults'] as $key => $value) {
if (!empty($value)) {
variable_set($key, domain_unserialize($value));
}
else {
variable_del($key);
}
}
}
// Set the filepath for color module.
if (!empty($values['color_' . $values['theme'] . '_stylesheets'][0])) {
$filepath = domain_theme_get_color_path($values['color_' . $values['theme'] . '_stylesheets'][0]);
}
// If a reset, stop here.
if ($reset) {
return;
}
$key = $values['var'];
$domain_id = $values['domain_id'];
$theme = $values['theme'];
// If no record exists, we behave differently.
$check = db_result(db_query("SELECT 1 FROM {domain_theme} WHERE domain_id = %d AND theme = '%s'", $domain_id, $theme));
if ($values['op'] == $values['reset'] && $check) {
db_query("UPDATE {domain_theme} SET settings = NULL, filepath = NULL WHERE domain_id = %d AND theme = '%s'", $domain_id, $theme);
drupal_set_message(t('The configuration options have been reset to their default values.'));
}
else {
// Exclude unnecessary elements before saving.
unset($values['var'], $values['submit'], $values['reset'], $values['form_id'], $values['op'], $values['form_build_id'], $values['form_token'], $values['domain_id'], $values['domain_color'], $values['domain_color_defaults']);
$settings = serialize($values);
if ($check > 0) {
db_query("UPDATE {domain_theme} SET settings = %b, filepath = '%s' WHERE domain_id = %d AND theme = '%s'", $settings, $filepath, $domain_id, $theme);
}
else {
db_query("INSERT INTO {domain_theme} (domain_id, theme, settings, status, filepath) VALUES (%d, '%s', %b, 0, '%s')", $domain_id, $theme, $settings, $filepath);
}
drupal_set_message(t('The configuration options have been saved.'));
}
// If nothing is active, then we make this one active.
$active = db_result(db_query("SELECT 1 FROM {domain_theme} WHERE domain_id = %d AND status = 1", $domain_id));
if (empty($active)) {
db_query("UPDATE {domain_theme} SET status = 1 WHERE domain_id = %d AND theme = '%s'", $domain_id, $theme);
drupal_set_message(t('%theme has been set as the default theme for %domain', array(
'%theme' => $theme,
'%domain' => $domain['sitename'],
)));
}
// Clear the cache.
cache_clear_all();
}
Functions
Name | Description |
---|---|
domain_theme_form_alter | Implement hook_form_alter(). |
domain_theme_form_system_themes_form_alter | Implement hook_form_alter(). |
domain_theme_page | The domain theme page callback router. |
domain_theme_reset | Resets theme settings by removing the domain row from {domain_theme}. |
domain_theme_reset_form | FormsAPI for resetting a domain themes. |
domain_theme_reset_form_submit | FormsAPI for domain_theme_reset_form. |
domain_theme_settings | The domain theme page callback router. |
domain_theme_settings_submit | Process domain_theme_settings form submissions. |
domain_theme_submit | FormsAPI submit handler for the theme settings |
theme_domain_theme_reset | Theme a message at the top of domain theme pages. |