function countResponses() { $pr = new Poll_response(); $pr->poll_id = $this->id; $pr->groupBy('selection'); $pr->selectAdd('count(profile_id) as votes'); $pr->find(); $raw = array(); while ($pr->fetch()) { // Votes list 1-based // Array stores 0-based $raw[$pr->selection - 1] = $pr->votes; } $counts = array(); foreach (array_keys($this->getOptions()) as $key) { if (isset($raw[$key])) { $counts[$key] = $raw[$key]; } else { $counts[$key] = 0; } } return $counts; }
function activityObjectFromNoticePollResponse(Notice $notice) { $object = new ActivityObject(); $object->id = $notice->uri; $object->type = self::POLL_RESPONSE_OBJECT; $object->title = $notice->content; $object->summary = $notice->content; $object->link = $notice->getUrl(); $response = Poll_response::getByNotice($notice); if ($response) { $poll = $response->getPoll(); if ($poll) { // Stash data to be formatted later by // $this->activityObjectOutputAtom() or // $this->activityObjectOutputJson()... $object->pollSelection = intval($response->selection); $object->pollUri = $poll->uri; } } return $object; }
/** * Save a new poll notice * * @param Profile $profile * @param Poll $poll the poll being responded to * @param int $selection (1-based) * @param array $opts (poll responses) * * @return Notice saved notice */ static function saveNew($profile, $poll, $selection, $options = null) { if (empty($options)) { $options = array(); } if (!$poll->isValidSelection($selection)) { // TRANS: Client exception thrown when responding to a poll with an invalid option. throw new ClientException(_m('Invalid poll selection.')); } $opts = $poll->getOptions(); $answer = $opts[$selection - 1]; $pr = new Poll_response(); $pr->id = UUID::gen(); $pr->profile_id = $profile->id; $pr->poll_id = $poll->id; $pr->selection = $selection; if (array_key_exists('created', $options)) { $pr->created = $options['created']; } else { $pr->created = common_sql_now(); } if (array_key_exists('uri', $options)) { $pr->uri = $options['uri']; } else { $pr->uri = common_local_url('showpollresponse', array('id' => $pr->id)); } common_log(LOG_DEBUG, "Saving poll response: {$pr->id} {$pr->uri}"); $pr->insert(); // TRANS: Notice content voting for a poll. // TRANS: %s is the chosen option in the poll. $content = sprintf(_m('voted for "%s"'), $answer); $link = '<a href="' . htmlspecialchars($poll->uri) . '">' . htmlspecialchars($answer) . '</a>'; // TRANS: Rendered version of the notice content voting for a poll. // TRANS: %s a link to the poll with the chosen option as link description. $rendered = sprintf(_m('voted for "%s"'), $link); $tags = array(); $options = array_merge(array('urls' => array(), 'rendered' => $rendered, 'tags' => $tags, 'reply_to' => $poll->getNotice()->id, 'object_type' => PollPlugin::POLL_RESPONSE_OBJECT), $options); if (!array_key_exists('uri', $options)) { $options['uri'] = $pr->uri; } $saved = Notice::saveNew($profile->id, $content, array_key_exists('source', $options) ? $options['source'] : 'web', $options); return $saved; }
/** * Add a new Poll * * @return void */ function respondPoll() { try { $notice = Poll_response::saveNew($this->user->getProfile(), $this->poll, $this->selection); } catch (ClientException $ce) { $this->error = $ce->getMessage(); $this->showPage(); return; } if ($this->boolean('ajax')) { $this->startHTML('text/xml;charset=utf-8'); $this->elementStart('head'); // TRANS: Page title after sending a poll response. $this->element('title', null, _m('Poll results')); $this->elementEnd('head'); $this->elementStart('body'); $form = new PollResultForm($this->poll, $this); $form->show(); $this->elementEnd('body'); $this->endHTML(); } else { common_redirect($this->poll->getUrl(), 303); } }