domain_alias.admin.inc in Domain Access 6.2
Same filename and directory in other branches
Administration functions for the domain_alias module.
File
domain_alias/domain_alias.admin.incView source
<?php
/**
* @file
* Administration functions for the domain_alias module.
*
* @ingroup domain_alias
*/
/**
* Edit aliases
*
* @param $domain
* The $domain object created by domain_lookup().
*/
function domain_alias($domain) {
if (!is_array($domain)) {
return t('Invalid page requested.');
}
return drupal_get_form('domain_alias_form', $domain);
}
/**
* FAPI for editing domain aliases
*
* @param $form_state
* The current form state, passed by FormsAPI.
* @param $domain
* An array containing the record from the {domain} table.
* @param $arguments
* An array of additional hidden key/value pairs to pass to the form.
* Used by child modules to control behaviors.
*/
function domain_alias_form($form_state, $domain, $arguments = array()) {
$form = array();
drupal_set_title(t('Edit domain aliases: %domain', array(
'%domain' => $domain['subdomain'],
)));
$form['domain_id'] = array(
'#type' => 'value',
'#value' => $domain['domain_id'],
);
$record_edit_url = 'admin/build/domain/' . ($domain['domain_id'] == 0 ? '' : 'edit/' . $domain['domain_id']);
$form['domain_help'] = array(
'#type' => 'markup',
'#value' => domain_alias_help_text(),
);
$form['domain'] = array(
'#type' => 'markup',
'#value' => t('Registered aliases for <a href="!url"%title</a>', array(
'!url' => url($record_edit_url),
'%title' => $domain['subdomain'],
)),
);
$form['domain_alias'] = array(
'#tree' => TRUE,
);
// List all existing aliases
if (isset($domain['aliases']) && is_array($domain['aliases'])) {
foreach ($domain['aliases'] as $alias_id => $alias) {
$form['domain_alias'][$alias_id] = array(
'#tree' => TRUE,
);
$form['domain_alias'][$alias_id]['alias_id'] = array(
'#type' => 'value',
'#value' => $alias_id,
);
$form['domain_alias'][$alias_id]['redirect'] = array(
'#type' => 'checkbox',
'#default_value' => $alias['redirect'],
);
$form['domain_alias'][$alias_id]['pattern'] = array(
'#type' => 'textfield',
'#default_value' => $alias['pattern'],
'#maxlength' => 255,
'#width' => 40,
);
$form['domain_alias'][$alias_id]['delete'] = array(
'#type' => 'checkbox',
'#default_value' => FALSE,
);
}
}
$form['domain_new'] = array(
'#type' => 'markup',
'#value' => t('Add new aliases'),
);
$form['domain_new_help'] = array(
'#type' => 'markup',
'#value' => t('To create a new alias, enter the matching pattern. Check the <em>redirect</em> box if you would like requests made to the alias to redirect to the registered domain.
<em>You may enter up to five (5) aliases at a time.</em>'),
);
$form['domain_alias_new'] = array(
'#tree' => TRUE,
);
for ($i = 0; $i < 5; $i++) {
$form['domain_alias_new'][$i]['redirect'] = array(
'#type' => 'checkbox',
'#default_value' => FALSE,
);
$form['domain_alias_new'][$i]['pattern'] = array(
'#type' => 'textfield',
'#default_value' => NULL,
'#maxlength' => 255,
'#width' => 40,
);
}
$form['submit'] = array(
'#type' => 'submit',
'#value' => t('Save aliases'),
);
return $form;
}
/**
* FAPI for domain_alias_form()
*/
function domain_alias_form_validate($form, &$form_state) {
// Validate aliases
$aliases = array();
// Validate updates -- this array might not have data.
if (isset($form_state['values']['domain_alias'])) {
foreach ($form_state['values']['domain_alias'] as $count => $alias) {
$validate = TRUE;
// Delete requests and unchanged aliases do not need the validation step.
$original_alias = domain_alias_lookup(NULL, $count);
if ($original_alias['pattern'] == $alias['pattern']) {
// In this case, no change and no error set, unless no changes made.
$validate = FALSE;
}
if ($original_alias['redirect'] != $alias['redirect']) {
// In this case, we updated the redirect settings only.
$validate = FALSE;
$aliases[] = 'update placeholder';
}
if ($form_state['values']['domain_alias'][$count]['delete']) {
// Set a value so we do not return an error on empty array.
$aliases[] = 'delete placeholder';
$validate = FALSE;
}
if ($validate) {
// Run the validation routine.
$aliases[] = _domain_alias_validate($form, $alias, $count, $aliases, 'domain_alias');
}
}
}
// Validate new domain aliases -- this array should always have data.
foreach ($form_state['values']['domain_alias_new'] as $count => $alias) {
if (empty($alias['pattern'])) {
continue;
}
$aliases[] = _domain_alias_validate($form, $alias, $count, $aliases, 'domain_alias_new');
}
if (empty($aliases)) {
form_error($form['domain'], t('No changes were made.'));
}
}
/**
* Helper function to validate alias entries.
*
* @param $alias
* The form element defining the alias.
* @param $id
* The form array id, either a number or an alias_id.
* @param $aliases
* The array of currently processed alias strings.
* @param $type
* The type of alias, used to determine form errors.
* @return
* A valid alias string, or an error.
*/
function _domain_alias_validate($form, $alias, $id, $aliases, $type) {
$alias = $alias['pattern'];
// 1) Check that the same alias is not entered twice.
if (in_array($alias, $aliases)) {
form_error($form[$type][$id]['pattern'], t('%name is already defined. You must use unique values.', array(
'%name' => $alias,
)));
return;
}
// 2) Check that the alias only has one wildcard.
$count = substr_count($alias, '*') + substr_count($alias, '?');
if ($count > 1) {
form_error($form[$type][$id]['pattern'], t('You may only have one wildcard character in each alias.'));
return;
}
// 3) Only one colon allowed, and it must be followed by numbers only.
$count = substr_count($alias, ':');
if ($count > 1) {
form_error($form[$type][$id]['pattern'], t('You may only have one colon ":" character in each alias.'));
return;
}
else {
if ($count == 1) {
$int = substr($alias, strpos($alias, ':') + 1);
if (!is_numeric($int)) {
form_error($form[$type][$id]['pattern'], t('A colon may only be followed by an integer indicating the proper port.'));
return;
}
}
}
// 4) Check that the alias doesn't contain any invalid characters.
$check = preg_match('/^[a-z0-9\\.\\+\\-\\*\\?:]*$/', $alias);
if ($check == 0) {
form_error($form[$type][$id]['pattern'], t('%name contains invalid characters.', array(
'%name' => $alias,
)));
}
// 5) Check that the alias is not a direct match for a registered domain.
$check = preg_match('/[a-z0-9\\.\\+\\-:]*$/', $alias);
if ($check == 1) {
$count = db_result(db_query("SELECT 1 FROM {domain} WHERE subdomain = '%s'", $alias));
if ($count > 0) {
form_error($form[$type][$id]['pattern'], t('%name matches an existing domain record. ', array(
'%name' => $alias,
)));
}
}
// 6) Check that the alias doesn't match another alias defined for this domain.
$replace = array(
'.' => '\\.',
'+' => '\\+',
'-' => '\\-',
'*' => '[a-z0-9\\.\\+\\-]*',
'?' => '[a-z0-9\\.\\+\\-]?',
);
$_pattern = str_replace(array_keys($replace), $replace, $alias);
foreach ($aliases as $_alias) {
$_alias_pattern = str_replace(array_keys($replace), $replace, $_alias);
if (preg_match('@' . $_pattern . '@i', $_alias) || preg_match('@' . $_alias_pattern . '@i', $alias)) {
form_error($form[$type][$id]['pattern'], t('%name matches %existing. You must use unique values.', array(
'%name' => $alias,
'%existing' => $_alias,
)));
break;
}
}
// 7) Check that the alias or a pattern matching the same domain name does not exist.
$_pattern = _domain_alias_placeholders_to_sql($alias);
if (isset($form_state['values']['domain_id']) && $_pattern != $form_state['values']['domain_id']) {
$_alias = db_fetch_array(db_query("SELECT alias_id, domain_id, pattern FROM {domain_alias} WHERE pattern = '%s' OR pattern = '%s'", $_pattern, $form_state['values']['domain_id']));
}
else {
$_alias = db_fetch_array(db_query("SELECT alias_id, domain_id, pattern FROM {domain_alias} WHERE pattern = '%s'", $_pattern));
}
if (!empty($_alias)) {
form_error($form[$type][$id]['pattern'], t('%name matches <a href="!url" title="Edit aliases for domain !id">alias #!aid</a> (%existing). You must use unique values. ', array(
'%name' => $alias,
'%existing' => _domain_alias_placeholders_from_sql($_alias['pattern']),
'!url' => url('admin/build/domain/alias/' . $_alias['domain_id']),
'!id' => $_alias['domain_id'],
'!aid' => $_alias['alias_id'],
)));
}
return $alias;
}
/**
* Forms_API for domain_alias_form().
*/
function domain_alias_form_submit($form, &$form_state) {
// The new alias fields are always present.
foreach ($form_state['values']['domain_alias_new'] as $id => $alias) {
if (!empty($alias['pattern'])) {
$alias['pattern'] = _domain_alias_placeholders_to_sql($alias['pattern']);
db_query("INSERT INTO {domain_alias} (domain_id, pattern, redirect) VALUES ('%d', '%s', '%d')", $form_state['values']['domain_id'], $alias['pattern'], intval($alias['redirect']));
}
}
if (isset($form_state['values']['domain_alias'])) {
foreach ($form_state['values']['domain_alias'] as $id => $alias) {
$alias['pattern'] = _domain_alias_placeholders_to_sql($alias['pattern']);
if ($alias['delete']) {
db_query("DELETE FROM {domain_alias} WHERE alias_id = %d", $id);
}
else {
db_query("UPDATE {domain_alias} SET pattern = '%s', redirect = '%d' WHERE alias_id = %d", $alias['pattern'], intval($alias['redirect']), $id);
}
}
}
drupal_set_message(t('Domain aliases updated successfully.'));
// Clear the cache.
cache_clear_all();
}
/**
* Form theming.
*/
function theme_domain_alias_form($form) {
$output = '';
$redirect = t('Check the redirect box to send requests for an alias to the registered domain.');
$output .= drupal_render($form['domain_help']);
$output .= '<br /><h3>' . drupal_render($form['domain']) . '</h3>';
// Edit existing records.
$elements = element_children($form['domain_alias']);
if (!empty($elements)) {
$header = array(
t('Id'),
t('Redirect'),
t('Pattern'),
t('Delete'),
);
$rows = array();
foreach ($elements as $element) {
$rows[] = array(
$form['domain_alias'][$element]['alias_id']['#value'],
drupal_render($form['domain_alias'][$element]['redirect']),
drupal_render($form['domain_alias'][$element]['pattern']),
drupal_render($form['domain_alias'][$element]['delete']),
);
}
$output .= theme('table', $header, $rows);
$output .= '<p><em>' . $redirect . '</em></p>';
}
else {
$output .= '<p>' . t('There are no aliases recorded for this domain.') . '</p>';
}
// Add new records.
$output .= '<br /><h3>' . drupal_render($form['domain_new']) . '</h3>';
$output .= '<p>' . drupal_render($form['domain_new_help']) . '</p>';
$header = array(
t('Redirect'),
t('Pattern'),
);
$rows = array();
foreach (element_children($form['domain_alias_new']) as $element) {
$rows[] = array(
drupal_render($form['domain_alias_new'][$element]['redirect']),
drupal_render($form['domain_alias_new'][$element]['pattern']),
);
}
$output .= theme('table', $header, $rows);
$output .= '<p><em>' . $redirect . '</em></p>';
$output .= drupal_render($form);
return $output;
}
/**
* Help text for the form.
*/
function domain_alias_help_text() {
$output = t('<p>A domain alias is used to register multiple valid domain names to a single record within Domain Access.
You may enter as many unique aliases per domain as you wish. </p>
<p>You may specify a pattern for your domains by using <strong>*</strong> (asterisk) to match any number of random
characters and <strong>?</strong> (question mark) to match exactly one random character.
For example: <em>*.example.com</em> would match any HTTP request made to a subdomain of <em>example.com</em>
to the domain record for <em>example.com</em>. NOTE: <em>Only one wildcard is allowed per alias.</em></p>');
return $output;
}
Functions
Name | Description |
---|---|
domain_alias | Edit aliases |
domain_alias_form | FAPI for editing domain aliases |
domain_alias_form_submit | Forms_API for domain_alias_form(). |
domain_alias_form_validate | FAPI for domain_alias_form() |
domain_alias_help_text | Help text for the form. |
theme_domain_alias_form | Form theming. |
_domain_alias_validate | Helper function to validate alias entries. |