pierre@1: . pierre@1: */ pierre@1: pierre@1: define('AD_PROBABILITY_DEFAULT', 100); pierre@1: pierre@1: /** pierre@1: * Implementation of hook_form_alter(). pierre@1: * Generate a form for assigning a weight to an advertisement. pierre@1: */ pierre@1: function ad_weight_probability_form_alter(&$form, &$form_state, $form_id) { pierre@1: if (isset($form['type']) && $form_id == 'ad_node_form') { pierre@1: $node = $form['#node']; pierre@1: $form['weighting'] = array( pierre@1: '#type' => 'fieldset', pierre@1: '#access' => user_access('configure ad probability'), pierre@1: '#title' => t('Weight'), pierre@1: '#collapsible' => TRUE, pierre@1: '#collapsed' => FALSE, pierre@1: ); pierre@1: $form['weighting']['probability'] = array( pierre@1: '#type' => 'select', pierre@1: '#access' => user_access('configure ad probability'), pierre@1: '#title' => t('Probability'), pierre@1: '#options' => _ad_weight_probability_weights(), pierre@1: '#default_value' => isset($node->probability) ? $node->probability : 100, pierre@1: '#description' => t('The greater the probability, the more frequently this advertisement will be displayed. An advertisement with a probablity of 2 will be displayed twice as frequently as an advertisement with a probability of 1.'), pierre@1: ); pierre@1: $form['weighting']['#weight'] = -1; pierre@1: } pierre@1: } pierre@1: pierre@1: /** pierre@1: * Implementation of hook_nodeapi(). pierre@1: */ pierre@1: function ad_weight_probability_nodeapi($node, $op, $arg = 0) { pierre@1: switch ($op) { pierre@1: case 'load': pierre@1: return _ad_weight_probability_node_load($node); pierre@1: case 'insert': pierre@1: case 'update': pierre@1: if (user_access('configure ad probability')) { pierre@1: // Fully load the node object to confirm that we are working with an pierre@1: // advertisement. pierre@1: $ad = node_load($node->nid); pierre@1: if (isset($ad->adtype)) { pierre@1: return _ad_weight_probability_node_save($node, $op); pierre@1: } pierre@1: } pierre@1: case 'delete': pierre@1: return _ad_weight_probability_node_delete($node); pierre@1: } pierre@1: } pierre@1: pierre@1: /** pierre@1: * Implementation of hook_perm(). pierre@1: */ pierre@1: function ad_weight_probability_perm() { pierre@1: return array(t('configure ad probability')); pierre@1: } pierre@1: pierre@1: /** pierre@1: * Implementation of hook_ad_build_cache(). pierre@1: */ pierre@1: function ad_weight_probability_ad_build_cache() { pierre@1: $cache = array(); pierre@1: $active = db_query("SELECT a.aid, p.probability FROM {ads} a LEFT JOIN {ad_weight_probability} p ON a.aid = p.aid WHERE adstatus = 'active'"); pierre@1: while ($ad = db_fetch_object($active)) { pierre@1: $probability = $ad->probability ? $ad->probability : AD_PROBABILITY_DEFAULT; pierre@1: $ads[$ad->aid] = $probability; pierre@1: } pierre@1: $cache['weight']['probability'] = $ads; pierre@1: $cache['weight']['hook_weight'] = array( pierre@1: 'weight' => 10, pierre@1: 'file' => drupal_get_path('module', 'ad_weight_probability') .'/ad_weight_probability.inc', pierre@1: 'function' => 'ad_weight_probability_cache_filter', pierre@1: ); pierre@1: return $cache; pierre@1: } pierre@1: pierre@1: /** pierre@1: * Helper function, load the probability from the database. pierre@1: */ pierre@1: function _ad_weight_probability_node_load($node) { pierre@1: $probability = (int)db_result(db_query('SELECT probability FROM {ad_weight_probability} WHERE aid = %d', $node->nid)); pierre@1: $output['probability'] = $probability ? $probability : AD_PROBABILITY_DEFAULT; pierre@1: return $output; pierre@1: } pierre@1: pierre@1: /** pierre@1: * Helper function, save the probability to the database. pierre@1: */ pierre@1: function _ad_weight_probability_node_save($node) { pierre@1: if (is_object($node) && $node->nid) { pierre@1: db_query('UPDATE {ad_weight_probability} SET probability = %d WHERE aid = %d', $node->probability, $node->nid); pierre@1: if (!db_affected_rows()) { pierre@1: db_query('INSERT INTO {ad_weight_probability} (aid, probability) VALUES(%d, %d)', $node->nid, $node->probability); pierre@1: } pierre@1: } pierre@1: } pierre@1: pierre@1: /** pierre@1: * Helper function, delete the probability from the database. pierre@1: */ pierre@1: function _ad_weight_probability_node_delete($node) { pierre@1: db_query('DELETE FROM {ad_weight_probability} WHERE aid = %d', $node->nid); pierre@1: } pierre@1: pierre@1: /** pierre@1: * Available weight probabilities. pierre@1: */ pierre@1: function _ad_weight_probability_weights() { pierre@1: return array( pierre@1: 25 => t('1/4'), pierre@1: 33 => t('1/3'), pierre@1: 50 => t('1/2'), pierre@1: 100 => t('1'), pierre@1: 200 => t('2'), pierre@1: 300 => t('3'), pierre@1: 400 => t('4'), pierre@1: ); pierre@1: } pierre@1: