pierre@0: . pierre@0: */ pierre@0: pierre@0: /** pierre@0: * Implementation of hook_theme(). pierre@0: */ pierre@0: function ad_owners_theme() { pierre@0: return array( pierre@0: 'ad_owner_permissions_form' => array( pierre@0: 'arguments' => array( pierre@0: 'form' => NULL, pierre@0: ), pierre@0: ), pierre@0: ); pierre@0: }; pierre@0: pierre@0: /** pierre@0: * Implementation of hook_menu(). pierre@0: */ pierre@0: function ad_owners_menu() { pierre@0: $items = array(); pierre@0: pierre@0: $items['node/%node/adowners'] = array( pierre@0: 'title' => 'Ad owners', pierre@0: 'page callback' => 'ad_owners_overview', pierre@0: 'page arguments' => array(1), pierre@0: 'access callback' => 'ad_owners_access', pierre@0: 'access arguments' => array(1), pierre@0: 'type' => MENU_LOCAL_TASK, pierre@0: 'weight' => 5, pierre@0: ); pierre@0: $items['node/%node/adowners/list'] = array( pierre@0: 'title' => 'List', pierre@0: 'access callback' => 'ad_adaccess', pierre@0: 'access arguments' => array(1, 'manage owners'), pierre@0: 'type' => MENU_DEFAULT_LOCAL_TASK, pierre@0: 'weight' => 0, pierre@0: ); pierre@0: $items['node/%node/adowners/%user/permissions'] = array( pierre@0: 'title callback' => 'owner_permissions_title', pierre@0: 'title arguments' => array('!owner' => 3), pierre@0: 'page callback' => 'drupal_get_form', pierre@0: 'page arguments' => array('ad_owner_permissions_form', 1, 3), pierre@0: 'access callback' => 'ad_adaccess', pierre@0: 'access arguments' => array(1, 'manage owners'), pierre@0: 'type' => MENU_LOCAL_TASK, pierre@0: 'weight' => 2, pierre@0: ); pierre@0: $items['node/%node/adowners/%user/remove'] = array( pierre@0: 'title' => 'Remove owner', pierre@0: 'page callback' => 'drupal_get_form', pierre@0: 'page arguments' => array('ad_owner_remove_form', 1, 3), pierre@0: 'access callback' => 'ad_adaccess', pierre@0: 'access arguments' => array(1, 'manage owners'), pierre@0: 'type' => MENU_CALLBACK, pierre@0: 'weight' => 6, pierre@0: ); pierre@0: $items['node/%node/adowners/add'] = array( pierre@0: 'title' => 'Add owner', pierre@0: 'page callback' => 'drupal_get_form', pierre@0: 'page arguments' => array('ad_owners_add_form', 1), pierre@0: 'access callback' => 'ad_adaccess', pierre@0: 'access arguments' => array(1, 'manage owners'), pierre@0: 'type' => MENU_LOCAL_TASK, pierre@0: 'weight' => 4, pierre@0: ); pierre@0: pierre@0: return $items; pierre@0: } pierre@0: pierre@0: /** pierre@0: * Menu item access callback. pierre@0: */ pierre@0: function ad_owners_access($node) { pierre@0: return ($node->type == 'ad') && ad_adaccess($node, 'manage owners'); pierre@0: } pierre@0: pierre@0: /** pierre@0: * Menu item title callback - use the user name pierre@0: */ pierre@0: function owner_permissions_title($account) { pierre@0: return t('!owner\'s permissions', array('!owner' => $account->name)); pierre@0: } pierre@0: pierre@0: /** pierre@0: * Implementation of hook_form_alter(). pierre@0: */ pierre@0: function ad_owners_form_alter(&$form, &$form_state, $form_id) { pierre@0: if ($form_id == 'ad_'. arg(4) .'_global_settings' || $form_id == 'ad_no_global_settings') { pierre@0: if (!isset($form['adtype'])) { pierre@0: $form['adtype'] = array('#type' => 'value', '#value' => arg(4)); pierre@0: } pierre@0: $permissions = module_invoke_all('adapi', 'permissions', NULL); pierre@0: $form['permissions'] = array( pierre@0: '#type' => 'fieldset', pierre@0: '#title' => t('Permissions'), pierre@0: '#collapsible' => TRUE, pierre@0: '#description' => t('Select which permissions will be automatically granted to new owners of !type advertisements.', array('!type' => ad_get_types('name', arg(4)))), pierre@0: ); pierre@0: $form['permissions']['default_permissions'] = array( pierre@0: '#type' => 'checkboxes', pierre@0: '#title' => t('Default permissions for !type owners', array('!type' => ad_get_types('name', arg(4)))), pierre@0: '#options' => drupal_map_assoc($permissions), pierre@0: '#default_value' => variable_get('ad_'. arg(4) .'_default_permissions', array('access statistics', 'access click history', 'manage status')), pierre@0: ); pierre@0: if (isset($form['save'])) { pierre@0: $form['save']['#weight'] = 10; pierre@0: } pierre@0: if (isset($form['#submit']) && is_array($form['#submit'])) { pierre@0: $form['#submit'] = array('ad_global_settings_submit') + $form['#submit']; pierre@0: } pierre@0: else { pierre@0: $form['#submit'] = array('ad_global_settings_submit'); pierre@0: } pierre@0: } pierre@0: } pierre@0: pierre@0: /** pierre@0: * Implementation of hook_nodeapi(). pierre@0: */ pierre@0: function ad_owners_nodeapi(&$node, $op, $teaser, $page) { pierre@0: global $user; pierre@0: pierre@0: switch ($op) { pierre@0: case 'insert': pierre@0: case 'update': pierre@0: if (isset($node->adtype)) { pierre@0: // Be sure ad owner has at least default ad permissions. pierre@0: ad_owners_add($node, $node->uid); pierre@0: ad_host_id_create($node->uid); pierre@0: } pierre@0: break; pierre@0: case 'delete': pierre@0: // Clean up ad_permissions and any other per-ad tables. pierre@0: $result = db_query('SELECT oid, uid FROM {ad_owners} WHERE aid = %d', $node->nid); pierre@0: while ($id = db_fetch_object($result)) { pierre@0: db_query('DELETE FROM {ad_permissions} WHERE oid = %d', $id->oid); pierre@0: $owner = user_load(array('uid' => $id->uid)); pierre@0: // Tell plug-in modules to clean up. pierre@0: module_invoke_all('adowners', 'remove', $id->oid, $owner); pierre@0: } pierre@0: db_query('DELETE FROM {ad_owners} WHERE aid = %d', $node->nid); pierre@0: break; pierre@0: } pierre@0: } pierre@0: pierre@0: /** pierre@0: * Implementation of hook_adapi(). pierre@0: */ pierre@0: function ad_owners_adapi($op, $node = NULL) { pierre@0: switch ($op) { pierre@0: case 'permissions': pierre@0: return array('manage owners'); pierre@0: break; pierre@0: } pierre@0: } pierre@0: pierre@0: /** pierre@0: * Determine whether the ad owner has a given privilege. pierre@0: * pierre@0: * @param $ad pierre@0: * Node object or aid of advertisement. pierre@0: * @param $permission pierre@0: * Special Ad owners permission which should be checked (such as 'manage owners') pierre@0: * @param $account pierre@0: * User object, which are accessing the ad or current user by default. pierre@0: */ pierre@0: function ad_owners_adaccess($ad, $permission, $account = NULL) { pierre@0: global $user; pierre@0: static $permissions = array(); pierre@0: pierre@0: if (!isset($account)) { pierre@0: $account = $user; pierre@0: } pierre@0: pierre@0: $aid = 0; pierre@0: if (isset($ad)) { pierre@0: if (is_numeric($ad)) { pierre@0: $aid = $ad; pierre@0: } pierre@0: else if (is_object($ad) && isset($ad->nid)) { pierre@0: $aid = $ad->nid; pierre@0: } pierre@0: } pierre@0: pierre@0: if (!isset($permissions[$aid][$account->uid])) { pierre@0: $oid = db_result(db_query("SELECT oid FROM {ad_owners} WHERE aid = %d and uid = %d", $aid, $account->uid)); pierre@0: $permissions[$aid][$account->uid] = explode('|,|', db_result(db_query("SELECT permissions FROM {ad_permissions} WHERE oid = %d", $oid))); pierre@0: } pierre@0: $access = ''; pierre@0: if (is_array($permission)) { pierre@0: foreach ($permission as $perm) { pierre@0: $access |= in_array($perm, $permissions[$aid][$account->uid]); pierre@0: } pierre@0: } pierre@0: else { pierre@0: $access = in_array($permission, $permissions[$aid][$account->uid]); pierre@0: } pierre@0: pierre@0: return $access; pierre@0: } pierre@0: pierre@0: pierre@0: /** pierre@0: * TODO: Make this themeable. pierre@0: * TODO: Group permissions by module. pierre@0: * TODO: Allow modules to define default value for permission. pierre@0: */ pierre@0: function ad_owners_overview($node) { pierre@0: drupal_set_title(t('Ad owners')); pierre@0: pierre@0: // Be sure the node owner is listed as an ad owner pierre@0: if (!db_result(db_query('SELECT oid FROM {ad_owners} WHERE uid = %d AND aid = %d', $node->uid, $node->nid))) { pierre@0: ad_owners_add($node, $node->uid); pierre@0: } pierre@0: pierre@0: $header = array( pierre@0: array('data' => t('Username'), 'field' => 'uid'), pierre@0: array('data' => t('Options')), pierre@0: ); pierre@0: pierre@0: $sql = "SELECT a.uid, u.name FROM {ad_owners} a INNER JOIN {users} u ON a.uid = u.uid WHERE aid = %d"; pierre@0: $sql .= tablesort_sql($header); pierre@0: $result = pager_query($sql, 25, 0, NULL, $node->nid); pierre@0: pierre@0: $rows = array(); pierre@0: while ($owner = db_fetch_object($result)) { pierre@0: $row = array(); pierre@0: $row[] = $owner->name; pierre@0: $options = array(); pierre@0: // first option is 'permissions', plug-ins come afterwards pierre@0: $options[] = l(t('permissions'), 'node/'. $node->nid .'/adowners/'. $owner->uid .'/permissions'); pierre@0: $options = array_merge($options, module_invoke_all('adowners', 'overview', $node->nid, $owner->uid)); pierre@0: // node owner has to remain an ad owner pierre@0: if ($node->uid != $owner->uid) { pierre@0: $options[] = l(t('remove'), 'node/'. $node->nid .'/adowners/'. $owner->uid .'/remove'); pierre@0: } pierre@0: $options = implode(' | ', $options); pierre@0: $row[] = $options; pierre@0: $rows[] = $row; pierre@0: } pierre@0: pierre@0: $output = theme('table', $header, $rows); pierre@0: $output .= theme('pager', NULL, 25, 0); pierre@0: pierre@0: return $output; pierre@0: } pierre@0: pierre@0: /** pierre@0: * A simple form for adding new users as owners of ads. pierre@0: */ pierre@0: function ad_owners_add_form($form_state, $node) { pierre@0: $form = array(); pierre@0: drupal_set_title(t('Add owner')); pierre@0: pierre@0: $form['aid'] = array( pierre@0: '#type' => 'value', pierre@0: '#value' => $node->nid, pierre@0: ); pierre@0: $form['username'] = array( pierre@0: '#autocomplete_path' => 'user/autocomplete', pierre@0: '#description' => t('Enter the username of the user who should have ownership permissions on this advertisement.'), pierre@0: '#required' => TRUE, pierre@0: '#type' => 'textfield', pierre@0: '#title' => t('Username'), pierre@0: ); pierre@0: $form['save'] = array( pierre@0: '#type' => 'submit', pierre@0: '#value' => t('Add owner'), pierre@0: ); pierre@0: pierre@0: return $form; pierre@0: } pierre@0: pierre@0: function ad_owners_add_form_validate($form, &$form_state) { pierre@0: $owner = user_load(array('name' => $form_state['values']['username'])); pierre@0: if (!is_object($owner)) { pierre@0: form_set_error('username', t('The specified username %username does not exist.', array('%username' => $form_state['values']['username']))); pierre@0: } pierre@0: else if (db_result(db_query('SELECT oid FROM {ad_owners} WHERE uid = %d AND aid = %d', $owner->uid, $form_state['values']['aid']))) { pierre@0: form_set_error('username', t('The specified user %username is already an owner of this ad.', array('%username' => $form_state['values']['username']))); pierre@0: } pierre@0: else if (!user_access('edit own advertisements', $owner) && pierre@0: !user_access('administer advertisements', $owner)) { pierre@0: form_set_error('username', t('The specified user %username does not have edit own advertisements nor administer advertisements permissions. The user must be !assigned to a !role with these privileges before you can add them as an ad owner.', array('%username' => $form_state['values']['username'], '!assigned' => l(t('assigned'), "user/$owner->uid/edit"), '!role' => l(t('role'), 'admin/user/permissions')))); pierre@0: } pierre@0: module_invoke_all('adowners', 'validate', $owner, $form_state['values']['aid']); pierre@0: } pierre@0: pierre@0: function ad_owners_add_form_submit($form, &$form_state) { pierre@0: $owner = user_load(array('name' => $form_state['values']['username'])); pierre@0: $node = node_load($form_state['values']['aid']); pierre@0: if (!(ad_owners_add($node, $owner->uid))) { pierre@0: form_set_error('username', t('The user is already an owner of the ad.')); pierre@0: } pierre@0: else { pierre@0: drupal_set_message(t('The user %username has been added as an owner of this advertisement.', array('%username' => $form_state['values']['username']))); pierre@0: drupal_goto('node/'. $form_state['values']['aid'] .'/adowners/'. $owner->uid .'/permissions'); pierre@0: } pierre@0: } pierre@0: pierre@0: function ad_is_owner($aid, $account = NULL) { pierre@0: global $user; pierre@0: if (!isset($account)) { pierre@0: $account = $user; pierre@0: } pierre@0: if (db_result(db_query('SELECT oid FROM {ad_owners} WHERE uid = %d AND aid = %d', $account->uid, $aid))) { pierre@0: return 1; pierre@0: } pierre@0: else { pierre@0: return 0; pierre@0: } pierre@0: } pierre@0: pierre@0: /** pierre@0: * Add an owner to an ad. pierre@0: */ pierre@0: function ad_owners_add($node, $owner, $permissions = array()) { pierre@0: $rc = 0; pierre@0: $uid = is_numeric($owner) ? $owner : $owner->uid; pierre@0: if (!db_result(db_query('SELECT oid FROM {ad_owners} WHERE aid = %d AND uid = %d', $node->nid, $uid))) { pierre@0: db_query('INSERT INTO {ad_owners} (aid, uid) VALUES(%d, %d)', $node->nid, $uid); pierre@0: $rc = db_affected_rows() ? 1 : 0; pierre@0: pierre@0: if (!$permissions) { pierre@0: $permissions = variable_get('ad_'. $node->adtype .'_default_permissions', array('access statistics', 'access click history', 'manage status')); pierre@0: } pierre@0: pierre@0: $oid = db_result(db_query("SELECT oid FROM {ad_owners} WHERE aid = %d and uid = %d", $node->nid, $uid)); pierre@0: db_query('DELETE FROM {ad_permissions} WHERE oid = %d', $oid); pierre@0: db_query("INSERT INTO {ad_permissions} VALUES(%d, '%s')", $oid, implode('|,|', $permissions)); pierre@0: module_invoke_all('adowners', 'add', $node, array('oid' => $oid, 'uid' => $uid, 'aid' => $node->nid)); pierre@0: } pierre@0: return $rc; pierre@0: } pierre@0: pierre@0: /** pierre@0: * Create a unique host id for each ad owner, used when displaying ads remotely. pierre@0: */ pierre@0: function ad_host_id_create($uid) { pierre@0: $hostid = db_result(db_query('SELECT hostid FROM {ad_hosts} WHERE uid = %d', $uid)); pierre@0: if (!$hostid) { pierre@0: $hostid = md5($uid . time()); pierre@0: db_query("INSERT INTO {ad_hosts} (uid, hostid) VALUES (%d, '%s')", $uid, md5($uid . time())); pierre@0: } pierre@0: pierre@0: return $hostid; pierre@0: } pierre@0: pierre@0: /** pierre@0: * Removes ad owner from an ad. pierre@0: */ pierre@0: function ad_owner_remove_form($form_state, $node, $owner) { pierre@0: $form['aid'] = array( pierre@0: '#type' => 'value', pierre@0: '#value' => $node->nid, pierre@0: ); pierre@0: $form['uid'] = array( pierre@0: '#type' => 'value', pierre@0: '#value' => $owner->uid, pierre@0: ); pierre@0: pierre@0: return confirm_form($form, pierre@0: t('Are you sure you want to remove user %name as an owner of this advertisement?', array('%name' => $owner->name)), pierre@0: "node/$aid/adowners", pierre@0: t('This action cannot be undone.'), pierre@0: t('Remove'), pierre@0: t('Cancel') pierre@0: ); pierre@0: } pierre@0: pierre@0: /** pierre@0: * Don't allow the removal of the primary owner of the advertisement. pierre@0: */ pierre@0: function ad_owner_remove_form_validate($form, &$form_state) { pierre@0: $node = node_load($form_state['values']['aid']); pierre@0: if ($node->uid == $form_state['values']['uid']) { pierre@0: $owner = user_load(array('uid' => $form_state['values']['uid'])); pierre@0: drupal_set_message(t('%name is the primary owner of this advertisement. You cannot remove the primary owner.', array('%name' => $owner->name)), 'error'); pierre@0: pierre@0: $form_state['redirect'] = 'node/'. $form_state['values']['aid'] .'/adowners'; pierre@0: } pierre@0: } pierre@0: pierre@0: /** pierre@0: * Remove the ad owner, and all associated permissions. pierre@0: */ pierre@0: function ad_owner_remove_form_submit($form, &$form_state) { pierre@0: $oid = db_result(db_query('SELECT oid FROM {ad_owners} WHERE aid = %d AND uid = %d', $form_state['values']['aid'], $form_state['values']['uid'])); pierre@0: db_query('DELETE FROM {ad_owners} WHERE oid = %d', $oid); pierre@0: db_query('DELETE FROM {ad_permissions} WHERE oid = %d', $oid); pierre@0: $owner = user_load(array('uid' => $form_state['values']['uid'])); pierre@0: module_invoke_all('adowners', 'remove', $oid, $owner); pierre@0: drupal_set_message(t('The ad owner %name has been removed.', array('%name' => $owner->name))); pierre@0: pierre@0: $form_state['redirect'] = 'node/'. $form_state['values']['aid'] .'/adowners'; pierre@0: } pierre@0: pierre@0: pierre@0: /** pierre@0: * Display a form with all available permissions and their status for the pierre@0: * selected ad and ad owner. pierre@0: */ pierre@0: function ad_owner_permissions_form($form_state, $node, $user) { pierre@0: drupal_set_title(t('Permissions')); pierre@0: pierre@0: $oid = db_result(db_query("SELECT oid FROM {ad_owners} WHERE aid = %d and uid = %d", $node->nid, $user->uid)); pierre@0: $granted = explode('|,|', db_result(db_query("SELECT permissions FROM {ad_permissions} WHERE oid = %d", $oid))); pierre@0: pierre@0: $form['header'] = array( pierre@0: '#type' => 'value', pierre@0: '#value' => array(t('permissions'), t('granted')) pierre@0: ); pierre@0: pierre@0: $rows = array(); pierre@0: pierre@0: $permissions = module_invoke_all('adapi', 'permissions', $node); pierre@0: foreach ($permissions as $permission) { pierre@0: $form['permission'][$permission] = array( pierre@0: '#value' => t($permission), pierre@0: ); pierre@0: $form['grant'][str_replace(' ', '_', $permission)] = array( pierre@0: '#type' => 'checkbox', pierre@0: '#default_value' => in_array($permission, $granted) ? 1 : 0, pierre@0: ); pierre@0: } pierre@0: pierre@0: $form['oid'] = array( pierre@0: '#type' => 'hidden', pierre@0: '#value' => $oid, pierre@0: ); pierre@0: pierre@0: $form['aid'] = array( pierre@0: '#type' => 'hidden', pierre@0: '#value' => $node->nid, pierre@0: ); pierre@0: pierre@0: $form['uid'] = array( pierre@0: '#type' => 'hidden', pierre@0: '#value' => $user->uid, pierre@0: ); pierre@0: pierre@0: $form['submit'] = array( pierre@0: '#type' => 'submit', pierre@0: '#value' => t('Save'), pierre@0: ); pierre@0: pierre@0: return $form; pierre@0: } pierre@0: pierre@0: /** pierre@0: * Display ad owner permissions in a simple table. pierre@0: */ pierre@0: function theme_ad_owner_permissions_form($form) { pierre@0: $output = drupal_render($form['options']); pierre@0: foreach (element_children($form['permission']) as $key) { pierre@0: $row = array(); pierre@0: $row[] = drupal_render($form['permission'][$key]); pierre@0: $row[] = drupal_render($form['grant'][str_replace(' ', '_', $key)]); pierre@0: $rows[] = $row; pierre@0: } pierre@0: pierre@0: $output = theme('table', $form['header']['#value'], $rows); pierre@0: $output .= drupal_render($form); pierre@0: return $output; pierre@0: } pierre@0: pierre@0: /** pierre@0: * Store the ad owner's updated permissions in the ad_permissions table. pierre@0: */ pierre@0: function ad_owner_permissions_form_submit($form, &$form_state) { pierre@0: $permissions = module_invoke_all('adapi', 'permissions', array()); pierre@0: $perms = array(); pierre@0: foreach ($permissions as $permission) { pierre@0: $perm = str_replace(' ', '_', $permission); pierre@0: if (isset($form_state['values'][$perm]) && $form_state['values'][$perm] > 0) { pierre@0: $perms[] = $permission; pierre@0: } pierre@0: } pierre@0: db_query('DELETE FROM {ad_permissions} WHERE oid = %d', $form_state['values']['oid']); pierre@0: db_query("INSERT INTO {ad_permissions} VALUES(%d, '%s')", $form_state['values']['oid'], implode('|,|', $perms)); pierre@0: pierre@0: drupal_set_message(t('The permissions have been saved.')); pierre@0: $form_state['redirect'] = 'node/'. $form_state['values']['aid'] .'/adowners'; pierre@0: }