'nodevote/' . $nid . '/add', 'callback' => 'nodevote_page', 'title' => t('nodevote add'), 'access' => user_access(NODEVOTE_PERM_USE), 'type' => MENU_CALLBACK); $items[] = array( 'path' => 'nodevote/' . $nid, 'callback' => 'nodevote_page', 'title' => t('nodevote view'), 'access' => user_access(NODEVOTE_PERM_VIEW), 'type' => MENU_CALLBACK); return $items; } function nodevote_perm() { return array (NODEVOTE_PERM_VIEW, NODEVOTE_PERM_USE); } function nodevote_settings() { $set = 'types'; $form[$set] = array( '#type' => 'fieldset', '#title' => t('Enable voting for these node types:'), ); foreach(node_get_types() as $type => $name) { $form[$set][NODEVOTE_TYPE . $type] = array( '#type' => 'checkbox', '#title' => $name, '#return_value' => 1, '#default_value' => variable_get(NODEVOTE_TYPE . $type, '0'), ); } $set = 'setting'; $form[$set] = array( '#type' => 'fieldset', '#title' => t('Settings'), ); $form[$set][NODEVOTE_VOTE_DESC] = array( '#type' => 'textfield', '#title' => t('Vote Description'), '#default_value' => variable_get(NODEVOTE_VOTE_DESC, 'Score'), '#size' => 25, '#maxlength' => 25, ); $_display = array(0 => t('Text'), 1 => t('Stars'), 2 => t('Both')); $form[$set][NODEVOTE_RESULT_DISPLAY_PAGE]= array( '#type' => 'radios', '#title' => t('Vote result display (page view)'), '#default_value' => variable_get(NODEVOTE_RESULT_DISPLAY_PAGE, 0), '#options' => $_display, '#description' => t('Select which format the results of the vote will be displayed in when in node view.')); $_display = array(0 => t('Text'), 1 => t('Stars'), 2 => t('Both')); $form[$set][NODEVOTE_RESULT_DISPLAY_TEASER]= array( '#type' => 'radios', '#title' => t('Vote result display (teaser view)'), '#default_value' => variable_get(NODEVOTE_RESULT_DISPLAY_TEASER, 0), '#options' => $_display, '#description' => t('Select which format the results of the vote will be displayed in when in teaser view.')); $form[$set][NODEVOTE_MAX_SCORE_VAR]= array( '#type' => 'textfield', '#title' => t('Max Score For Voting'), '#default_value' => variable_get(NODEVOTE_MAX_SCORE_VAR, NODEVOTE_MAX_SCORE), '#description' => t('The Max Score one can give when voteing (recommend not going higher then 10).')); $set='advance'; $form[$set] = array( '#type' => 'fieldset', '#title' => t('Advanced Settings'), ); $form[$set][NODEVOTE_RESULT_VOTED] = array( '#type' => 'checkbox', '#title' => t('Show vote results only if user has voted on node.'), '#return_value' => 1, '#default_value' => variable_get(NODEVOTE_RESULT_VOTED, 0), ); $form[$set][NODEVOTE_CHANGE_VOTE] = array( '#type' => 'checkbox', '#title' => t('Allow user to vote again.'), '#return_value' => 1, '#default_value' => variable_get(NODEVOTE_CHANGE_VOTE, 0), ); $form[$set][NODEVOTE_VOTE_OWN_NODE] = array( '#type' => 'checkbox', '#title' => t('Allow user to vote on his own node.'), '#return_value' => 1, '#default_value' => variable_get(NODEVOTE_VOTE_OWN_NODE, 0), ); return $form; } function nodevote_link($type, $node, $teaser = false) { if ($type == 'node' && $teaser) { if (_nodevote_is_votable($node)) { return array(l(t('Rate it'), "node/$node->nid")); } } } function nodevote_user($op) { switch($op) { case 'delete': db_query('DELETE FROM {nodevote} WHERE uid = %d', $user->uid); break; } } function nodevote_block($op = 'list', $delta = 0, $edit = array()) { $num = 5; $block_title = array(); $block_title[] = t('Most voted for nodes'); $block_title[] = t('Highest rated nodes'); $block_title[] = t('Most voting users'); switch ($op) { case 'list': $blocks[0]['info'] = $block_title[0]; $blocks[1]['info'] = $block_title[1]; $blocks[2]['info'] = $block_title[2]; return $blocks; case 'view': if (user_access(NODEVOTE_PERM_VIEW)) { switch ($delta) { case 0: $title = $block_title[$delta]; $sql = db_rewrite_sql('SELECT n.nid, n.title, COUNT(*) AS num_votes FROM {node} n, {nodevote} nv WHERE n.nid = nv.nid GROUP BY n.nid ORDER BY num_votes DESC'); $content = node_title_list(db_query_range($sql, 0, $num)); break; case 1: $title = $block_title[$delta]; $sql = db_rewrite_sql('SELECT n.nid, n.title, AVG(vote) AS av_avg FROM {node} n, {nodevote} nv WHERE n.nid = nv.nid GROUP BY n.nid ORDER BY av_avg DESC'); $content = node_title_list(db_query_range($sql, 0, $num)); break; case 2: $title = $block_title[$delta]; $result = db_query_range('SELECT nv.uid, u.name, COUNT(*) AS num_votes FROM {nodevote} nv, {users} u WHERE u.uid = nv.uid GROUP BY nv.uid ORDER BY num_votes DESC', 0, $num); while ($account = db_fetch_object($result)) { $items[] = $account; } $content = theme('user_list', $items); break; } $block['subject'] = $title; $block['content'] = $content; return $block; } } } function nodevote_page() { global $user; $edit = $_POST['edit']; $nid = (int)arg(1); $op = arg(2); switch($op) { case 'add': $vote = $edit['vote']; if (_nodevote_validate_vote($vote)) { if (_nodevote_user_voted($user->uid, $nid)){ $result = db_query("UPDATE {nodevote} SET vote = $vote WHERE uid = %d AND nid = %d" , $user->uid , $nid); } else { $result = db_query("INSERT INTO {nodevote} VALUES (%d, %d, %d)", $user->uid, $nid, $vote); if(module_exist('userpoints')) { userpoints_nodevote($nid); } } drupal_goto("node/" . $nid); } else { drupal_set_message(t('You must select a valid vote score.'), 'error'); } $o = l(t('back to node'), 'node/' . $nid); break; case 'view': default: if (_nodevote_vote_is_visible($node)) { $data = _nodevote_get_vote_data($node->nid); $o = theme('nodevote_display_vote', $data['score'], $data['votes'], $data['vote_display']); } break; } print theme('page', $o); } function nodevote_nodeapi(&$node, $op, $teaser, $page) { global $user; switch($op) { case 'load': if (variable_get(NODEVOTE_TYPE . $node->type, '0')) { if (_nodevote_vote_is_visible($node)) { $extra['nodevote']->vote_display = 1; } if (_nodevote_is_votable($node)) { $extra['nodevote']->vote_do = 1; } } return $extra; case 'view': if (variable_get(NODEVOTE_TYPE . $node->type, '0')) { if ($node->nodevote->vote_display) { $data = _nodevote_get_vote_data($node->nid, $page); if ($page) { $node->body .= theme('nodevote_display_vote', $data['score'], $data['votes'], $data['vote_display']); } else { $node->teaser .= theme('nodevote_display_vote', $data['score'], $data['votes'], $data['vote_display']); } } } if ($page) { if ($node->nodevote->vote_do) { $vote = theme('nodevote_do_vote',$node); $node->body .= $vote; } } break; case 'delete': $r = db_query('DELETE FROM {nodevote} WHERE nid = %d', $node->nid); break; } } function _nodevote_user_voted($uid, $nid) { if (db_num_rows(db_query('SELECT * FROM {nodevote} WHERE uid = %d AND nid = %d', $uid, $nid))) { return true; } else { return false; } } function _nodevote_get_vote_data($nid, $page = true) { $result = db_fetch_array(db_query('SELECT COUNT(*) AS votes, AVG(vote) AS score FROM {nodevote} WHERE nid = %d', $nid)); $score = $result['score']; $votes = $result['votes']; if ($page) { $vote_display = variable_get(NODEVOTE_RESULT_DISPLAY_PAGE, 0); } else { $vote_display = variable_get(NODEVOTE_RESULT_DISPLAY_TEASER, 0); } return array('score' => $score, 'votes' => $votes, 'vote_display' => $vote_display); } function theme_nodevote_display_vote($score, $votes, $vote_display) { $set = 'display'; $form[$set] = array( '#type' => 'fieldset', '#title' => t('Vote Result'), ); switch($vote_display) { case 1: $form[$set][] = _nodevote_display_stars($votes, $score); break; case 2: $form[$set][] = _nodevote_display_stars($votes, $score); $form[$set][] = _nodevote_display_form_number($votes, $score); break; case 0: default: $form[$set][] = _nodevote_display_form_number($votes, $score); break; } return drupal_get_form('nodevote_form', $form); } function _nodevote_display_form_number($votes, $score) { $form['display']= array( '#type' => 'markup', '#title' => t('Vote Result'), '#value' => t('Score: %score, Votes: %votes', array( '%votes' => $votes, '%score' => number_format($score, 1))), '#prefix'=> '
';
};
$form['display']= array(
'#type' => 'markup',
'#title' => t('Vote Result'),
'#value' => $o,
'#prefix'=> '