X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=plugins%2FPoll%2FPollPlugin.php;h=53a491ef4776918d27ae6db14848bcc95d06c37e;hb=871912a00a3e627569ac65111d55b47f5d8ccedf;hp=ea6ab9ecd99170a13eeee02191748454975162e5;hpb=2f8b7f3dea4ce589cc7ab00ecd9f0104e518cfd2;p=quix0rs-gnu-social.git diff --git a/plugins/Poll/PollPlugin.php b/plugins/Poll/PollPlugin.php index ea6ab9ecd9..53a491ef47 100644 --- a/plugins/Poll/PollPlugin.php +++ b/plugins/Poll/PollPlugin.php @@ -51,6 +51,8 @@ class PollPlugin extends MicroAppPlugin const POLL_OBJECT = 'http://activityschema.org/object/poll'; const POLL_RESPONSE_OBJECT = 'http://activityschema.org/object/poll-response'; + var $oldSaveNew = true; + /** * Database schema setup * @@ -64,6 +66,7 @@ class PollPlugin extends MicroAppPlugin $schema = Schema::get(); $schema->ensureTable('poll', Poll::schemaDef()); $schema->ensureTable('poll_response', Poll_response::schemaDef()); + $schema->ensureTable('user_poll_prefs', User_poll_prefs::schemaDef()); return true; } @@ -76,50 +79,18 @@ class PollPlugin extends MicroAppPlugin */ function onEndShowStyles($action) { - $action->cssLink($this->path('poll.css')); + $action->cssLink($this->path('css/poll.css')); return true; } - /** - * Load related modules when needed - * - * @param string $cls Name of the class to be loaded - * - * @return boolean hook value; true means continue processing, false means stop. - */ - function onAutoload($cls) - { - $dir = dirname(__FILE__); - - switch ($cls) - { - case 'ShowpollAction': - case 'NewpollAction': - case 'RespondpollAction': - include_once $dir . '/' . strtolower(mb_substr($cls, 0, -6)) . '.php'; - return false; - case 'Poll': - case 'Poll_response': - include_once $dir.'/'.$cls.'.php'; - return false; - case 'NewPollForm': - case 'PollResponseForm': - case 'PollResultForm': - include_once $dir.'/'.strtolower($cls).'.php'; - return false; - default: - return true; - } - } - /** * Map URLs to actions * - * @param Net_URL_Mapper $m path-to-action mapper + * @param URLMapper $m path-to-action mapper * * @return boolean hook value; true means continue processing, false means stop. */ - function onRouterInitialized($m) + public function onRouterInitialized(URLMapper $m) { $m->connect('main/poll/new', array('action' => 'newpoll')); @@ -136,6 +107,9 @@ class PollPlugin extends MicroAppPlugin array('action' => 'respondpoll'), array('id' => '[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}')); + $m->connect('settings/poll', + array('action' => 'pollsettings')); + return true; } @@ -146,7 +120,7 @@ class PollPlugin extends MicroAppPlugin * * @return value */ - function onPluginVersion(&$versions) + function onPluginVersion(array &$versions) { $versions[] = array('name' => 'Poll', 'version' => self::VERSION, @@ -170,7 +144,7 @@ class PollPlugin extends MicroAppPlugin * * @return boolean hook value */ - function deleteRelated($notice) + function deleteRelated(Notice $notice) { $p = Poll::getByNotice($notice); @@ -190,7 +164,7 @@ class PollPlugin extends MicroAppPlugin * * @return Notice resulting notice */ - function saveNoticeFromActivity($activity, $profile, $options=array()) + function saveNoticeFromActivity(Activity $activity, Profile $profile, array $options=array()) { // @fixme common_log(LOG_DEBUG, "XXX activity: " . var_export($activity, true)); @@ -227,12 +201,12 @@ class PollPlugin extends MicroAppPlugin if (!$pollUri) { // TRANS: Exception thrown trying to respond to a poll without a poll reference. - throw new Exception(_m('Invalid poll response: no poll reference.')); + throw new Exception(_m('Invalid poll response: No poll reference.')); } - $poll = Poll::staticGet('uri', $pollUri); + $poll = Poll::getKV('uri', $pollUri); if (!$poll) { // TRANS: Exception thrown trying to respond to a non-existing poll. - throw new Exception(_m('Invalid poll response: poll is unknown.')); + throw new Exception(_m('Invalid poll response: Poll is unknown.')); } try { $notice = Poll_response::saveNew($profile, $poll, $selection, $options); @@ -247,7 +221,7 @@ class PollPlugin extends MicroAppPlugin } } - function activityObjectFromNotice($notice) + function activityObjectFromNotice(Notice $notice) { assert($this->isMyNotice($notice)); @@ -258,19 +232,19 @@ class PollPlugin extends MicroAppPlugin return $this->activityObjectFromNoticePollResponse($notice); default: // TRANS: Exception thrown when performing an unexpected action on a poll. - // TRANS: %s is the unpexpected object type. + // TRANS: %s is the unexpected object type. throw new Exception(sprintf(_m('Unexpected type for poll plugin: %s.'), $notice->object_type)); } } - function activityObjectFromNoticePollResponse($notice) + function activityObjectFromNoticePollResponse(Notice $notice) { $object = new ActivityObject(); $object->id = $notice->uri; - $object->type = self::POLL_OBJECT; + $object->type = self::POLL_RESPONSE_OBJECT; $object->title = $notice->content; $object->summary = $notice->content; - $object->link = $notice->bestUrl(); + $object->link = $notice->getUrl(); $response = Poll_response::getByNotice($notice); if ($response) { @@ -286,14 +260,14 @@ class PollPlugin extends MicroAppPlugin return $object; } - function activityObjectFromNoticePoll($notice) + function activityObjectFromNoticePoll(Notice $notice) { $object = new ActivityObject(); $object->id = $notice->uri; - $object->type = self::POLL_RESPONSE_OBJECT; + $object->type = self::POLL_OBJECT; $object->title = $notice->content; $object->summary = $notice->content; - $object->link = $notice->bestUrl(); + $object->link = $notice->getUrl(); $poll = Poll::getByNotice($notice); if ($poll) { @@ -401,83 +375,92 @@ class PollPlugin extends MicroAppPlugin } } + function entryForm($out) + { + return new NewPollForm($out); + } - /** - * @fixme WARNING WARNING WARNING parent class closes the final div that we - * open here, but we probably shouldn't open it here. Check parent class - * and Bookmark plugin for if that's right. - */ - function showNotice($notice, $out) + // @fixme is this from parent? + function tag() { - switch ($notice->object_type) { - case self::POLL_OBJECT: - return $this->showNoticePoll($notice, $out); - case self::POLL_RESPONSE_OBJECT: - return $this->showNoticePollResponse($notice, $out); - default: - // TRANS: Exception thrown when performing an unexpected action on a poll. - // TRANS: %s is the unpexpected object type. - throw new Exception(sprintf(_m('Unexpected type for poll plugin: %s.'), $notice->object_type)); - } + return 'poll'; } - function showNoticePoll($notice, $out) + function appTitle() { - $user = common_current_user(); + // TRANS: Application title. + return _m('APPTITLE','Poll'); + } - // @hack we want regular rendering, then just add stuff after that - $nli = new NoticeListItem($notice, $out); - $nli->showNotice(); + function onStartAddNoticeReply($nli, $parent, $child) + { + // Filter out any poll responses + if ($parent->object_type == self::POLL_OBJECT && + $child->object_type == self::POLL_RESPONSE_OBJECT) { + return false; + } + return true; + } - $out->elementStart('div', array('class' => 'entry-content poll-content')); - $poll = Poll::getByNotice($notice); - if ($poll) { - if ($user) { - $profile = $user->getProfile(); - $response = $poll->getResponse($profile); - if ($response) { - // User has already responded; show the results. - $form = new PollResultForm($poll, $out); - } else { - $form = new PollResponseForm($poll, $out); + // Hide poll responses for @chuck + + function onEndNoticeWhoGets($notice, &$ni) { + if ($notice->object_type == self::POLL_RESPONSE_OBJECT) { + foreach ($ni as $id => $source) { + $user = User::getKV('id', $id); + if (!empty($user)) { + $pollPrefs = User_poll_prefs::getKV('user_id', $user->id); + if (!empty($pollPrefs) && ($pollPrefs->hide_responses)) { + unset($ni[$id]); + } } - $form->show(); } - } else { - $out->text(_('Poll data is missing')); } - $out->elementEnd('div'); - - // @fixme - $out->elementStart('div', array('class' => 'entry-content')); + return true; } - function showNoticePollResponse($notice, $out) + /** + * Menu item for personal subscriptions/groups area + * + * @param Action $action action being executed + * + * @return boolean hook return + */ + + function onEndAccountSettingsNav($action) { - $user = common_current_user(); + $action_name = $action->trimmed('action'); - // @hack we want regular rendering, then just add stuff after that - $nli = new NoticeListItem($notice, $out); - $nli->showNotice(); + $action->menuItem(common_local_url('pollsettings'), + // TRANS: Poll plugin menu item on user settings page. + _m('MENU', 'Polls'), + // TRANS: Poll plugin tooltip for user settings menu item. + _m('Configure poll behavior'), + $action_name === 'pollsettings'); - // @fixme - $out->elementStart('div', array('class' => 'entry-content')); - } - - function entryForm($out) - { - return new NewPollForm($out); + return true; } - // @fixme is this from parent? - function tag() + protected function showNoticeContent(Notice $stored, HTMLOutputter $out, Profile $scoped=null) { - return 'poll'; - } + if ($stored->object_type == self::POLL_RESPONSE_OBJECT) { + parent::showNoticeContent($stored, $out, $scoped); + return; + } - function appTitle() - { - // TRANS: Application title. - return _m('APPTITLE','Poll'); + // If the stored notice is a POLL_OBJECT + $poll = Poll::getByNotice($stored); + if ($poll instanceof Poll) { + if (!$scoped instanceof Profile || $poll->getResponse($scoped) instanceof Poll_response) { + // Either the user is not logged in or it has already responded; show the results. + $form = new PollResultForm($poll, $out); + } else { + $form = new PollResponseForm($poll, $out); + } + $form->show(); + } else { + // TRANS: Error text displayed if no poll data could be found. + $out->text(_m('Poll data is missing')); + } } }