TP-Docs
HTML5 Icon HTML5 Icon HTML5 Icon
TP on Social Media

Recent

Welcome to TinyPortal. Please login or sign up.

March 29, 2024, 12:59:14 PM

Login with username, password and session length
Members
Stats
  • Total Posts: 195,106
  • Total Topics: 21,213
  • Online today: 358
  • Online ever: 3,540 (September 03, 2022, 01:38:54 AM)
Users Online
  • Users: 0
  • Guests: 66
  • Total: 66

[Block] Enhanced showPoll

Started by WillyP, July 05, 2011, 12:55:36 PM

Previous topic - Next topic

0 Members and 1 Guest are viewing this topic.

WillyP

Name of Snippet: Enhanced showPoll
SMF/TP versions tested:: SMF1.1.14/TP1.0b3 & SMF2.0/TP1.0RC2... Make sure you get the right code below.
Block Type:: php
Authors: Greybrow, Raysr, Thurnok, JPDeni, and special thanks to Freddy for the SMF 2.0 update.
Link to Discussion: Poll Block
Other Requirements: None.
Description: Outputs the latest poll from a particular board, or from a specific thread. Guests are shown the question, and a plain unordered list of options along with an invitation to login or register. Logged in users may vote in the block, and after voting are shown the results.

See an example at: Planet Descent

NOTE: The very last line of the code determines from where the poll will be pulled. Board 15 is given as an example, you will likely need to change this after copying the code to your block. Please read the instructions in the comments at the beginning of the block for more information.

Use this code for SMF 1.1.x
Code (SMF 1.1.x) Select

//////////////////////////////////////////////////////////
// Enhanced showPoll block
// Shows poll in block from specified topic,
// or the most recent from specified board
//
// Author: Greybrow
// Version: 2007-04-24 22:00
// Features:
// shows poll (or polls) that fits in a block
//         voting or scores (when voted or can't vote)
// shows question as a topic link
// shows poll from specified topic
// shows most recent poll from specified board
//
// based on ssi_showPoll();
// added block hacks by Raysr and Thurnok from:
//    http://tpblocks.ccs-net.com/index.php?topic=25
//    http://tpblocks.ccs-net.com/index.php?topic=40
//
// usage:
// - copy whole code to phpblock.
// - at the end of the code use function
// tp_showPoll(topic number or null, 'echo' or null, board number or null)
// or
// copy the function to SSI.php
// put only the function call in phpblock
//
// examples:
// show the poll from topic 34
// tp_showPoll(34);                     
//
// show the most recent poll from the board number 5
// tp_showPoll(null,'echo',5);           
//
// keep in mind, that if board is specified, topic is ignored
// so it will display the same as above
// tp_showPoll(34,'echo',5)             
//
// put the array with poll from board 5 into $thepoll variable
// $thepoll = tp_showPoll(null,null,5); 
//
// if you call the function more than once,
// with different options, block will show more polls
// but I'm not sure if voting would work correctly :(
///////////////////////////////////////////////////////

function tp_showPoll($topic = null, $output_method = 'echo', $board = null)
{
global $db_prefix, $txt, $ID_MEMBER, $settings, $boardurl, $sc, $user_info;
global $context, $scripturl;
///added: , $scripturl
$boardsAllowed = boardsAllowedTo('poll_view');

if (empty($boardsAllowed))
return array();

if ($topic === null && isset($_REQUEST['ssi_topic']))
$topic = (int) $_REQUEST['ssi_topic'];
else
$topic = (int) $topic;

if ($board === null)
{
// board not chosen, so get the one from specified topic
$request = db_query("
SELECT
p.ID_POLL, p.question, p.votingLocked, p.hideResults, p.expireTime, p.maxVotes, b.ID_BOARD
FROM ({$db_prefix}topics AS t, {$db_prefix}polls AS p, {$db_prefix}boards AS b)
WHERE p.ID_POLL = t.ID_POLL
AND t.ID_TOPIC = $topic
AND b.ID_BOARD = t.ID_BOARD
AND $user_info[query_see_board]" . (!in_array(0, $boardsAllowed) ? "
AND b.ID_BOARD IN (" . implode(', ', $boardsAllowed) . ")" : '') . "
LIMIT 1", __FILE__, __LINE__);
}
else
{
// board chosen, so lets try to get the most recent poll from it
$board = (int) $board;
$request = db_query("
SELECT
p.ID_POLL, p.question, p.votingLocked, p.hideResults, p.expireTime, p.maxVotes, b.ID_BOARD, t.ID_TOPIC
FROM ({$db_prefix}topics AS t, {$db_prefix}polls AS p, {$db_prefix}boards AS b)
WHERE p.ID_POLL = t.ID_POLL
AND b.ID_BOARD = t.ID_BOARD
AND b.ID_BOARD = $board
AND $user_info[query_see_board]" . (!in_array(0, $boardsAllowed) ? "
AND $board IN (" . implode(', ', $boardsAllowed) . ")" : '') . "
ORDER BY p.ID_POLL DESC
LIMIT 1", __FILE__, __LINE__);
}

// Either this topic has no poll, or the user cannot view it.
if (mysql_num_rows($request) == 0)
return array();

$row = mysql_fetch_assoc($request);
mysql_free_result($request);

if($topic == 0)
$topic = (int)$row['ID_TOPIC'];

// Check if they can vote.
if ((!empty($row['expireTime']) && $row['expireTime'] < time()) || $user_info['is_guest'] || !empty($row['votingLocked']) || !allowedTo('poll_vote', $row['ID_BOARD']))
$allow_vote = false;
else
{
$request = db_query("
SELECT ID_MEMBER
FROM {$db_prefix}log_polls
WHERE ID_POLL = $row[ID_POLL]
AND ID_MEMBER = $ID_MEMBER
LIMIT 1", __FILE__, __LINE__);
$allow_vote = mysql_num_rows($request) == 0;
mysql_free_result($request);
}
$request = db_query("
SELECT COUNT(DISTINCT ID_MEMBER)
FROM {$db_prefix}log_polls
WHERE ID_POLL = $row[ID_POLL]", __FILE__, __LINE__);
list ($total) = mysql_fetch_row($request);
mysql_free_result($request);

$request = db_query("
SELECT ID_CHOICE, label, votes
FROM {$db_prefix}poll_choices
WHERE ID_POLL = $row[ID_POLL]", __FILE__, __LINE__);
$options = array();
$total_votes = 0;
while ($rowChoice = mysql_fetch_assoc($request))
{
censorText($rowChoice['label']);

$options[$rowChoice['ID_CHOICE']] = array($rowChoice['label'], $rowChoice['votes']);
$total_votes += $rowChoice['votes'];
}
mysql_free_result($request);

$return = array(
'id' => $row['ID_POLL'],
'image' => empty($pollinfo['votingLocked']) ? 'poll' : 'locked_poll',
'question' => $row['question'],
'total_votes' => $total,
'is_locked' => !empty($pollinfo['votingLocked']),
'allow_vote' => $allow_vote,
'topic' => $topic
);

// Calculate the percentages and bar lengths...
$divisor = $total_votes == 0 ? 1 : $total_votes;
foreach ($options as $i => $option)
{
$bar = floor(($option[1] * 100) / $divisor);
$barWide = $bar == 0 ? 1 : floor(($bar * 5) / 6);
$return['options'][$i] = array(
'id' => 'options-' . $i,
'percent' => $bar,
'votes' => $option[1],
'bar' => '<span style="white-space: nowrap;"><img src="' . $settings['images_url'] . '/poll_left.gif" alt="" /><img src="' . $settings['images_url'] . '/poll_middle.gif" width="' . $barWide . '" height="12" alt="-" /><img src="' . $settings['images_url'] . '/poll_right.gif" alt="" /></span>',
'option' => parse_bbc($option[0]),
'vote_button' => '<input type="' . ($row['maxVotes'] > 1 ? 'checkbox' : 'radio') . '" name="options[]" id="options-' . $i . '" value="' . $i . '" class="check" />'
);
}

$return['allowed_warning'] = $row['maxVotes'] > 1 ? sprintf($txt['poll_options6'], $row['maxVotes']) : '';

if ($output_method != 'echo')
return $return;

if ($return['allow_vote'])
{
echo '
<form action="', $boardurl, '/SSI.php?ssi_function=pollVote" method="post" accept-charset="', $context['character_set'], '">
<input type="hidden" name="poll" value="', $return['id'], '" />
<table border="0" cellspacing="1" cellpadding="0" class="ssi_table">
<tr>
<td colspan="2" class="smalltext"><a href="', $boardurl, '/index.php?topic=', $return['topic'], '"><b>', $return['question'], '</b></a></td>
</tr>
<tr>
<td class="smalltext">', $return['allowed_warning'], '</td>
</tr>';
foreach ($return['options'] as $option)
echo '
<tr>
<td class="smalltext"><label for="', $option['id'], '">', $option['vote_button'], '</td><td class="smalltext">', $option['option'], '</label></td>
</tr>';
echo '
<tr>
<td colspan="2" class="smalltext"><input type="submit" value="', $txt['smf23'], '" /></td>
</tr>
</table>
<input type="hidden" name="sc" value="', $sc, '" />
</form>';
}
///////////// /// added code by willyP, per jpdeni:
elseif ($user_info['is_guest'])
{
echo '

<a href="', $boardurl, '/index.php?topic=', $return['topic'], '"><b>', $return['question'], '</b></a><br /><ul>';
foreach ($return['options'] as $option)
echo '
<li>', $option['option'], '</li>';
echo '
</ul>
If you would like to vote in this poll, please <a href="' . $scripturl . '?action=login">login</a> or <a href="' . $scripturl . '?action=register">register</a>.';
}

/////////////end added code by willyP

else
{
echo '
<table border="0" cellspacing="1" cellpadding="0" class="ssi_table">
<tr>
<td colspan="2" class="smalltext"><a href="', $boardurl, '/index.php?topic=', $return['topic'], '"><b>', $return['question'], '</b></a></td>
</tr>';
foreach ($return['options'] as $option)
echo '
<tr>
<td colspan="2" align="left" valign="top" style="font-style: italic" class="smalltext">', $option['option'], '</td>
</tr>
<tr>
<td align="left" class="smalltext">', $option['bar'], '</td>
<td align="left" class="smalltext">', $option['votes'], ' (', $option['percent'], '%)</td>
</tr>';
echo '
<tr>
<td colspan="2" class="smalltext"><b>', $txt['smf24'], ': ', $return['total_votes'], '</b></td>
</tr>
</table>';
}
}

///////////////////////////////////////
// display most recent poll from board number 15
tp_showPoll(null,'echo',15);


Use this code for SMF 2.0:
Code (SMF 2.0) Select

//////////////////////////////////////////////////////////
// Enhanced showPoll block
// Shows poll in block from specified topic,
// or the most recent from specified board
//
// Author:   Greybrow
// Version:   2007-04-24 22:00
// Features:
//   shows poll (or polls) that fits in a block
//         voting or scores (when voted or can't vote)
//   shows question as a topic link
//   shows poll from specified topic
//   shows most recent poll from specified board
//
// based on ssi_showPoll();
// added block hacks by Raysr and Thurnok from:
//    http://tpblocks.ccs-net.com/index.php?topic=25
//    http://tpblocks.ccs-net.com/index.php?topic=40
//
// usage:
// - copy whole code to phpblock.
// - at the end of the code use function
// tp_showPoll(topic number or null, 'echo' or null, board number or null)
// or
// copy the function to SSI.php
// put only the function call in phpblock
//
// examples:
// show the poll from topic 34
// tp_showPoll(34);                     
//
// show the most recent poll from the board number 5
// tp_showPoll(null,'echo',5);           
//
// keep in mind, that if board is specified, topic is ignored
// so it will display the same as above
// tp_showPoll(34,'echo',5)             
//
// put the array with poll from board 5 into $thepoll variable
// $thepoll = tp_showPoll(null,null,5);
//
// if you call the function more than once,
// with different options, block will show more polls
// but I'm not sure if voting would work correctly :(
///////////////////////////////////////////////////////

function tp_showPoll($topic = null, $output_method = 'echo', $board = null)
{
global $db_prefix, $txt, $settings, $boardurl, $sc, $user_info;
global $context, $scripturl, $smcFunc;
///added: , $scripturl
$boardsAllowed = boardsAllowedTo('poll_view');

if (empty($boardsAllowed))
return array();

if ($topic === null && isset($_REQUEST['ssi_topic']))
$topic = (int) $_REQUEST['ssi_topic'];
else
$topic = (int) $topic;

if ($board === null)
{
// board not chosen, so get the one from specified topic
$request = $smcFunc['db_query']("", "
SELECT
p.id_poll, p.question, p.voting_locked, p.hide_results, p.expire_time, p.max_votes, b.id_board
FROM ({db_prefix}topics AS t, {db_prefix}polls AS p, {db_prefix}boards AS b)
WHERE p.id_poll = t.id_poll
AND t.id_topic = {int:topic}
AND b.id_board = t.id_board
AND $user_info[query_see_board]
" . (!in_array(0, $boardsAllowed) ? "
AND b.id_board IN ({array_int:boardsallowed})" : '') . "
LIMIT 1",
array(
'topic' => $topic,
'boardsallowed' => $boardsAllowed,

)
);
}
else
{
// board chosen, so lets try to get the most recent poll from it
$board = (int) $board;
$request = $smcFunc['db_query']("", "
SELECT
p.id_poll, p.question, p.voting_locked, p.hide_results, p.expire_time, p.max_votes, b.id_board, t.id_topic
FROM ({db_prefix}topics AS t, {db_prefix}polls AS p, {db_prefix}boards AS b)
WHERE   p.id_poll = t.id_poll
AND b.id_board = t.id_board
AND b.id_board = {int:board}
AND $user_info[query_see_board]
" . (!in_array(0, $boardsAllowed) ? "
AND {int:board} IN ({array_int:boardsallowed})" : '') . "
ORDER BY p.id_poll DESC
LIMIT 1",
array(
'board' => $board,
'boardsallowed' => $boardsAllowed,
)
);
}

// Either this topic has no poll, or the user cannot view it.
if (mysql_num_rows($request) == 0)
return array();

$row = mysql_fetch_assoc($request);

$smcFunc['db_free_result']($request);

if($topic == 0)
$topic = (int)$row['id_topic'];

// Check if they can vote.
if ((!empty($row['expire_time']) && $row['expire_time'] < time()) || $user_info['is_guest'] || !empty($row['voting_locked']) || !allowedTo('poll_vote', $row['id_board']))
$allow_vote = false;
else
{
$request = $smcFunc['db_query']("", "
SELECT id_member
FROM {db_prefix}log_polls
WHERE id_poll = {int:idpoll}
AND id_member = {int:userinfo}
LIMIT 1",
array(
'idpoll' => $row['id_poll'],
'userinfo' => $user_info['id'],
)
);

$allow_vote = mysql_num_rows($request) == 0;
$smcFunc['db_free_result']($request);
}

$request = $smcFunc['db_query']("", "
SELECT COUNT(DISTINCT id_member)
FROM {db_prefix}log_polls
WHERE id_poll = {int:idpoll}",
array(
'idpoll' => $row['id_poll']
)
);

list ($total) = mysql_fetch_row($request);
$smcFunc['db_free_result']($request);

$request = $smcFunc['db_query']("", "
SELECT id_choice, label, votes
FROM {db_prefix}poll_choices
WHERE id_poll = {int:idpoll}",
array(
'idpoll' => $row['id_poll']
)
);

$options = array();
$total_votes = 0;
while ($rowChoice = mysql_fetch_assoc($request))
{
censorText($rowChoice['label']);

$options[$rowChoice['id_choice']] = array($rowChoice['label'], $rowChoice['votes']);
$total_votes += $rowChoice['votes'];
}
$smcFunc['db_free_result']($request);

$return = array(
'id' => $row['id_poll'],
'image' => empty($pollinfo['voting_locked']) ? 'poll' : 'locked_poll',
'question' => $row['question'],
'total_votes' => $total,
'is_locked' => !empty($pollinfo['voting_locked']),
'allow_vote' => $allow_vote,
'topic' => $topic
);

// Calculate the percentages and bar lengths...
$divisor = $total_votes == 0 ? 1 : $total_votes;
foreach ($options as $i => $option)
{
$bar = floor(($option[1] * 100) / $divisor);
$barWide = $bar == 0 ? 1 : floor(($bar * 5) / 6);
$return['options'][$i] = array(
'id' => 'options-' . $i,
'percent' => $bar,
'votes' => $option[1],
'bar' => '<span style="white-space: nowrap;"><img src="' . $settings['images_url'] . '/poll_left.gif" alt="" /><img src="' . $settings['images_url'] . '/poll_middle.gif" width="' . $barWide . '" height="12" alt="-" /><img src="' . $settings['images_url'] . '/poll_right.gif" alt="" /></span>',
'option' => parse_bbc($option[0]),
'vote_button' => '<input type="' . ($row['max_votes'] > 1 ? 'checkbox' : 'radio') . '" name="options[]" id="options-' . $i . '" value="' . $i . '" class="check" />'
);
}

$return['allowed_warning'] = $row['max_votes'] > 1 ? sprintf($txt['poll_options6'], $row['max_votes']) : '';

if ($output_method != 'echo')
return $return;

if ($return['allow_vote'])
{
echo '
<form action="', $boardurl, '/SSI.php?ssi_function=pollVote" method="post" accept-charset="', $context['character_set'], '">
<input type="hidden" name="poll" value="', $return['id'], '" />
<table border="0" cellspacing="1" cellpadding="0" class="ssi_table">
<tr>
<td colspan="2" class="smalltext"><a href="', $boardurl, '/index.php?topic=', $return['topic'], '"><b>', $return['question'], '</b></a></td>
</tr>
<tr>
<td class="smalltext">', $return['allowed_warning'], '</td>
</tr>';
foreach ($return['options'] as $option)
echo '
<tr>
<td class="smalltext"><label for="', $option['id'], '">', $option['vote_button'], '</td><td class="smalltext">', $option['option'], '</label></td>
</tr>';
echo '
<tr>
<td colspan="2" class="smalltext"><input type="submit" value="Submit Vote" /></td>
</tr>
</table>
<input type="hidden" name="', $context['session_var'], '" value="', $context['session_id'], '" />
</form>';
}
/////////////   /// added code by willyP, per jpdeni:
elseif ($user_info['is_guest'])
{
echo '

<a href="', $boardurl, '/index.php?topic=', $return['topic'], '"><b>', $return['question'], '</b></a><br /><ul>';
foreach ($return['options'] as $option)
echo '
<li>', $option['option'], '</li>';
echo '
</ul>
If you would like to vote in this poll, please <a href="' . $scripturl . '?action=login">login</a> or <a href="' . $scripturl . '?action=register">register</a>.';
}

/////////////end added code by willyP

else
{
echo '
<table border="0" cellspacing="1" cellpadding="0" class="ssi_table">
<tr>
<td colspan="2" class="smalltext"><a href="', $boardurl, '/index.php?topic=', $return['topic'], '"><b>', $return['question'], '</b></a></td>
</tr>';
foreach ($return['options'] as $option)
echo '
<tr>
<td colspan="2" align="left" valign="top" style="font-style: italic" class="smalltext">', $option['option'], '</td>
</tr>
<tr>
<td align="left" class="smalltext">', $option['bar'], '</td>
<td align="left" class="smalltext">', $option['votes'], ' (', $option['percent'], '%)</td>
</tr>';
echo '
<tr>
<td colspan="2" class="smalltext"><b>Total Votes: ', $return['total_votes'], '</b></td>
</tr>
</table>';
}
}

///////////////////////////////////////
// display most recent poll from board number 15
tp_showPoll(null,'echo',15);

tamasir

WillyP
Thanks...code for SMF 2.0
tamasir~

@rjen

Hmmm, just tried to use this code snippet (2.0) in my 2.0.15 test forum, and it breaks completely... does anyone know what's wrong with it?
Running Latest TP on SMF2.1 at: www.fjr-club.nl

tino

There is a hard coded mysql_ in there should be using smcFunc

@rjen

I am looking at the SECOND block of code... that is using smcfunc...
Running Latest TP on SMF2.1 at: www.fjr-club.nl

tino

Quote from: @rjen on November 28, 2018, 07:43:44 PM
I am looking at the SECOND block of code... that is using smcfunc...

No it's not... Well not all the way through.

// Either this topic has no poll, or the user cannot view it.
if (mysql_num_rows($request) == 0)
   return array();

@rjen

Hmm, had not seen that.

It is in there twice..

if (mysql_num_rows($request) == 0)
   return array();

$allow_vote = mysql_num_rows($request) == 0;
$smcFunc['db_free_result']($request);

Can you give the correct code? I am not sure ...
Running Latest TP on SMF2.1 at: www.fjr-club.nl

tino

db_num_rows I think. I'm on my phone so not easy to change

tino

//////////////////////////////////////////////////////////
// Enhanced showPoll block
// Shows poll in block from specified topic,
// or the most recent from specified board
//
// Author:   Greybrow
// Version:   2007-04-24 22:00
// Features:
//   shows poll (or polls) that fits in a block
//         voting or scores (when voted or can't vote)
//   shows question as a topic link
//   shows poll from specified topic
//   shows most recent poll from specified board
//
// based on ssi_showPoll();
// added block hacks by Raysr and Thurnok from:
//    http://tpblocks.ccs-net.com/index.php?topic=25
//    http://tpblocks.ccs-net.com/index.php?topic=40
//
// usage:
// - copy whole code to phpblock.
// - at the end of the code use function
// tp_showPoll(topic number or null, 'echo' or null, board number or null)
// or
// copy the function to SSI.php
// put only the function call in phpblock
//
// examples:
// show the poll from topic 34
// tp_showPoll(34);                     
//
// show the most recent poll from the board number 5
// tp_showPoll(null,'echo',5);           
//
// keep in mind, that if board is specified, topic is ignored
// so it will display the same as above
// tp_showPoll(34,'echo',5)             
//
// put the array with poll from board 5 into $thepoll variable
// $thepoll = tp_showPoll(null,null,5);
//
// if you call the function more than once,
// with different options, block will show more polls
// but I'm not sure if voting would work correctly :(
///////////////////////////////////////////////////////

function tp_showPoll($topic = null, $output_method = 'echo', $board = null)
{
global $db_prefix, $txt, $settings, $boardurl, $sc, $user_info;
global $context, $scripturl, $smcFunc;
///added: , $scripturl
$boardsAllowed = boardsAllowedTo('poll_view');

if (empty($boardsAllowed))
return array();

if ($topic === null && isset($_REQUEST['ssi_topic']))
$topic = (int) $_REQUEST['ssi_topic'];
else
$topic = (int) $topic;

if ($board === null)
{
// board not chosen, so get the one from specified topic
$request = $smcFunc['db_query']("", "
SELECT
p.id_poll, p.question, p.voting_locked, p.hide_results, p.expire_time, p.max_votes, b.id_board
FROM ({db_prefix}topics AS t, {db_prefix}polls AS p, {db_prefix}boards AS b)
WHERE p.id_poll = t.id_poll
AND t.id_topic = {int:topic}
AND b.id_board = t.id_board
AND $user_info[query_see_board]
" . (!in_array(0, $boardsAllowed) ? "
AND b.id_board IN ({array_int:boardsallowed})" : '') . "
LIMIT 1",
array(
'topic' => $topic,
'boardsallowed' => $boardsAllowed,

)
);
}
else
{
// board chosen, so lets try to get the most recent poll from it
$board = (int) $board;
$request = $smcFunc['db_query']("", "
SELECT
p.id_poll, p.question, p.voting_locked, p.hide_results, p.expire_time, p.max_votes, b.id_board, t.id_topic
FROM ({db_prefix}topics AS t, {db_prefix}polls AS p, {db_prefix}boards AS b)
WHERE   p.id_poll = t.id_poll
AND b.id_board = t.id_board
AND b.id_board = {int:board}
AND $user_info[query_see_board]
" . (!in_array(0, $boardsAllowed) ? "
AND {int:board} IN ({array_int:boardsallowed})" : '') . "
ORDER BY p.id_poll DESC
LIMIT 1",
array(
'board' => $board,
'boardsallowed' => $boardsAllowed,
)
);
}

// Either this topic has no poll, or the user cannot view it.
if ($smcFunc['db_num_rows']($request) == 0)
return array();

$row = $smcFunc['db_fetch_assoc']($request);

$smcFunc['db_free_result']($request);

if($topic == 0)
$topic = (int)$row['id_topic'];

// Check if they can vote.
if ((!empty($row['expire_time']) && $row['expire_time'] < time()) || $user_info['is_guest'] || !empty($row['voting_locked']) || !allowedTo('poll_vote', $row['id_board']))
$allow_vote = false;
else
{
$request = $smcFunc['db_query']("", "
SELECT id_member
FROM {db_prefix}log_polls
WHERE id_poll = {int:idpoll}
AND id_member = {int:userinfo}
LIMIT 1",
array(
'idpoll' => $row['id_poll'],
'userinfo' => $user_info['id'],
)
);

$allow_vote = $smcFunc['db_num_rows']($request) == 0;
$smcFunc['db_free_result']($request);
}

$request = $smcFunc['db_query']("", "
SELECT COUNT(DISTINCT id_member)
FROM {db_prefix}log_polls
WHERE id_poll = {int:idpoll}",
array(
'idpoll' => $row['id_poll']
)
);

list ($total) = $smcFunc['db_fetch_row']($request);
$smcFunc['db_free_result']($request);

$request = $smcFunc['db_query']("", "
SELECT id_choice, label, votes
FROM {db_prefix}poll_choices
WHERE id_poll = {int:idpoll}",
array(
'idpoll' => $row['id_poll']
)
);

$options = array();
$total_votes = 0;
while ($rowChoice = $smcFunc['db_fetch_assoc']($request))
{
censorText($rowChoice['label']);

$options[$rowChoice['id_choice']] = array($rowChoice['label'], $rowChoice['votes']);
$total_votes += $rowChoice['votes'];
}
$smcFunc['db_free_result']($request);

$return = array(
'id' => $row['id_poll'],
'image' => empty($pollinfo['voting_locked']) ? 'poll' : 'locked_poll',
'question' => $row['question'],
'total_votes' => $total,
'is_locked' => !empty($pollinfo['voting_locked']),
'allow_vote' => $allow_vote,
'topic' => $topic
);

// Calculate the percentages and bar lengths...
$divisor = $total_votes == 0 ? 1 : $total_votes;
foreach ($options as $i => $option)
{
$bar = floor(($option[1] * 100) / $divisor);
$barWide = $bar == 0 ? 1 : floor(($bar * 5) / 6);
$return['options'][$i] = array(
'id' => 'options-' . $i,
'percent' => $bar,
'votes' => $option[1],
'bar' => '<span style="white-space: nowrap;"><img src="' . $settings['images_url'] . '/poll_left.gif" alt="" /><img src="' . $settings['images_url'] . '/poll_middle.gif" width="' . $barWide . '" height="12" alt="-" /><img src="' . $settings['images_url'] . '/poll_right.gif" alt="" /></span>',
'option' => parse_bbc($option[0]),
'vote_button' => '<input type="' . ($row['max_votes'] > 1 ? 'checkbox' : 'radio') . '" name="options[]" id="options-' . $i . '" value="' . $i . '" class="check" />'
);
}

$return['allowed_warning'] = $row['max_votes'] > 1 ? sprintf($txt['poll_options6'], $row['max_votes']) : '';

if ($output_method != 'echo')
return $return;

if ($return['allow_vote'])
{
echo '
<form action="', $boardurl, '/SSI.php?ssi_function=pollVote" method="post" accept-charset="', $context['character_set'], '">
<input type="hidden" name="poll" value="', $return['id'], '" />
<table border="0" cellspacing="1" cellpadding="0" class="ssi_table">
<tr>
<td colspan="2" class="smalltext"><a href="', $boardurl, '/index.php?topic=', $return['topic'], '"><b>', $return['question'], '</b></a></td>
</tr>
<tr>
<td class="smalltext">', $return['allowed_warning'], '</td>
</tr>';
foreach ($return['options'] as $option)
echo '
<tr>
<td class="smalltext"><label for="', $option['id'], '">', $option['vote_button'], '</td><td class="smalltext">', $option['option'], '</label></td>
</tr>';
echo '
<tr>
<td colspan="2" class="smalltext"><input type="submit" value="Submit Vote" /></td>
</tr>
</table>
<input type="hidden" name="', $context['session_var'], '" value="', $context['session_id'], '" />
</form>';
}
/////////////   /// added code by willyP, per jpdeni:
elseif ($user_info['is_guest'])
{
echo '

<a href="', $boardurl, '/index.php?topic=', $return['topic'], '"><b>', $return['question'], '</b></a><br /><ul>';
foreach ($return['options'] as $option)
echo '
<li>', $option['option'], '</li>';
echo '
</ul>
If you would like to vote in this poll, please <a href="' . $scripturl . '?action=login">login</a> or <a href="' . $scripturl . '?action=register">register</a>.';
}

/////////////end added code by willyP

else
{
echo '
<table border="0" cellspacing="1" cellpadding="0" class="ssi_table">
<tr>
<td colspan="2" class="smalltext"><a href="', $boardurl, '/index.php?topic=', $return['topic'], '"><b>', $return['question'], '</b></a></td>
</tr>';
foreach ($return['options'] as $option)
echo '
<tr>
<td colspan="2" align="left" valign="top" style="font-style: italic" class="smalltext">', $option['option'], '</td>
</tr>
<tr>
<td align="left" class="smalltext">', $option['bar'], '</td>
<td align="left" class="smalltext">', $option['votes'], ' (', $option['percent'], '%)</td>
</tr>';
echo '
<tr>
<td colspan="2" class="smalltext"><b>Total Votes: ', $return['total_votes'], '</b></td>
</tr>
</table>';
}
}

///////////////////////////////////////
// display most recent poll from board number 15
tp_showPoll(null,'echo',15);


wildenborch

I can confirm that this code is working