'client', "name" => 'Client', "module" => 'hosting_client', "has_title" => TRUE, "title_label" => 'Client', "description" => hosting_node_help("client"), "has_body" => 0, "body_label" => '', "min_word_count" => 0); return $types; } /** * Hook definining hosting related features * * Used to simplify the interface. */ function hosting_client_hosting_feature() { $features['client'] = array( 'title' => t('Clients'), 'description' => t('Track and manage ownership of hosted sites.'), 'status' => HOSTING_FEATURE_DISABLED, 'node' => 'client', 'group' => 'experimental', ); return $features; } function hosting_client_theme($existing, $type, $theme, $path) { return array( 'hosting_client_user_form' => array( 'file' => 'hosting_client.access.inc', 'arguments' => array('form' => NULL), ), 'hosting_client_form' => array( 'file' => 'hosting_client.module', 'arguments' => array('form' => NULL), ), ); } function hosting_client_perm() { return array('create client','view client', 'edit own client', 'delete own client', 'administer clients', 'edit client users'); } function hosting_client_access($op, $node, $account) { if (!hosting_feature('client')) { // multiple client support has been disabled for this site. return FALSE; } if (user_access('administer clients', $account)) { return TRUE; } else { switch ($op) { case 'create': return user_access('create client', $account); break; case 'view': return user_access('view client', $account) && db_fetch_array(db_query("SELECT user FROM {hosting_client_user} WHERE user=%d and client=%d", $user->uid, $node->nid)); case 'update': if (user_access('edit own client', $account) && $account->uid == $node->uid) { return TRUE; } break; case 'delete': if ((user_access('delete own client', $account) && $account->uid == $node ->uid)) { return TRUE; } break; default: break; } } } function hosting_get_client($client) { if (is_numeric($client)) { $result = db_result(db_query("SELECT n.nid FROM {hosting_client} h INNER JOIN {node} n ON n.nid = h.nid WHERE n.nid = %d", $client)); } else { $result = db_result(db_query("SELECT c.nid FROM {hosting_client} c JOIN {node} n ON c.nid = n.nid WHERE (n.title = '%s' OR c.email = '%s') AND n.type = 'client'", $client, $client)); } if ($result) { return node_load($result); } return false; } function hosting_get_client_by_email($email) { $result = db_result(db_query("SELECT c.nid FROM {hosting_client} c INNER JOIN {node} n ON n.nid = c.nid WHERE c.email = '%s'", $email)); if ($result) { return node_load($result); } return false; } /** * Implementation of hook_form(). */ function hosting_client_form(&$node) { $type = node_get_types('type', $node); $form['title'] = array('#type' => 'hidden', '#value' => $node->title); $form['email'] = array( '#type' => 'textfield', '#title' => t('Email address'), '#required' => TRUE, '#size' => 40, '#default_value' => $node->email, '#maxlength' => 100, ); if (!$node->nid) { $form['email_confirm'] = array( '#type' => 'textfield', '#title' => t('Confirm Email address'), '#required' => TRUE, '#size' => 40, '#maxlength' => 100, ); } $form['client_name'] = array( '#type' => 'textfield', '#title' => t('Client name'), '#size' => 40, '#default_value' => $node->client_name, '#maxlength' => 50, ); $form['organization'] = array( '#type' => 'textfield', '#title' => t('Organization'), '#size' => 40, '#default_value' => $node->organization, '#maxlength' => 100, ); if ($node->nid) { // this should probably be factored out in a common function $q = db_query("SELECT u.uid, u.name FROM {hosting_client_user} h INNER JOIN {users} u ON u.uid = h.user WHERE h.client = %d", $node->nid); while ($result = db_fetch_array($q)) { $form['user_edit']['name'][$result['uid']] = array('#type' => 'markup', '#value' => l($result['name'], 'user/' . $result['uid'])); $users[$result['uid']] = ''; } if (user_access('edit client users')) { $form['user_edit']['users'] = array('#type' => 'checkboxes', '#options' => $users); } $form['user_edit']['header'] = array('#type' => 'value', '#value' => array(array('data' => t('Allowed users')), array('data' => t('Remove')))); if (user_access('edit client users')) { $form['user_edit']['new_user'] = array( '#type' => 'textfield', '#title' => t('Add new user'), '#weigth' => 2, '#autocomplete_path' => 'user/autocomplete', ); } $form['user_edit']['#theme'] = 'hosting_client_form'; } else { global $user; $form['new_user'] = array( '#type' => 'value', '#value' => $user->name, ); } return $form; } function theme_hosting_client_form($form) { foreach (element_children($form['name']) as $user) { $row = array(); $row['data'][] = drupal_render($form['name'][$user]); if (user_access('edit client users')) { $row['data'][] = drupal_render($form['users'][$user]); } $rows[] = $row; } $output = theme('table', $form['header']['#value'], $rows); $output .= drupal_render($form); return $output; } /** * Implementation of hook_validate() */ function hosting_client_validate(&$node) { $nid = db_result(db_query("SELECT nid FROM {hosting_client} WHERE email='%s'", $node->email)); if ($nid) { if ($node->nid != $nid) { form_set_error('email', t("Email address already exists.")); } } if (!$node->nid) { if ($node->email != $node->email_confirm) { form_set_error('email_confirm', t("Email addresses do not match")); } } if (!valid_email_address($node->email)) { form_set_error('email', t("Email address invalid.")); } } function hosting_client_set_title(&$node) { if ($node->organization && $node->name) { $node->title = $node->client_name . ' ('.$node->organization.')'; } elseif ($node->name) { $node->title = $node->client_name . ' ('.$node->email.')'; } elseif ($node->organization) { $node->title = $node->organization . ' ('.$node->email.')'; } else { $node->title = $node->email; } $node->title = filter_xss($node->title); db_query("UPDATE {node} SET title='%s' WHERE nid=%d", $node->title, $node->nid); db_query("UPDATE {node_revisions} SET title='%s' WHERE vid=%d", $node->title, $node->vid); } /** * Implementation of hook_insert(). */ function hosting_client_insert($node) { db_query("INSERT INTO {hosting_client} (vid, nid, name, organization, email) VALUES (%d, %d, '%s', '%s', '%s' )", $node->vid, $node->nid, $node->client_name, $node->organization, $node->email); hosting_client_set_title($node); if (variable_get('hosting_client_register_user', FALSE) && !user_load(array('mail' => $node->email))) { hosting_client_register_user($node); } if ($node->new_user) { $user = user_load(array('name' => $node->new_user)); db_query('INSERT INTO {hosting_client_user} (client, user, contact_type) VALUES (%d, %d, "%s")', $node->nid, $user->uid, ''); } } function _hosting_client_get_role() { return db_result(db_query("SELECT rid FROM {role} WHERE name='aegir client'")); } function hosting_client_register_user($node) { //register a new user account for the client $pass = user_password(); $user = new stdClass(); $edit['name'] = $node->email; $edit['hosting_client'] = $node->nid; $edit['mail'] = $node->email; $edit['pass'] = $pass; $edit['status'] = 1; $edit['roles'][_hosting_client_get_role()] = TRUE; $user = user_save($user, $edit); if ($user->uid && variable_get('hosting_client_send_welcome', FALSE)) { if ($node->client_name) { $to = sprintf("%s <%s>", $node->client_name, $node->email); } else { $to = $node->email; } $variables = array( '!username' => $user->name, '!site' => variable_get('site_name', 'Drupal'), '!password' => $pass, '!uri' => $GLOBALS['base_url'], '!uri_brief' => substr($base_url, strlen('http://')), '!date' => format_date(time()), '!login_uri' => url('user', array('absolute' => TRUE)), '!edit_uri' => url('user/'. $account->uid .'/edit', array('absolute' => TRUE)), '!login_url' => user_pass_reset_url($user)); // No e-mail verification is required, create new user account, and login user immediately. $subject = _hosting_client_mail_text('welcome_subject', $variables); $body = _hosting_client_mail_text('welcome_body', $variables); // drupal_mail('hosting-client-register-welcome', $to, $subject, $body); /* TODO Create a hook_mail($key, &$message, $params) function to generate the message body when called by drupal_mail. */ $account = array(); // Set this as needed $language = user_preferred_language($account); $object = array(); // Replace this as needed $context['subject'] = $subject; $context['body'] = $body; $params = array('account' => $account, 'object' => $object, 'context' => $context); drupal_mail('hosting_client', 'hosting-client-register-welcome', $to, $language, $params); } } /** * Implementation of hook_update(). * * As an existing node is being updated in the database, we need to do our own * database updates. */ function hosting_client_update($node) { // if this is a new node or we're adding a new revision, if ($node->revision) { hosting_client_insert($node); } else { db_query("UPDATE {hosting_client} SET nid=%d, name = '%s', organization = '%s', email='%s' WHERE vid=%d", $node->nid, $node->client_name, $node->organization, $node->email, $node->vid); } hosting_client_set_title($node); if ($node->users) { foreach ($node->users as $user) { db_query('DELETE FROM {hosting_client_user} WHERE user = %d AND client = %d', $user, $node->nid); } } if ($node->new_user) { $user = user_load(array('name' => $node->new_user)); db_query('INSERT INTO {hosting_client_user} (client, user, contact_type) VALUES (%d, %d, "%s")', $node->nid, $user->uid, ''); } } function hosting_nodeapi_client_delete_revision(&$node) { db_query('DELETE FROM {hosting_client} WHERE vid = %d', $node->vid); } /** * Implementation of hook_delete(). */ function hosting_client_delete($node) { db_query('DELETE FROM {hosting_client} WHERE nid = %d', $node->nid); } /** * Implementation of hook_load(). */ function hosting_client_load($node) { $additions = db_fetch_object(db_query('SELECT name as client_name, organization, email FROM {hosting_client} WHERE vid = %d', $node->vid)); return $additions; } /** * Implementation of hook_view(). */ function hosting_client_view($node, $teaser = FALSE, $page = FALSE) { $node->content['info']['#prefix'] = '