i18npoll.module in Internationalization 6
Multilingual poll - Aggregates poll results for all translations.
Most code ripped off poll module and adapted for multilingual results.
File
i18npoll/i18npoll.moduleView source
<?php
/**
* @file
* Multilingual poll - Aggregates poll results for all translations.
*
* Most code ripped off poll module and adapted for multilingual results.
*/
/**
* Implementation of hook_form_alter().
*
* Rewrite the cancel vote form with the nid for the translation with the actual vote.
*/
function i18npoll_form_alter(&$form, $form_state, $form_id) {
if ($form_id == 'poll_cancel_form') {
if (!empty($form['#nid']) && empty($form['#i18ntnid'])) {
// Replace nid with the original node the user voted
$node = node_load($form['#nid']);
if (!empty($node->tnid) && ($vote = i18npoll_get_vote($node->tnid))) {
$form['#i18ntnid'] = $node->tnid;
$form['#nid'] = $vote->nid;
}
}
}
}
/**
* Implementation of hook_nodeapi().
*
* Replaces poll results with aggregated translations.
*
* We don't add all language results on loading to avoid the data being trashed
* when editing and saving nodes again.
*/
function i18npoll_nodeapi(&$node, $op, $teaser = NULL, $page = NULL) {
global $user;
if ($node->type == 'poll' && !empty($node->tnid)) {
// Replace results for node view
if ($op == 'view' && (empty($node->allowvotes) || !empty($node->show_results))) {
$node->content['body'] = array(
'#value' => i18npoll_view_results($node, $teaser, $page, FALSE),
);
}
// Check again whether or not this user is allowed to vote.
// User may have voted for any of the translations
if ($op == 'load' && $node->allowvotes) {
$result = i18npoll_get_vote($node->tnid);
if (isset($result->chorder)) {
$node->vote = $result->chorder;
$node->allowvotes = FALSE;
}
}
}
}
/**
* Implementation of hook_block().
*
* Generates a block containing the latest poll with aggregated results.
*/
function i18npoll_block($op = 'list', $delta = 0) {
if (user_access('access content')) {
if ($op == 'list') {
$blocks[0]['info'] = t('Most recent poll (Aggregated translations)');
return $blocks;
}
elseif ($op == 'view') {
// Retrieve the latest poll.
$sql = db_rewrite_sql("SELECT MAX(n.created) FROM {node} n INNER JOIN {poll} p ON p.nid = n.nid WHERE n.status = 1 AND p.active = 1");
$timestamp = db_result(db_query($sql));
if ($timestamp) {
$poll = node_load(array(
'type' => 'poll',
'created' => $timestamp,
'status' => 1,
));
if ($poll->nid) {
$poll = i18npoll_view($poll, TRUE, FALSE, TRUE);
}
}
$block['subject'] = t('Poll');
$block['content'] = drupal_render($poll->content);
return $block;
}
}
}
/**
* Implementation of hook_view().
*
* @param $block
* An extra parameter that adapts the hook to display a block-ready
* rendering of the poll.
*/
function i18npoll_view($node, $teaser = FALSE, $page = FALSE, $block = FALSE) {
global $user;
$output = '';
// Special display for side-block.
if ($block) {
// No 'read more' link.
$node->readmore = FALSE;
$links = module_invoke_all('link', 'node', $node, 1);
$links[] = array(
'title' => t('Older polls'),
'href' => 'poll',
'attributes' => array(
'title' => t('View the list of polls on this site.'),
),
);
if ($node->allowvotes && $block) {
$links[] = array(
'title' => t('Results'),
'href' => 'node/' . $node->nid . '/results',
'attributes' => array(
'title' => t('View the current poll results.'),
),
);
}
$node->links = $links;
}
if (!empty($node->allowvotes) && ($block || empty($node->show_results))) {
$node->content['body'] = array(
'#value' => drupal_get_form('poll_view_voting', $node, $block),
);
}
else {
$node->content['body'] = array(
'#value' => i18npoll_view_results($node, $teaser, $page, $block),
);
}
return $node;
}
/**
* Generates a graphical representation of the results of a poll.
*/
function i18npoll_view_results(&$node, $teaser, $page, $block) {
// Load the appropriate choices into the $poll object.
$result = db_query("SELECT c.chorder, SUM(c.chvotes) AS votes FROM {poll_choices} c INNER JOIN {node} n ON c.nid = n.nid WHERE n.tnid = %d GROUP BY c.chorder", $node->tnid);
while ($choice = db_fetch_object($result)) {
// If this option not set for the source node, do not show.
if (isset($node->choice[$choice->chorder])) {
$node->choice[$choice->chorder]['chvotes'] = $choice->votes;
}
}
return poll_view_results($node, $teaser, $page, $block);
}
/**
* Get user vote for this node or its translations.
*
* Returns object with nid, chorder. Has static caching as this will typically be called twice.
*/
function i18npoll_get_vote($tnid) {
global $user;
static $vote = array();
if (!array_key_exists($tnid, $vote)) {
if ($user->uid) {
$vote[$tnid] = db_fetch_object(db_query('SELECT v.nid, v.chorder FROM {poll_votes} v INNER JOIN {node} n ON n.nid = v.nid WHERE n.tnid = %d AND v.uid = %d', $tnid, $user->uid));
}
else {
$vote[$tnid] = db_fetch_object(db_query("SELECT v.chorder FROM {poll_votes} v INNER JOIN {node} n ON n.nid = v.nid WHERE n.tnid = %d AND v.hostname = '%s'", $tnid, ip_address()));
}
}
return $vote[$tnid];
}
Functions
Name | Description |
---|---|
i18npoll_block | Implementation of hook_block(). |
i18npoll_form_alter | Implementation of hook_form_alter(). |
i18npoll_get_vote | Get user vote for this node or its translations. |
i18npoll_nodeapi | Implementation of hook_nodeapi(). |
i18npoll_view | Implementation of hook_view(). |
i18npoll_view_results | Generates a graphical representation of the results of a poll. |