You are here

domain_theme.admin.inc in Domain Access 7.3

Include file to handle theme configuration screen

File

domain_theme/domain_theme.admin.inc
View source
<?php

/**
 * @file
 * Include file to handle theme configuration screen
 *
 * @ingroup domain_theme
 */

/**
 * The domain theme page callback router.
 *
 * @param $domain
 *   The $domain object created by domain_lookup().
 */
function domain_theme_page($domain) {
  if (isset($domain['domain_id'])) {

    // Check the current domain.
    if ($domain['domain_id'] == domain_default_id()) {
      drupal_set_message(t('This is your default domain. Use of this form is discouraged. Set these values through the standard interface.'), 'warning', FALSE);
    }

    // Load the system form file.
    include_once drupal_get_path('module', 'system') . '/system.admin.inc';

    // Set the page title and generate the form.
    drupal_set_title(t('Theme for @site', array(
      '@site' => $domain['subdomain'],
    )));
    return drupal_get_form('domain_theme_form', $domain);
  }
  else {
    $build['content'] = array(
      '#markup' => t('Invalid domain request.'),
    );
    return $build;
  }
}

/**
 * Form callback to set theme per domain.
 *
 * @param $domain
 *   The $domain object created by domain_lookup().
 *
 * @return
 *   An HTML form.
 */
function domain_theme_form($form, &$form_state, $domain) {
  $form = array();

  // Get the current $theme for this domain, if available.
  $theme = domain_theme_lookup($domain['domain_id']);
  if ($theme['theme']) {
    $default = $theme['theme'];
  }
  else {
    $default = variable_get('theme_default', 'bartik');
    drupal_set_message(t('No theme has been set for this domain. It will use the default theme settings.'), 'status', FALSE);
  }

  // Message to users.
  $form['intro'] = array(
    '#markup' => t('<p>Select the default theme for this domain. You may only select themes <a href="!url">activated for all sites</a>.</p>', array(
      '!url' => url('admin/appearance'),
    )) . theme_domain_theme_reset(array(
      'domain' => $domain,
    )),
  );

  // Which domain are we editing?
  $form['domain_id'] = array(
    '#type' => 'value',
    '#value' => $domain['domain_id'],
  );
  $themes = system_rebuild_theme_data();
  $form['theme'] = array(
    '#tree' => TRUE,
    '#description' => t('To enable additional themes, <a href="!url">configure them globally</a>', array(
      '!url' => url('admin/appearance'),
    )),
  );
  foreach ($themes as $key => $theme) {
    if ($theme->status) {
      $form['theme'][$key] = array(
        '#type' => 'radio',
        '#return_value' => $key,
        '#parents' => array(
          'theme',
        ),
        '#default_value' => $key == $default ? $key : FALSE,
      );
    }
  }
  $form['submit'] = array(
    '#type' => 'submit',
    '#value' => t('Set domain theme'),
  );
  return $form;
}

/**
 * Form submit handler.
 */
function domain_theme_form_submit($form, &$form_state) {

  // Update or Insert?
  $domain_id = $form_state['values']['domain_id'];
  $theme = $form_state['values']['theme'];

  // Set all themes in this domain to null status.
  db_update('domain_theme')
    ->fields(array(
    'status' => 0,
  ))
    ->condition('domain_id', $domain_id)
    ->execute();

  // Now activate the selected theme.
  // This lookup returns -1 on failure.
  $check = domain_theme_lookup($domain_id, $theme);

  // Update.
  if ($check != -1) {
    db_update('domain_theme')
      ->fields(array(
      'status' => 1,
    ))
      ->condition('domain_id', $domain_id)
      ->condition('theme', $theme)
      ->execute();
  }
  else {
    db_insert('domain_theme')
      ->fields(array(
      'domain_id' => $domain_id,
      'theme' => $theme,
      'settings' => '',
      'status' => 1,
      'filepath' => '',
    ))
      ->execute();
  }

  // Return to the correct page.
  $form_state['redirect'] = 'admin/structure/domain/view/' . $domain_id . '/theme';

  // Clear the cache.
  cache_clear_all();
}

/**
 * FormsAPI theming.
 */
function theme_domain_theme_form($variables) {
  $form = $variables['form'];
  $output = '';
  $output .= drupal_render($form['intro']);
  $themes = system_rebuild_theme_data();
  $header = array(
    t('Screenshot'),
    t('Theme'),
    t('Default'),
    t('Options'),
  );
  $rows = array();
  foreach (element_children($form['theme']) as $key) {
    $default = '';
    if ($form['theme'][$key]['#value'] == $key) {
      $default = t('(default theme)');
    }
    $screenshot = $themes[$key]->info['screenshot'];

    // With sub-theming, screenshot may be inherited from base theme
    if (!is_file($screenshot) && !empty($themes[$key]->info['base theme']) && isset($themes[$themes[$key]->info['base theme']])) {
      $screenshot = $themes[$themes[$key]->info['base theme']]->info['screenshot'];
    }

    // Add image attributes.
    $screenshot_options = array(
      'path' => $screenshot,
      'alt' => $themes[$key]->info['name'],
      'title' => $themes[$key]->info['name'],
      'attributes' => array(
        'class' => 'screenshot',
      ),
    );
    $row = array(
      theme('image', $screenshot_options),
      '<h3>' . $themes[$key]->info['name'] . ' ' . (isset($themes[$key]->info['version']) ? $themes[$key]->info['version'] : '') . ' ' . $default . '</h3>' . t($themes[$key]->info['description']),
      drupal_render($form['theme'][$key]),
      l(t('configure'), 'admin/structure/domain/view/' . $form['domain_id']['#value'] . '/theme/' . $key . '/theme-settings'),
    );
    $rows[] = array(
      'data' => $row,
      'class' => array(
        'theme-selector',
      ),
    );
  }
  $output .= theme('table', array(
    'header' => $header,
    'rows' => $rows,
  ));
  $output .= drupal_render_children($form);
  return $output;
}

/**
 * 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
 *   A themed HTML form.
 */
function domain_theme_reset_form($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/structure/domain/view/' . $domain['domain_id'] . '/theme', 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_delete('domain_theme')
    ->condition('domain_id', $form_state['values']['domain_id'])
    ->execute();
  drupal_set_message(t('Domain theme settings have been reset.'));
  $form_state['redirect'] = 'admin/structure/domain/view/' . $form_state['values']['domain_id'] . '/theme';

  // 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($variables) {
  $domain = $variables['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_query("SELECT theme FROM {domain_theme} WHERE domain_id = :domain_id", array(
    ':domain_id' => $domain['domain_id'],
  ))
    ->fetchAssoc();
  if (!empty($data)) {
    $output .= '<p>' . t('You may <a href="!url">erase these settings</a> to restore the default behavior.', array(
      '!url' => url('admin/structure/domain/view/' . $domain['domain_id'] . '/theme-reset'),
    )) . '</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($domain, $theme) {

  // Load the system form file.
  include_once drupal_get_path('module', 'system') . '/system.admin.inc';

  // Set the proper context for the user.
  $settings = db_query("SELECT theme, settings FROM {domain_theme} WHERE domain_id = :domain_id AND theme = :theme", array(
    ':domain_id' => $domain['domain_id'],
    ':theme' => $theme,
  ))
    ->fetchAssoc();
  drupal_set_message(t('You are viewing the %theme settings for %domain.', array(
    '%theme' => $theme,
    '%domain' => $domain['subdomain'],
  )), 'status', FALSE);
  drupal_set_title(t('@theme settings for @site', array(
    '@site' => $domain['subdomain'],
    '@theme' => $theme,
  )));

  // 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'];

  // Prepare a filepath for color module settings.
  $domain = domain_lookup($values['domain_id']);

  // We aren't using $filepath in Drupal 7; this can probably be removed.
  $filepath = file_default_scheme() . ':/' . '/domain-' . $domain['domain_id'];
  $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]);
  }

  // Deal with file uploads.
  domain_theme_file_upload($values);

  // Set the variables for saving.
  $key = $values['var'];
  $domain_id = $values['domain_id'];
  $theme = $values['theme'];

  // 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);

  // Insert or Update?
  // This lookup returns -1 on failure.
  $check = domain_theme_lookup($domain_id, $theme);

  // Update.
  if ($check != -1) {
    db_update('domain_theme')
      ->fields(array(
      'settings' => $settings,
      'filepath' => $filepath,
    ))
      ->condition('domain_id', $domain_id)
      ->condition('theme', $theme)
      ->execute();
  }
  else {
    db_insert('domain_theme')
      ->fields(array(
      'domain_id' => $domain_id,
      'theme' => $theme,
      'settings' => $settings,
      'status' => 0,
      'filepath' => $filepath,
    ))
      ->execute();
  }

  // If nothing is active, then we make this one active.
  $active = db_query("SELECT COUNT(domain_id) FROM {domain_theme} WHERE domain_id = :domain_id AND status = 1", array(
    ':domain_id' => $domain_id,
  ))
    ->fetchField();
  if (empty($active)) {
    db_update('domain_theme')
      ->fields(array(
      'status' => 1,
    ))
      ->condition('domain_id', $domain_id)
      ->condition('theme', $theme)
      ->execute();
    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();

  // Finish processing the form.
  drupal_set_message(t('The configuration options have been saved.'));
  $form_state['redirect'] = 'admin/structure/domain/view/' . $domain_id . '/theme';
}

/**
 * Custom submit handler.
 *
 * If the theme is saved as 'default', we have to be sure not to delete
 * existing color directories. This section is copied from color.module.
 *
 * @see color_form_submit()
 */
function domain_theme_color_submit($form, &$form_state) {
  $theme = $form_state['values']['theme'];
  $info = $form_state['values']['info'];

  // Resolve palette.
  $palette = $form_state['values']['palette'];
  if ($form_state['values']['scheme'] != '') {
    foreach ($palette as $key => $color) {
      if (isset($info['schemes'][$form_state['values']['scheme']]['colors'][$key])) {
        $palette[$key] = $info['schemes'][$form_state['values']['scheme']]['colors'][$key];
      }
    }
    $palette += $info['schemes']['default']['colors'];
  }
  if (implode(',', color_get_palette($theme, TRUE)) == implode(',', $palette)) {
    $form_state['values']['palette']['domain_default'] = 'xyz';
  }
}

/**
 * Helper function for handling logo uploads.
 *
 * @see system_theme_settings_submit()
 *
 * We have disabled the normal function because we do not
 * want our form results saved to the {variables} table.
 *
 * @param $values
 *   An array of form values, passed by reference.
 */
function domain_theme_file_upload(&$values) {

  // If the user uploaded a new logo or favicon, save it to a permanent location
  // and use it in place of the default theme-provided file.
  if ($file = $values['logo_upload']) {
    unset($values['logo_upload']);
    $filename = file_unmanaged_copy($file->uri);
    $values['default_logo'] = 0;
    $values['logo_path'] = $filename;
    $values['toggle_logo'] = 1;
  }
  if ($file = $values['favicon_upload']) {
    unset($values['favicon_upload']);
    $filename = file_unmanaged_copy($file->uri);
    $values['default_favicon'] = 0;
    $values['favicon_path'] = $filename;
    $values['toggle_favicon'] = 1;
  }

  // If the user entered a path relative to the system files directory for
  // a logo or favicon, store a public:// URI so the theme system can handle it.
  if (!empty($values['logo_path'])) {
    $values['logo_path'] = _system_theme_settings_validate_path($values['logo_path']);
  }
  if (!empty($values['favicon_path'])) {
    $values['favicon_path'] = _system_theme_settings_validate_path($values['favicon_path']);
  }
  if (empty($values['default_favicon']) && !empty($values['favicon_path'])) {
    $values['favicon_mimetype'] = file_get_mimetype($values['favicon_path']);
  }
}

Related topics

Functions

Namesort descending Description
domain_theme_color_submit Custom submit handler.
domain_theme_file_upload Helper function for handling logo uploads.
domain_theme_form Form callback to set theme per domain.
domain_theme_form_submit Form submit handler.
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.
theme_domain_theme_form FormsAPI theming.
theme_domain_theme_reset Theme a message at the top of domain theme pages.