You are here

domain_conf.module in Domain Access 5

Domain manager configuration options.

For this module to work correctly, you will need to follow the INSTALL.txt instructions for editing your settings.php file.

File

domain_conf/domain_conf.module
View source
<?php

/**
 * @defgroup domain_conf Domain Conf: configuration extension
 * Functions for the Domain Conf module.
 */

/**
 * @file
 * Domain manager configuration options.
 *
 * For this module to work correctly, you will need to follow the INSTALL.txt
 * instructions for editing your settings.php file.
 *
 * @ingroup domain_conf
 */

/**
 * Implement hook_menu()
 */
function domain_conf_menu($may_cache) {
  $items = array();
  if (!$may_cache) {
    $items[] = array(
      'title' => t('Domain site settings'),
      'path' => 'admin/build/domain/conf',
      'access' => user_access('administer domains') && user_access('administer site congifuration'),
      'type' => MENU_CALLBACK,
      'callback' => 'domain_conf_page',
      'callback arguments' => array(
        arg(4),
      ),
    );
    $items[] = array(
      'title' => t('Domain site settings'),
      'path' => 'admin/build/domain/conf-reset',
      'access' => user_access('administer domains') && user_access('administer site congifuration'),
      'type' => MENU_CALLBACK,
      'callback' => 'domain_conf_reset',
      'callback arguments' => array(
        arg(4),
      ),
    );

    // Allow sites to add implementations of hook_domainconf() without hacking.
    // See http://drupal.org/node/236877.
    if (arg(0) == 'admin') {
      $extra = drupal_get_path('module', 'domain_conf') . '/domain_conf.inc';
      if (file_exists($extra)) {
        include_once $extra;
      }
    }
  }
  return $items;
}

/**
 * The domain conf page callback router.
 *
 * @param $domain_id
 *  The unique identifier for this domain, taken from {domain}.
 */
function domain_conf_page($domain_id) {
  global $_domain;
  $domain = domain_lookup($domain_id);
  $output = theme_domain_conf_reset($domain);
  if ($domain['domain_id'] > 0) {

    // Ensure we are on the proper domain.
    domain_goto($domain);
    drupal_set_title(t('@site : Domain site settings', array(
      '@site' => $domain['sitename'],
    )));
    return $output . drupal_get_form('system_site_information_settings');
  }
  else {
    if ($domain['domain_id'] == 0) {
      return $output . drupal_get_form('domain_conf_default', $domain);
    }
    else {
      return t('Invalid domain request.');
    }
  }
}

/**
 * Special configuration options for the main domain.
 *
 * @param $domain
 * The $domain object for the default domain.
 * @return
 * A $form array according to the FormsAPI, if unique configuration is possible.
 */
function domain_conf_default($domain) {
  drupal_set_title(t('@site : Domain site settings', array(
    '@site' => $domain['sitename'],
  )));
  $form = array();

  // Grab any extra elements defined by other modules.
  $extra = domain_conf_api();
  if (!empty($extra)) {

    // Convert the $extra array to the $form array.
    $form = $extra;
    $form['domain_conf_message'] = array(
      '#type' => 'markup',
      '#value' => t('<p>The following custom settings may be applied to the main domain.  These options are specific to the Domain module and do not have standard configuration pages.</p>'),
      '#weight' => -100,
    );

    // Domain information, for saving.
    $form['domain_id'] = array(
      '#type' => 'value',
      '#value' => $domain['domain_id'],
    );

    // Submit functions
    $form['#submit']['domain_conf_form_submit'] = array();
    $form['#validate']['domain_conf_form_validate'] = array();
    $form['submit'] = array(
      '#type' => 'submit',
      '#value' => t('Save domain settings'),
      '#weight' => 10,
    );
  }
  else {
    $form['domain_conf_message'] = array(
      '#type' => 'markup',
      '#value' => t('There are no custom domain settings to configure.'),
    );
  }
  return $form;
}

/**
 * Implement hook_domainlinks()
 */
function domain_conf_domainlinks($domain) {
  $links[] = array(
    'title' => t('settings'),
    'path' => 'admin/build/domain/conf/' . $domain['domain_id'],
  );
  return $links;
}

/**
 * Implement hook_form_alter()
 *
 * Since this function is only loaded at the path admin/build/domain/conf, we
 * don't have to worry about hook_form_alter() being called when not wanted.
 */
function domain_conf_form_alter($form_id, &$form) {

  // We use the system_site_information_settings form as a base, and add the elements we need
  // from other forms.  The default values are altered based on stored settings.
  if ($form_id == 'system_site_information_settings') {

    // Check to be certain that we are on the right form page.
    $module = arg(2);
    $action = arg(3);
    if ($module == 'domain' && $action == 'conf') {
      $domain_id = arg(4);
      $domain = domain_lookup($domain_id);
      $data = db_result(db_query("SELECT settings FROM {domain_conf} WHERE domain_id = %d", $domain['domain_id']));
      if (!empty($data)) {
        $settings = unserialize($data);
      }
      else {
        $settings = array();
      }
      $unset = array(
        'buttons',
        '#submit',
      );
      foreach ($unset as $key) {
        unset($form[$key]);
      }
      $form['main'] = array(
        '#type' => 'fieldset',
        '#title' => t('Domain information'),
        '#collapsible' => TRUE,
        '#weight' => -10,
      );

      // Put the defaults in the fieldset
      $fields = array(
        'site_name',
        'site_mail',
        'site_slogan',
        'site_mission',
        'site_footer',
        'site_frontpage',
        'anonymous',
      );
      foreach ($fields as $field) {
        $form['main'][$field] = $form[$field];
        unset($form[$field]);
      }

      // Change the path for the frontpage.
      $prefix = $form['main']['site_frontpage']['#field_prefix'];
      $_path = parse_url($prefix);
      $str = $_path['host'];
      $fix = preg_replace("/{$str}/", $domain['subdomain'], $prefix, 1);
      $form['main']['site_frontpage']['#field_prefix'] = $fix;

      // Admin theme settings
      $themes = list_themes();
      ksort($themes);
      $options[] = t('Use domain default theme');
      foreach ($themes as $key => $value) {
        $options[$key] = $key;
      }
      $form['main']['admin_theme'] = array(
        '#type' => 'select',
        '#title' => t('Administrative theme'),
        '#options' => $options,
        '#default_value' => variable_get('admin_theme', '0'),
      );

      // Date settings: set the default timezone
      $form['date'] = array(
        '#type' => 'fieldset',
        '#title' => t('Timezone settings'),
        '#collapsible' => TRUE,
        '#weight' => -5,
      );
      $zones = _system_zonelist();
      $form['date']['date_default_timezone'] = array(
        '#type' => 'select',
        '#title' => t('Default time zone'),
        '#default_value' => isset($settings['date_default_timezone']) ? $settings['date_default_timezone'] : variable_get('date_default_timezone', 0),
        '#options' => $zones,
        '#description' => t('Select the default site time zone.'),
      );

      // Offline notices.
      $form['offline'] = array(
        '#type' => 'fieldset',
        '#title' => t('Maintenance settings'),
        '#collapsible' => TRUE,
        '#weight' => 5,
      );
      $form['offline']['site_offline'] = array(
        '#type' => 'radios',
        '#title' => t('Site status'),
        '#default_value' => isset($settings['site_offline']) ? $settings['site_offline'] : variable_get('site_offline', 0),
        '#options' => array(
          t('Online'),
          t('Off-line'),
        ),
        '#description' => t('When set to "Online", all visitors will be able to browse your site normally. When set to "Off-line", only users with the "administer site configuration" permission will be able to access your site to perform maintenance; all other visitors will see the site off-line message configured below. Authorized users can log in during "Off-line" mode directly via the <a href="@user-login">user login</a> page.', array(
          '@user-login' => url('user'),
        )),
      );
      $form['offline']['site_offline_message'] = array(
        '#type' => 'textarea',
        '#title' => t('Site off-line message'),
        '#default_value' => isset($settings['site_offline_message']) ? $settings['site_offline_message'] : variable_get('site_offline_message', t('@site is currently under maintenance. We should be back shortly. Thank you for your patience.', array(
          '@site' => $domain['sitename'],
        ))),
        '#description' => t('Message to show visitors when the site is in off-line mode.'),
      );

      // Site name must be edited at the domain creation screen.
      $form['main']['site_name']['#disabled'] = TRUE;
      $form['main']['site_name']['#description'] = t('The name of this web site, as entered in the <a href="!url">domain-specific settings</a>.', array(
        '!url' => url('admin/build/domain/edit/' . $domain['domain_id']),
      ));

      // Reset the provided form defaults, if needed
      $form['main']['site_name']['#default_value'] = $domain['sitename'];
      $form['main']['site_mail']['#default_value'] = isset($settings['site_mail']) ? $settings['site_mail'] : variable_get('site_mail', ini_get('sendmail_from'));
      $form['main']['site_slogan']['#default_value'] = isset($settings['site_slogan']) ? $settings['site_slogan'] : variable_get('site_slogan', '');
      $form['main']['site_mission']['#default_value'] = isset($settings['site_mission']) ? $settings['site_mission'] : variable_get('site_mission', '');
      $form['main']['site_footer']['#default_value'] = isset($settings['site_footer']) ? $settings['site_footer'] : variable_get('site_footer', '');
      $form['main']['site_frontpage']['#default_value'] = isset($settings['site_frontpage']) ? $settings['site_frontpage'] : variable_get('site_frontpage', 'node');
      $form['main']['anonymous']['#default_value'] = isset($settings['anonymous']) ? $settings['anonymous'] : variable_get('anonymous', t('Guest'));

      // Domain information, for saving.
      $form['domain_id'] = array(
        '#type' => 'value',
        '#value' => $domain['domain_id'],
      );

      // Grab any extra elements defined by other modules.
      $extra = domain_conf_api(TRUE);

      // Merge the $extra and $form arrays.
      $form = array_merge($form, $extra);

      // Submit functions
      $form['#submit']['domain_conf_form_submit'] = array();
      $form['#validate']['domain_conf_form_validate'] = array();
      $form['submit'] = array(
        '#type' => 'submit',
        '#value' => t('Save domain settings'),
        '#weight' => 10,
      );
    }
  }
}

/**
 * FormsAPI
 */
function domain_conf_form_submit($form_id, $form_values) {

  // Throw away what we don't need.
  $settings = $form_values;
  $unset = array(
    'form_token',
    'form_id',
    'op',
    'submit',
  );
  foreach ($unset as $key) {
    unset($settings[$key]);
  }

  // INSERT or UPDATE?
  $check = db_fetch_array(db_query("SELECT domain_id FROM {domain_conf} WHERE domain_id = %d", $form_values['domain_id']));
  if (isset($check['domain_id'])) {
    $sql = "UPDATE {domain_conf} SET settings = %b WHERE domain_id = %d";
    db_query($sql, serialize($settings), $form_values['domain_id']);
  }
  else {
    $sql = "INSERT INTO {domain_conf} VALUES (%d, %b)";
    db_query($sql, $form_values['domain_id'], serialize($settings));
  }

  // Clear the cache.
  cache_clear_all();
  drupal_set_message(t('Domain options saved successfully.'));
}

/**
 * Implement hook_domainwarnings()
 */
function domain_conf_domainwarnings() {

  // These are the forms for variables set by Domain Conf.
  return array(
    'system_admin_theme_settings',
    'system_date_time_settings',
    'system_site_information_settings',
    'system_site_maintenance_settings',
  );
}

/**
 * Implement hook_domaininstall()
 */
function domain_conf_domaininstall() {

  // If Domain Conf is being used, check to see that it is installed correctly.
  if (module_exists('domain_conf') && !function_exists('_domain_conf_load')) {
    drupal_set_message(t('The Domain Configuration module is not installed correctly.  Please edit your settings.php file as described in <a href="!url">INSTALL.txt</a>', array(
      '!url' => base_path() . drupal_get_path('module', 'domain_conf') . '/INSTALL.txt',
    )));
  }
}

/**
 * Resets configuration settings by removing the domain row from {domain_conf}.
 *
 * @param $domain_id
 * The domain_id of the requested domain.
 * @return
 * A confirmation form.
 */
function domain_conf_reset($domain_id) {
  $domain = domain_lookup($domain_id);
  if ($domain == -1) {
    return t('An invalid request has been made.');
  }
  return drupal_get_form('domain_conf_reset_form', $domain);
}

/**
 * FormsAPI for resetting a domain configuration.
 *
 * @param $domain
 * The $domain object for the selected domain.
 * @return
 * Themed HTML form.
 */
function domain_conf_reset_form($domain) {
  $extra['domain_id'] = array(
    '#type' => 'value',
    '#value' => $domain['domain_id'],
  );
  $extra['#redirect'] = 'admin/build/domain/conf/' . $domain['domain_id'];
  $form = confirm_form($extra, t('Are you sure you wish to reset the settings for %name?', array(
    '%name' => $domain['sitename'],
  )), 'admin/build/domain/conf/' . $domain_id, t('Submitting this form will restore default settings for this domain.'));
  return $form;
}

/**
 * FormsAPI for domain_conf_reset_form.
 */
function domain_conf_reset_form_submit($form_id, $form_values) {
  db_query("DELETE FROM {domain_conf} WHERE domain_id = %d", $form_values['domain_id']);
  drupal_set_message(t('Domain configuration settings have been reset.'));
}

/**
 * Theme a message at the top of domain configuration pages.
 *
 * @param $domain
 * The $domain object for the selected domain.
 * @return
 * Themed HTML messages.
 */
function theme_domain_conf_reset($domain) {
  $output = '';
  $output .= '<p>' . t('These settings will replace or supplement your default site settings when %name is the active domain.', array(
    '%name' => $domain['sitename'],
  )) . '</p>';
  $data = db_fetch_array(db_query("SELECT settings FROM {domain_conf} 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/conf-reset/' . $domain['domain_id']),
    )) . '</p>';
  }
  return $output;
}

/**
 * Implement hook_domainbatch()
 */
function domain_conf_domainbatch() {
  $batch = array();

  // Allows the deletion of all Domain Configuration rows.
  $batch['domain_conf'] = array(
    '#form' => array(
      '#title' => t('Reset configurations'),
      '#type' => 'checkbox',
      '#options' => array(
        t('Reset'),
      ),
      '#description' => t('Delete custom settings for this domain.'),
    ),
    '#domain_action' => 'domain_delete',
    '#system_default' => 0,
    '#variable' => 'domain_conf',
    '#meta_description' => t('Delete custom settings for domains as supplied by Domain Configuration.'),
    '#table' => 'domain_conf',
    '#weight' => -2,
  );

  // Change the email address.
  $batch['site_mail'] = array(
    '#form' => array(
      '#title' => t('Email address'),
      '#type' => 'textfield',
      '#size' => 40,
      '#maxlength' => 255,
      '#description' => t('Set the email address for this domain.'),
    ),
    '#domain_action' => 'domain_conf',
    '#system_default' => variable_get('site_mail', ''),
    '#variable' => 'site_mail',
    '#meta_description' => t('Set the email address for all domains.'),
    '#data_type' => 'string',
    '#weight' => -8,
  );

  // Change the site slogan.
  $batch['site_slogan'] = array(
    '#form' => array(
      '#title' => t('Site slogan'),
      '#type' => 'textfield',
      '#size' => 60,
      '#maxlength' => 255,
      '#description' => t('The slogan of this domain. Some themes display a slogan when available.'),
    ),
    '#domain_action' => 'domain_conf',
    '#system_default' => variable_get('site_slogan', ''),
    '#variable' => 'site_slogan',
    '#meta_description' => t('Set the site slogan for all domains.'),
    '#data_type' => 'string',
    '#weight' => -8,
  );

  // Change the site slogan.
  $batch['site_mission'] = array(
    '#form' => array(
      '#title' => t('Site mission'),
      '#type' => 'textarea',
      '#cols' => 30,
      '#rows' => 5,
      '#description' => t('The mission statement or focus for this domain.'),
    ),
    '#domain_action' => 'domain_conf',
    '#system_default' => variable_get('site_mission', ''),
    '#variable' => 'site_mission',
    '#meta_description' => t('Set the site mission for all domains.'),
    '#data_type' => 'string',
    '#weight' => -8,
  );

  // Change the site footer.
  $batch['site_footer'] = array(
    '#form' => array(
      '#title' => t('Site footer'),
      '#type' => 'textarea',
      '#cols' => 30,
      '#rows' => 5,
      '#description' => t('This text will be displayed at the bottom of each page for this domain.'),
    ),
    '#domain_action' => 'domain_conf',
    '#system_default' => variable_get('site_footer', ''),
    '#variable' => 'site_footer',
    '#meta_description' => t('Set the site footer for all domains.'),
    '#data_type' => 'string',
    '#weight' => -8,
  );

  // Change the site frontpage.
  $batch['site_frontpage'] = array(
    '#form' => array(
      '#title' => t('Site frontpage'),
      '#type' => 'textfield',
      '#size' => 30,
      '#maxlength' => 255,
      '#description' => t('The home page displays content from this relative URL. If unsure, specify "node".'),
    ),
    '#domain_action' => 'domain_conf',
    '#system_default' => variable_get('site_frontpage', 'node'),
    '#variable' => 'site_frontpage',
    '#meta_description' => t('Set the site frontpage for all domains.'),
    '#data_type' => 'string',
    '#weight' => -8,
  );

  // Change the anonymous user name.
  $batch['anonymous'] = array(
    '#form' => array(
      '#title' => t('Anonymous user'),
      '#type' => 'textfield',
      '#size' => 30,
      '#maxlength' => 255,
      '#description' => t('The name used to indicate anonymous users for this domain.'),
    ),
    '#domain_action' => 'domain_conf',
    '#system_default' => variable_get('anonymous', 'Anonymous'),
    '#variable' => 'anonymous',
    '#meta_description' => t('Set the anonymous user label for all domains.'),
    '#data_type' => 'string',
    '#weight' => -8,
  );

  // Change the administrative theme.
  $themes = list_themes();
  ksort($themes);
  $options[] = t('Use domain default theme');
  foreach ($themes as $key => $value) {
    $options[$key] = $key;
  }
  $batch['admin_theme'] = array(
    '#form' => array(
      '#title' => t('Administrative theme'),
      '#type' => 'select',
      '#options' => $options,
      '#description' => t('Select the administrative theme for this domain.'),
    ),
    '#domain_action' => 'domain_conf',
    '#system_default' => variable_get('admin_theme', 0),
    '#variable' => 'admin_theme',
    '#meta_description' => t('Set the administrative theme for all domains.'),
    '#data_type' => 'string',
    '#weight' => -8,
  );

  // Change the timezone.
  $zones = _system_zonelist();
  $batch['date_default_timezone'] = array(
    '#form' => array(
      '#title' => t('Timezone default'),
      '#type' => 'select',
      '#options' => $zones,
      '#description' => t('Select the default site time zone.'),
    ),
    '#domain_action' => 'domain_conf',
    '#system_default' => variable_get('date_default_timezone', 0),
    '#variable' => 'date_default_timezone',
    '#meta_description' => t('Set the default timezone for all domains.'),
    '#data_type' => 'string',
    '#weight' => -8,
  );

  // Toggle the site offline status.
  $batch['site_offline'] = array(
    '#form' => array(
      '#title' => t('Site status'),
      '#type' => 'radios',
      '#options' => array(
        t('Online'),
        t('Off-line'),
      ),
      '#description' => t('Toggle online/offline status.'),
    ),
    '#domain_action' => 'domain_conf',
    '#system_default' => variable_get('site_offline', 0),
    '#variable' => 'site_offline',
    '#meta_description' => t('Set the online / offline status for all domains.'),
    '#data_type' => 'integer',
    '#weight' => -8,
  );

  // Change the site offline message.
  $batch['site_offline_message'] = array(
    '#form' => array(
      '#title' => t('Site offline message'),
      '#type' => 'textarea',
      '#cols' => 30,
      '#rows' => 5,
      '#description' => t('Message to show visitors when this domain is in off-line mode.'),
    ),
    '#domain_action' => 'domain_conf',
    '#system_default' => variable_get('site_offline_message', ''),
    '#variable' => 'site_offline_message',
    '#meta_description' => t('Set the site offline message for all domains.'),
    '#data_type' => 'string',
    '#weight' => -8,
  );
  foreach ($batch as $item => $values) {
    $batch[$item]['#permission'] = 'administer site configuration';
  }
  return $batch;
}

/**
 * Retrieves elements from hook_domainconf() and formats them
 * as needed.
 *
 * @param $all
 * Should the function return all hook implementations or just those marked
 * with the domain_settings flag.  Defaults to FALSE.  Used to determine if
 * we are loading configuration options specific to the Domain Access module.
 *
 * @return
 * An array of form elements according to the FormsAPI or an empty array.
 */
function domain_conf_api($all = FALSE) {
  $options = array();
  $extra = module_invoke_all('domainconf');
  if (!empty($extra)) {
    foreach ($extra as $key => $value) {
      if ($value['#domain_setting'] == TRUE || $all == TRUE) {

        // Discard the #domain_setting flag; it is not needed.
        unset($value['#domain_setting']);

        // Set the $options array.
        $options[$key] = $value;
      }
    }
  }
  return $options;
}

/**
* Implement hook_domainupdate().
*/
function domain_conf_domainupdate($op, $domain, $edit = array()) {
  if ($op == 'delete') {
    db_query("DELETE FROM {domain_conf} WHERE domain_id = %d", $domain['domain_id']);
    cache_clear_all('variables', 'cache');
  }
}

Related topics

Functions

Namesort descending Description
domain_conf_api Retrieves elements from hook_domainconf() and formats them as needed.
domain_conf_default Special configuration options for the main domain.
domain_conf_domainbatch Implement hook_domainbatch()
domain_conf_domaininstall Implement hook_domaininstall()
domain_conf_domainlinks Implement hook_domainlinks()
domain_conf_domainupdate Implement hook_domainupdate().
domain_conf_domainwarnings Implement hook_domainwarnings()
domain_conf_form_alter Implement hook_form_alter()
domain_conf_form_submit FormsAPI
domain_conf_menu Implement hook_menu()
domain_conf_page The domain conf page callback router.
domain_conf_reset Resets configuration settings by removing the domain row from {domain_conf}.
domain_conf_reset_form FormsAPI for resetting a domain configuration.
domain_conf_reset_form_submit FormsAPI for domain_conf_reset_form.
theme_domain_conf_reset Theme a message at the top of domain configuration pages.