function wfPollVote( $pollID, $choiceID ) {
	global $wgUser;

	$p = new Poll();
	if( !$p->userVoted( $wgUser->getName(), $pollID ) ) {
		$p->addPollVote( $pollID, $choiceID );
	}
	return 'OK';
}
Esempio n. 2
0
    /**
     * Called on every poll page view.
     */
    public function view()
    {
        global $wgUser, $wgTitle, $wgOut, $wgRequest, $wgScriptPath, $wgUploadPath, $wgLang;
        global $wgSupressPageTitle, $wgNameSpacesWithEditMenu;
        // Perform no custom handling if the poll in question has been deleted
        if (!$this->getID()) {
            parent::view();
        }
        $wgSupressPageTitle = true;
        $wgOut->setHTMLTitle($wgTitle->getText());
        $wgOut->setPageTitle($wgTitle->getText());
        $wgNameSpacesWithEditMenu[] = NS_POLL;
        $wgOut->addScript("<script type=\"text/javascript\">\n\t\t\t\$( function() { LightBox.init(); PollNY.show(); } );\n\t\t</script>\n");
        $createPollObj = SpecialPage::getTitleFor('CreatePoll');
        $wgOut->addHTML("<script type=\"text/javascript\">\n\t\t\tvar _POLL_OPEN_MESSAGE = \"" . addslashes(wfMsg('poll-open-message')) . "\";\n\t\t\tvar _POLL_CLOSE_MESSAGE = \"" . addslashes(wfMsg('poll-close-message')) . "\";\n\t\t\tvar _POLL_FLAGGED_MESSAGE = \"" . addslashes(wfMsg('poll-flagged-message')) . "\";\n\t\t\tvar _POLL_FINISHED = \"" . addslashes(wfMsg('poll-finished', $createPollObj->getFullURL(), $wgTitle->getFullURL())) . "\";\n\t\t</script>");
        // Get total polls count so we can tell the user how many they have
        // voted for out of total
        $dbr = wfGetDB(DB_MASTER);
        $total_polls = 0;
        $s = $dbr->selectRow('poll_question', array('COUNT(*) AS count'), array(), __METHOD__);
        if ($s !== false) {
            $total_polls = number_format($s->count);
        }
        $stats = new UserStats($wgUser->getID(), $wgUser->getName());
        $stats_current_user = $stats->getUserStats();
        $sk = $wgUser->getSkin();
        $p = new Poll();
        $poll_info = $p->getPoll($wgTitle->getArticleID());
        if (!isset($poll_info['id'])) {
            return '';
        }
        // Set up submitter data
        $user_title = Title::makeTitle(NS_USER, $poll_info['user_name']);
        $avatar = new wAvatar($poll_info['user_id'], 'l');
        $avatarID = $avatar->getAvatarImage();
        $stats = new UserStats($poll_info['user_id'], $poll_info['user_name']);
        $stats_data = $stats->getUserStats();
        $user_name_short = $wgLang->truncate($poll_info['user_name'], 27);
        $output = '<div class="poll-right">';
        // Show the "create a poll" link to registered users
        if ($wgUser->isLoggedIn()) {
            $output .= '<div class="create-link">
				<a href="' . $createPollObj->escapeFullURL() . '">
					<img src="' . $wgScriptPath . '/extensions/PollNY/images/addIcon.gif" alt="" />' . wfMsg('poll-create') . '</a>
			</div>';
        }
        $output .= '<div class="credit-box">
					<h1>' . wfMsg('poll-submitted-by') . "</h1>\n\t\t\t\t\t<div class=\"submitted-by-image\">\n\t\t\t\t\t\t<a href=\"{$user_title->getFullURL()}\">\n\t\t\t\t\t\t\t<img src=\"{$wgUploadPath}/avatars/{$avatarID}\" style=\"border:1px solid #d7dee8; width:50px; height:50px;\"/>\n\t\t\t\t\t\t</a>\n\t\t\t\t\t</div>\n\t\t\t\t\t<div class=\"submitted-by-user\">\n\t\t\t\t\t\t<a href=\"{$user_title->getFullURL()}\">{$user_name_short}</a>\n\t\t\t\t\t\t<ul>\n\t\t\t\t\t\t\t<li>\n\t\t\t\t\t\t\t\t<img src=\"{$wgScriptPath}/extensions/PollNY/images/voteIcon.gif\" alt=\"\" />\n\t\t\t\t\t\t\t\t{$stats_data['votes']}\n\t\t\t\t\t\t\t</li>\n\t\t\t\t\t\t\t<li>\n\t\t\t\t\t\t\t\t<img src=\"{$wgScriptPath}/extensions/PollNY/images/pencilIcon.gif\" alt=\"\" />\n\t\t\t\t\t\t\t\t{$stats_data['edits']}\n\t\t\t\t\t\t\t</li>\n\t\t\t\t\t\t\t<li>\n\t\t\t\t\t\t\t\t<img src=\"{$wgScriptPath}/extensions/PollNY/images/commentsIcon.gif\" alt=\"\" />\n\t\t\t\t\t\t\t\t{$stats_data['comments']}\n\t\t\t\t\t\t\t</li>\n\t\t\t\t\t\t</ul>\n\t\t\t\t\t</div>\n\t\t\t\t\t<div class=\"cleared\"></div>\n\n\t\t\t\t\t<a href=\"" . SpecialPage::getTitleFor('ViewPoll')->escapeFullURL('user='******'user_name']) . '">' . wfMsgExt('poll-view-all-by', 'parsemag', $user_name_short) . '</a>

				</div>';
        $output .= '<div class="poll-stats">';
        if ($wgUser->isLoggedIn()) {
            $output .= wfMsgExt('poll-voted-for', 'parsemag', '<b>' . $stats_current_user['poll_votes'] . '</b>', $total_polls, number_format($stats_current_user['poll_votes'] * 5));
        } else {
            $output .= wfMsgExt('poll-would-have-earned', 'parse', number_format($total_polls * 5));
        }
        $output .= '</div>' . "\n";
        $toggle_flag_label = $poll_info['status'] == 1 ? wfMsg('poll-flag-poll') : wfMsg('poll-unflag-poll');
        $toggle_flag_status = $poll_info['status'] == 1 ? 2 : 1;
        if ($poll_info['status'] == 1) {
            // Creator and admins can change the status of a poll
            $toggle_label = $poll_info['status'] == 1 ? wfMsg('poll-close-poll') : wfMsg('poll-open-poll');
            $toggle_status = $poll_info['status'] == 1 ? 0 : 1;
        }
        $output .= '<div class="poll-links">' . "\n";
        // Poll administrators can access the poll admin panel
        if ($wgUser->isAllowed('polladmin')) {
            $output .= '<a href="' . SpecialPage::getTitleFor('AdminPoll')->escapeFullURL() . '">' . wfMsg('poll-admin-panel') . '</a> | ';
        }
        if ($poll_info['status'] == 1 && ($poll_info['user_id'] == $wgUser->getID() || $wgUser->isAllowed('polladmin'))) {
            $output .= "<a href=\"javascript:void(0)\" onclick=\"PollNY.toggleStatus({$toggle_status});\">{$toggle_label}</a> |";
        }
        if ($poll_info['status'] == 1 || $wgUser->isAllowed('polladmin')) {
            $output .= " <a href=\"javascript:void(0)\" onclick=\"PollNY.toggleStatus({$toggle_flag_status});\">{$toggle_flag_label}</a>";
        }
        $output .= "\n" . '</div>' . "\n";
        // .poll-links
        $output .= '</div>' . "\n";
        // .poll-right
        $output .= '<div class="poll">' . "\n";
        $output .= "<h1 class=\"pagetitle\">{$wgTitle->getText()}</h1>\n";
        if ($poll_info['image']) {
            $poll_image_width = 150;
            $poll_image = wfFindFile($poll_info['image']);
            $poll_image_url = $width = '';
            if (is_object($poll_image)) {
                $poll_image_url = $poll_image->createThumb($poll_image_width);
                if ($poll_image->getWidth() >= $poll_image_width) {
                    $width = $poll_image_width;
                } else {
                    $width = $poll_image->getWidth();
                }
            }
            $poll_image_tag = '<img width="' . $width . '" alt="" src="' . $poll_image_url . '"/>';
            $output .= "<div class=\"poll-image\">{$poll_image_tag}</div>";
        }
        // Display question and let user vote
        if (!$p->userVoted($wgUser->getName(), $poll_info['id']) && $poll_info['status'] == 1) {
            $output .= '<div id="loading-poll">' . wfMsg('poll-js-loading') . '</div>' . "\n";
            $output .= '<div id="poll-display" style="display:none;">' . "\n";
            $output .= '<form name="poll"><input type="hidden" id="poll_id" name="poll_id" value="' . $poll_info['id'] . '"/>' . "\n";
            foreach ($poll_info['choices'] as $choice) {
                $output .= '<div class="poll-choice">
					<input type="radio" name="poll_choice" onclick="PollNY.vote()" id="poll_choice" value="' . $choice['id'] . '" />' . $choice['choice'] . '</div>';
            }
            $output .= '</form>
					</div>' . "\n";
            $output .= '<div class="poll-timestamp">' . wfMsg('poll-createdago', Poll::getTimeAgo($poll_info['timestamp'])) . '</div>' . "\n";
            $output .= "\t\t\t\t\t" . '<div class="poll-button">
					<a href="javascript:PollNY.skip();">' . wfMsg('poll-skip') . '</a>
				</div>';
            if ($wgRequest->getInt('prev_id')) {
                $p = new Poll();
                $poll_info_prev = $p->getPoll($wgRequest->getInt('prev_id'));
                $poll_title = Title::makeTitle(NS_POLL, $poll_info_prev['question']);
                $output .= '<div class="previous-poll">';
                $output .= '<div class="previous-poll-title">' . wfMsg('poll-previous-poll') . " - <a href=\"{$poll_title->getFullURL()}\">{$poll_info_prev['question']}</a></div>\n\t\t\t\t\t<div class=\"previous-sub-title\">" . wfMsgExt('poll-view-answered-times', 'parsemag', $poll_info_prev['votes']) . '</div>';
                $x = 1;
                foreach ($poll_info_prev['choices'] as $choice) {
                    if ($poll_info_prev['votes'] > 0) {
                        $percent = round($choice['votes'] / $poll_info_prev['votes'] * 100);
                        $bar_width = floor(360 * ($choice['votes'] / $poll_info_prev['votes']));
                    } else {
                        $percent = 0;
                        $bar_width = 0;
                    }
                    if (empty($choice['votes'])) {
                        $choice['votes'] = 0;
                    }
                    $bar_img = '<img src="' . $wgScriptPath . '/extensions/PollNY/images/vote-bar-' . $x . '.gif" class="image-choice-' . $x . '" style="width:' . $bar_width . 'px;height:11px;"/>';
                    $output .= "<div class=\"previous-poll-choice\">\n\t\t\t\t\t\t\t\t<div class=\"previous-poll-choice-left\">{$choice['choice']} ({$percent}%)</div>";
                    $output .= "<div class=\"previous-poll-choice-right\">{$bar_img} <span class=\"previous-poll-choice-votes\">" . wfMsgExt('poll-votes', 'parsemag', $choice['votes']) . '</span></div>';
                    $output .= '</div>';
                    $x++;
                }
                $output .= '</div>';
            }
        } else {
            $show_results = true;
            // Display message if poll has been closed for voting
            if ($poll_info['status'] == 0) {
                $output .= '<div class="poll-closed">' . wfMsg('poll-closed') . '</div>';
            }
            // Display message if poll has been flagged
            if ($poll_info['status'] == 2) {
                $output .= '<div class="poll-closed">' . wfMsg('poll-flagged') . '</div>';
                if (!$wgUser->isAllowed('polladmin')) {
                    $show_results = false;
                }
            }
            if ($show_results) {
                $x = 1;
                foreach ($poll_info['choices'] as $choice) {
                    if ($poll_info['votes'] > 0) {
                        $percent = round($choice['votes'] / $poll_info['votes'] * 100);
                        $bar_width = floor(480 * ($choice['votes'] / $poll_info['votes']));
                    } else {
                        $percent = 0;
                        $bar_width = 0;
                    }
                    // If it's not set, it means that no-one has voted for that
                    // choice yet...it also means that we need to set it
                    // manually here so that i18n displays properly
                    if (empty($choice['votes'])) {
                        $choice['votes'] = 0;
                    }
                    $bar_img = "<img src=\"{$wgScriptPath}/extensions/PollNY/images/vote-bar-{$x}.gif\" class=\"image-choice-{$x}\" style=\"width:{$bar_width}px;height:12px;\"/>";
                    $output .= "<div class=\"poll-choice\">\n\t\t\t\t\t<div class=\"poll-choice-left\">{$choice['choice']} ({$percent}%)</div>";
                    $output .= "<div class=\"poll-choice-right\">{$bar_img} <span class=\"poll-choice-votes\">" . wfMsgExt('poll-votes', 'parsemag', $choice['votes']) . '</span></div>';
                    $output .= '</div>';
                    $x++;
                }
            }
            $output .= '<div class="poll-total-votes">(' . wfMsgExt('poll-based-on-votes', 'parsemag', $poll_info['votes']) . ')</div>
			<div class="poll-timestamp">' . wfMsg('poll-createdago', Poll::getTimeAgo($poll_info['timestamp'])) . '</div>


			<div class="poll-button">
				<input type="hidden" id="poll_id" name="poll_id" value="' . $poll_info['id'] . '" />
				<a href="javascript:PollNY.loadingLightBox();PollNY.goToNewPoll();">' . wfMsg('poll-next-poll') . '</a>
			</div>';
        }
        // "Embed this on a wiki page" feature
        $poll_embed_name = htmlspecialchars($wgTitle->getText(), ENT_QUOTES);
        $output .= '<br />
			<table cellpadding="0" cellspacing="2" border="0">
				<tr>
					<td>
						<b>' . wfMsg('poll-embed') . "</b>\n\t\t\t\t\t</td>\n\t\t\t\t\t<td>\n\t\t\t\t\t\t<form name=\"embed_poll\">\n\t\t\t\t\t\t\t<input name='embed_code' style='width:300px;font-size:10px;' type='text' value='<pollembed title=\"{$poll_embed_name}\" />' onclick='javascript:document.embed_poll.embed_code.focus();document.embed_poll.embed_code.select();' readonly='readonly' />\n\t\t\t\t\t\t</form>\n\t\t\t\t\t</td>\n\t\t\t\t</tr>\n\t\t\t</table>\n";
        $output .= '</div>' . "\n";
        // .poll
        $output .= '<div class="cleared"></div>';
        $wgOut->addHTML($output);
        global $wgPollDisplay;
        if ($wgPollDisplay['comments']) {
            $wgOut->addWikiText('<comments/>');
        }
    }
Esempio n. 3
0
    /**
     * Callback function for the <pollembed> tag.
     *
     * @param $input Mixed: user input
     * @param $args Array: arguments supplied to the pollembed tag
     * @param $parser Object: instance of Parser class
     * @return HTML or nothing
     */
    public static function renderEmbedPoll($input, $args, $parser)
    {
        $poll_name = $args['title'];
        if ($poll_name) {
            global $wgOut, $wgUser, $wgScriptPath;
            // Load CSS for non-Monaco skins - Monaco's ny.css already contains
            // PollNY's styles (and more)
            if (get_class($wgUser->getSkin()) !== 'SkinMonaco') {
                $wgOut->addExtensionStyle($wgScriptPath . '/extensions/PollNY/Poll.css');
            }
            // Disable caching; this is important so that we don't cause subtle
            // bugs that are a bitch to fix.
            $wgOut->enableClientCache(false);
            $parser->disableCache();
            $poll_title = Title::newFromText($poll_name, NS_POLL);
            $poll_title = PollNYHooks::followPollID($poll_title);
            $poll_page_id = $poll_title->getArticleID();
            if ($poll_page_id > 0) {
                $p = new Poll();
                $poll_info = $p->getPoll($poll_page_id);
                $output = "\t\t" . '<div class="poll-embed-title">' . $poll_info['question'] . '</div>' . "\n";
                if ($poll_info['image']) {
                    $poll_image_width = 100;
                    $poll_image = wfFindFile($poll_info['image']);
                    $width = $poll_image_url = '';
                    if (is_object($poll_image)) {
                        $poll_image_url = $poll_image->createThumb($poll_image_width);
                        if ($poll_image->getWidth() >= $poll_image_width) {
                            $width = $poll_image_width;
                        } else {
                            $width = $poll_image->getWidth();
                        }
                    }
                    $poll_image_tag = '<img width="' . $width . '" alt="" src="' . $poll_image_url . '" />';
                    $output .= "\t\t<div class=\"poll-image\">{$poll_image_tag}</div>\n";
                }
                // If the user hasn't voted for this poll yet and the poll is open
                // for votes, display the question and let the user vote
                if (!$p->userVoted($wgUser->getName(), $poll_info['id']) && $poll_info['status'] == 1) {
                    $wgOut->addScriptFile($wgScriptPath . '/extensions/PollNY/Poll.js');
                    $wgOut->addScript("<script type=\"text/javascript\">\$( function() { PollNY.showEmbedPoll({$poll_info['id']}); } );</script>\n");
                    $output .= "<div id=\"loading-poll_{$poll_info['id']}\">" . wfMsg('poll-js-loading') . '</div>';
                    $output .= "<div id=\"poll-display_{$poll_info['id']}\" style=\"display:none;\">";
                    $output .= "<form name=\"poll_{$poll_info['id']}\"><input type=\"hidden\" id=\"poll_id_{$poll_info['id']}\" name=\"poll_id_{$poll_info['id']}\" value=\"{$poll_info['id']}\"/>";
                    foreach ($poll_info['choices'] as $choice) {
                        $output .= "<div class=\"poll-choice\">\n\t\t\t\t\t\t<input type=\"radio\" name=\"poll_choice\" onclick=\"PollNY.pollEmbedVote({$poll_info['id']}, {$poll_page_id})\" id=\"poll_choice\" value=\"{$choice['id']}\">{$choice['choice']}\n\t\t\t\t\t\t</div>";
                    }
                    $output .= '</div>
					</form>';
                } else {
                    // Display message if poll has been closed for voting
                    if ($poll_info['status'] == 0) {
                        $output .= '<div class="poll-closed">' . wfMsg('poll-closed') . '</div>';
                    }
                    $x = 1;
                    foreach ($poll_info['choices'] as $choice) {
                        //$percent = round( $choice['votes'] / $poll_info['votes'] * 100 );
                        if ($poll_info['votes'] > 0) {
                            $bar_width = floor(480 * ($choice['votes'] / $poll_info['votes']));
                        }
                        $bar_img = "<img src=\"{$wgScriptPath}/extensions/PollNY/images/vote-bar-{$x}.gif\" border=\"0\" class=\"image-choice-{$x}\" style=\"width:{$choice['percent']}%;height:12px;\" alt=\"\" />";
                        $output .= "<div class=\"poll-choice\">\n\t\t\t\t\t\t<div class=\"poll-choice-left\">{$choice['choice']} ({$choice['percent']}%)</div>";
                        // If the amount of votes is not set, set it to 0
                        // This fixes an odd bug where "votes" would be shown
                        // instead of "0 votes" when using the pollembed tag.
                        if (empty($choice['votes'])) {
                            $choice['votes'] = 0;
                        }
                        $output .= "<div class=\"poll-choice-right\">{$bar_img} <span class=\"poll-choice-votes\">" . wfMsgExt('poll-votes', 'parsemag', $choice['votes']) . '</span></div>';
                        $output .= '</div>';
                        $x++;
                    }
                    $output .= '<div class="poll-total-votes">(' . wfMsgExt('poll-based-on-votes', 'parsemag', $poll_info['votes']) . ')</div>';
                    $output .= '<div><a href="' . $poll_title->escapeFullURL() . '">' . wfMsg('poll-discuss') . '</a></div>';
                    $output .= '<div class="poll-timestamp">' . wfMsg('poll-createdago', Poll::getTimeAgo($poll_info['timestamp'])) . '</div>';
                }
                return $output;
            } else {
                // Poll doesn't exist or is unavailable for some other reason
                $output = '<div class="poll-embed-title">' . wfMsg('poll-unavailable') . '</div>';
                return $output;
            }
        }
        return '';
    }