Commit f69f7133 authored by mmn's avatar mmn

PollListItem freed from noticeListItemAdapter clutches

In the future, use events for formatting microapp notices, more specifically
through the plugin's function "showNoticeContent" or similar, which is called
from MicroAppPlugin, which is extended from ActivityHandlerPlugin.
parent fe92d7cf
......@@ -606,7 +606,12 @@ abstract class ActivityHandlerPlugin extends Plugin
return true;
}
$out->text($stored->getContent());
$this->showNoticeContent($stored, $out, $scoped);
return false;
}
protected function showNoticeContent(Notice $stored, HTMLOutputter $out, Profile $scoped=null)
{
$out->text($stored->getContent());
}
}
......@@ -97,11 +97,10 @@ abstract class MicroAppPlugin extends ActivityHandlerPlugin
return true;
}
$adapter = $this->adaptNoticeListItem($nli);
if (empty($adapter)) {
throw new ServerException('Could not adapt NoticeListItem');
}
// Legacy use was creating a "NoticeListItemAdapter", but
// nowadays we solve that using event handling for microapps.
// This section will remain until all plugins are fixed.
$adapter = $this->adaptNoticeListItem($nli) ?: $nli;
$adapter->showNotice();
$adapter->showNoticeAttachments();
......
......@@ -137,11 +137,6 @@ class PollPlugin extends MicroAppPlugin
return array(self::POLL_OBJECT, self::POLL_RESPONSE_OBJECT);
}
function adaptNoticeListItem($nli) {
return new PollListItem($nli);
}
/**
* When a notice is deleted, delete the related Poll
*
......@@ -445,4 +440,31 @@ class PollPlugin extends MicroAppPlugin
return true;
}
protected function showNoticeContent(Notice $stored, HTMLOutputter $out, Profile $scoped=null)
{
if ($stored->object_type == self::POLL_RESPONSE_OBJECT) {
parent::showNoticeContent($stored, $out, $scoped);
return;
}
// If the stored notice is a POLL_OBJECT
$poll = Poll::getByNotice($stored);
if ($poll instanceof Poll and $scoped instanceof Profile) {
$response = $poll->getResponse($scoped);
if ($response instanceof Poll_response) {
// User has already responded; show the results.
$form = new PollResultForm($poll, $out);
} else {
$form = new PollResponseForm($poll, $out);
}
$form->show();
} elseif (!$scoped instanceof Profile) {
// TRANS: No current user's profile, so we can't take a reply.
$out->text(_m('You must be logged in to respond to this poll.'));
} else {
// TRANS: Error text displayed if no poll data could be found.
$out->text(_m('Poll data is missing'));
}
}
}
<?php
/**
* StatusNet - the distributed open-source microblogging tool
* Copyright (C) 2011, StatusNet, Inc.
*
* Adapter to show polls in a nicer way
*
* PHP version 5
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
* @category Poll
* @package StatusNet
* @author Evan Prodromou <evan@status.net>
* @copyright 2011 StatusNet, Inc.
* @license http://www.fsf.org/licensing/licenses/agpl-3.0.html AGPL 3.0
* @link http://status.net/
*/
if (!defined('STATUSNET')) {
// This check helps protect against security problems;
// your code file can't be executed directly from the web.
exit(1);
}
/**
* An adapter to show polls in a nicer way
*
* @category Poll
* @package StatusNet
* @author Evan Prodromou <evan@status.net>
* @copyright 2011 StatusNet, Inc.
* @license http://www.fsf.org/licensing/licenses/agpl-3.0.html AGPL 3.0
* @link http://status.net/
*/
class PollListItem extends NoticeListItemAdapter
{
// @fixme which domain should we use for these namespaces?
const POLL_OBJECT = 'http://activityschema.org/object/poll';
const POLL_RESPONSE_OBJECT = 'http://activityschema.org/object/poll-response';
function showNotice(Notice $notice, $out)
{
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 unexpected object type.
throw new Exception(sprintf(_m('Unexpected type for poll plugin: %s.'), $notice->object_type));
}
}
function showNoticePoll(Notice $notice, $out)
{
$user = common_current_user();
// @hack we want regular rendering, then just add stuff after that
$nli = new NoticeListItem($notice, $out);
$nli->showNotice();
$out->elementStart('div', array('class' => 'e-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);
}
$form->show();
}
} else {
// TRANS: Error text displayed if no poll data could be found.
$out->text(_m('Poll data is missing'));
}
$out->elementEnd('div');
// @fixme
$out->elementStart('div', array('class' => 'e-content'));
}
function showNoticePollResponse(Notice $notice, $out)
{
$user = common_current_user();
// @hack we want regular rendering, then just add stuff after that
$nli = new NoticeListItem($notice, $out);
$nli->showNotice();
// @fixme
$out->elementStart('div', array('class' => 'e-content'));
}
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment